接続および呼び出しの詳細                         

目次

トランスポート
コネクタ
Sun VM の呼び出しオプション
Plug-in アプレットのデバッグ
JDB との接続
サービスプロバイダインタフェース

トランスポート

JPDA トランスポートとは、デバッガと、デバッグされている仮想マシン (以下、「ターゲット VM」) の間の通信方法のことです。通信は接続指向です。一方がサーバーとして動作し、接続を待機します。他方がクライアントとして動作し、サーバーに接続します。JPDA では、デバッガアプリケーションまたはターゲット VM のどちらかをサーバーとして動作させることができます。トランスポートを実装することによって、単一のコンピュータまたは別のコンピュータ、あるいはその両方で動作中のプロセス間で通信できるようになります。接続を確立する場合は、接続のエンドポイントを識別するためにトランスポートアドレスが使用されます。トランスポートアドレスの形式は、トランスポートのタイプに依存します。

JPDA 内では、デバッガアプリケーションは Java Debug Interface (JDI) インタフェースとコネクタ抽象を使用してターゲット VM への接続を確立します。デバッガアプリケーションによって使用されるコネクタは、トランスポートをカプセル化します。ターゲット VM では、デバッガとの通信に JavaTM Debug Wire Protocol をサポートするエージェントが使用されます。このエージェント (ターゲット VM に組み込むか、実行時ライブラリからロード可能) は、デバッガと通信するためにトランスポートをカプセル化します。

Sun では、TCP/IP に基づくソケットトランスポートと共用メモリートランスポートの 2 つのトランスポート実装を、リファレンス実装とともに出荷しています。仕様では、特定のトランスポートの実装を必要としません。この実装とともに提供されるトランスポートのほかにも、アーキテクチャーに含まれるサービスプロバイダインタフェースを使用して、別のトランスポートを開発および配備できます。

ソケットトランスポート

ソケットトランスポート JPDA リファレンス実装では、Solaris、Linux、および Microsoft Windows プラットフォーム用のソケットトランスポートが提供されます。ソケットトランスポートを使用する場合は、デバッガアプリケーションとターゲット VM は、同じコンピュータ上に存在していても、異なるコンピュータ上に存在していてもかまいません。ソケットトランスポートでは、デバッガアプリケーションとターゲット VM の間でシングルストリームの TCP/IP 接続が使用されます。ソケットトランスポートの JDI 側では、IPv4 と IPv6 の両方がサポートされます。ターゲット VM 側の現在の実装では IPv4 のみがサポートされていますが、将来のリリースでは、IPv4 と IPv6 の両方がサポートされるように変更される可能性があります。

コマンドと応答パケットは、JDWP トランスポートインタフェースを使用して、JDWP 仕様に従ってストリームに書き込まれます。JDWP を介して多数の小さなパケットを送信できるため、TCP_NO_DELAY ソケットオプションにより、小さなパケットが送信される前にソケット実装によってバッファーされる場合に発生する可能性のある遅延を回避することによって、一部のソケット実装でパフォーマンスを向上させることができます。可能な場合は未送信のデータが送信されるように、ソケットは適切に閉じられます。

ソケットトランスポートは、dt_socket という一意の文字列で識別されます。この名前は、ターゲット VM を呼び出すときに、ソケットトランスポートを選択するために使用できます。デバッガアプリケーションでは、対応するコネクタによってソケットトランスポートがカプセル化されます。

クライアントがサーバーに接続しているコンテキストでは、ソケットトランスポートアドレスの形式は、「<name>:<port>」になります。<name> はホスト名です。また、<port> は接続または待機しているソケットポート番号です。サーバーがクライアントの接続を待機しているコンテキストでは、アドレスはポート番号だけで構成されます (ホスト名は明示されません)。

共用メモリートランスポート

Microsoft Windows プラットフォーム上の JPDA リファレンス実装では、ソケットトランスポート以外に、共用メモリートランスポートが提供されます。共用メモリートランスポートでは、デバッガアプリケーションとターゲット VM の間の JDWP パケット交換に共用メモリー領域が使用されます。共用メモリートランスポートを使用する場合は、デバッガアプリケーションとターゲット VM は同じコンピュータ上に存在しなければなりません。

共用メモリートランスポートは、dt_shmem という一意の文字列で識別されます。この名前は、ターゲット VM を呼び出すときに、ソケットトランスポートを選択するために使用できます。デバッガアプリケーションでは、対応するコネクタによって共用メモリートランスポートがカプセル化されます。

共用メモリーのトランスポートアドレスは、Microsoft Windows のファイルマッピングオブジェクトの名前として使用できます。この名前の文字列には、バックスラッシュを除く任意の文字を含めることができます。

コネクタ

コネクタとは、デバッガアプリケーション (JDI を対象にして作成されたもの) とターゲット VM の間の接続を確立するときに使用される JDI の抽象化のことです。JDI およびコネクタはさまざまな組み合わせで実装できるため、各 JDI でサポートされているトランスポートおよび VM と一致させることができます。コネクタのインタフェースは非常に汎用的なので、JDI はさまざまなコネクタ実装と一緒に使用できます。コネクタは、名前と値の組み合わせとして構成されます。特定のコネクタでは、名前と値のさまざまな組み合わせを受け入れることができます。

実装されるコネクタをユーザーが選択および構成できるように、JDI クライアントアプリケーションを作成することもできますが、特定のコネクタに関する情報をデバッガに組み込んでおくと、ユーザーが使いやすい構成になります。JPDA で提供されている JDB の実装例では、この方法が採用されています。

JDI リファレンス実装では、使用可能なトランスポートの種類および接続モード (起動、待機、および接続) に対応するいくつかのコネクタが提供されています。それらのコネクタについて、このあとのセクションで説明します。これらのコネクタのリストは、JDI メソッド VirtualMachineManager.allConnectors() によって返されます。また、各接続コネクタ、待機コネクタ、および起動コネクタは、対応する VirtualMachineManager メソッド attachingConnectors()、listeningConnectors()、および launchingConnectors() によって返されるリストに含まれます。

Sun コマンド行起動コネクタ

このコネクタは、Sun VM や、デバッグに関して同じ呼び出しオプションをサポートしているその他のすべての VM を起動するときに、デバッガアプリケーションから使用できます。VM の起動および必要なデバッグオプションの指定の詳細は、コネクタによって制御されます。このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。Microsoft Windows の場合は、共用メモリートランスポートが使用されます。Solarisd および Linux の場合は、ソケットトランスポートが使用されます。

このコネクタは、「com.sun.jdi.CommandLineLaunch」という名前で一意に識別されます。
 

Sun コマンド行起動コネクタの引数
name 必須 デフォルト値 description
home いいえ 現在の java.home プロパティー値 ターゲット VM の呼び出しに使用される Java 2 Runtime Environment の場所。
options いいえ "" VM を呼び出すために使用する標準のデバッグオプションを含むオプション。
main はい "" デバッグするアプリケーションのメインクラスおよびコマンド行の引数。
suspend いいえ true メインクラスがロードされる直前にターゲット VM が中断される場合は true、そうでない場合は false。
quote はい "\"" コマンド行上で、空白で区切られたテキストを結合するときに使用する文字。 
vmexec はい java VM 起動用ウィンドウの実行可能ファイル。デバッグ時には、javaw または java_g に変更できる (それらの起動用ウィンドウが使用可能な場合)。

Raw コマンド行起動コネクタ

このコネクタは、任意の VM を起動するときに、デバッガアプリケーションから使用できます。コマンド行全体を指定してください。コマンド行は編集しないでください。指定したコマンド行で VM を起動する際の詳細は、コネクタによって制御されます。このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。Microsoft Windows の場合は、共用メモリートランスポートが使用されます。Solaris オペレーティング環境の場合は、ソケットトランスポートが使用されます。

このコネクタは、「com.sun.jdi.RawCommandLineLaunch」という名前で一意に識別されます。
 

Raw コマンド行起動コネクタの引数
name 必須 デフォルト値 description
command はい "" デバッグするアプリケーションからターゲット VM を呼び出すときに使用するコマンド行全体。
address はい "" 新しく起動されたターゲット VM の接続を待機するトランスポートアドレス。この値は、通常は raw コマンドの引数として使用される。ただし、接続先のトランスポートアドレスを、ターゲット VM で独自に識別できる場合は必須ではない。
quote はい "\"" コマンド行上で、空白で区切られたテキストを結合するときに使用する文字。 

ソケット接続コネクタ

このコネクタは、現在動作中のターゲット VM にソケットトランスポートを介して接続するときに、デバッガアプリケーションから使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。Sun VM の場合、必要なオプションは後述する説明のとおりです。

このコネクタは、「com.sun.jdi.SocketAttach」という名前で一意に識別されます。
 

ソケット接続コネクタの引数
name 必須 デフォルト値 description
hostname いいえ ローカルホスト名 接続先のホストマシン名。
port はい "" 接続先の host マシン上のポート番号。
timeout いいえ "" ターゲット VM への接続時に使用するタイムアウト (ミリ秒単位)。

共用メモリー接続コネクタ

このコネクタは、共用メモリートランスポートを介して現在実行中のターゲット VM に接続するときに、デバッガアプリケーションから使用できます。Microsoft Windows プラットフォーム上でのみ使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。Sun VM の場合、必要なオプションは後述する説明のとおりです。

このコネクタは、「com.sun.jdi.SharedMemoryAttach」という名前で一意に識別されます。
 

共用メモリー接続コネクタの引数
name 必須 デフォルト値 description
name はい "" ターゲット VM が待機中の共用メモリーのトランスポートアドレス
timeout いいえ "" ターゲット VM に接続するときに使用するタイムアウト (ミリ秒単位)

ソケット待機コネクタ

このコネクタは、別個に呼び出されたターゲット VM からの接続をソケットトランスポートを介して受け入れるときに、デバッガアプリケーションから使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。Sun VM の場合、必要なオプションは後述する説明のとおりです。

このコネクタでは、複数のターゲット VM からの接続を受け入れることができます。

このコネクタは、「com.sun.jdi.SocketListen」という名前で一意に識別されます。
 

ソケット待機コネクタの引数
name 必須 デフォルト値 description
port いいえ 一時的なポート番号 (TCP/IP スタックによって割り当てられるポート) 接続を待機するポート番号。
localAddress いいえ ホストに割り当てられるすべてのアドレス ホストに割り当てられる IP アドレス
timeout いいえ "" ターゲット VM の接続を待機する間に使用するタイムアウト (ミリ秒単位)

共用メモリー待機コネクタ

このコネクタは、共用メモリートランスポートを介して個別に呼び出されたターゲット VM からの接続を受け入れるときに、デバッガアプリケーションから使用できます。Microsoft Windows プラットフォーム上でのみ使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。Sun VM の場合、必要なオプションは後述する説明のとおりです。

このコネクタでは、複数のターゲット VM からの接続を受け入れることができます。

このコネクタは、「com.sun.jdi.SharedMemoryListen」という名前で一意に識別されます。
 

共用メモリー待機コネクタの引数
name 必須 デフォルト値 description
name はい "" ターゲット VM の接続を待機する共用メモリーのトランスポートアドレス
timeout いいえ "" ターゲット VM の接続を待機する間に使用するタイムアウト (ミリ秒単位)

プロセス接続コネクタ

このコネクタは、後述の「server=y」デバッグサブオプションで起動された現在実行中のターゲット VM に接続するときに、デバッガアプリケーションから使用できます。このターゲット VM は、Java SE 6 以降である必要があります。

プロセス接続コネクタには、関連付けられたトランスポートはありません。その代わりに、実際に接続されると、トランスポートが動的に決定されます。そのため、このコネクタの transport().name() メソッドは「local」を返します。

このコネクタは、「com.sun.jdi.ProcessAttach」という名前で一意に識別されます。

プロセス接続コネクタの引数
    name 必須 デフォルト値 description
pid はい "" デバッグされるプロセスのプロセス ID。 
timeout いいえ "" ターゲット VM への接続時に使用するタイムアウト (ミリ秒単位)。

SA コア接続コネクタ

このコネクタは、コアファイルをデバッグするときに、デバッガアプリケーションから使用できます。 利用可能なすべてのデバッグ操作を実行できるとはかぎらないため、コアファイルが破損する可能性があります。

このコネクタの attach() メソッドによって返される VirtualMachine オブジェクトは、読み取り専用です。 つまり、メソッドは次のようになります。
            vm.canBeModified()
は false を返し、この場合、JDI クライアントは VMCannotBeModifiedException をスローするように定義されている JDI メソッドを呼び出しません。 デバッガの仮想マシンのワードサイズ (つまり 32 ビットまたは 64 ビット) およびバージョン (5.0、5.1 など) は、コアファイルが生成されたプロセスの仮想マシンと同じである必要があります。
このコネクタでは、同じコアファイルで複数のデバッグセッションが可能です。

このコネクタは、「sun.jvm.hotspot.jdi.SACoreAttachingConnector」という名前で一意に識別されます。

SA コア接続コネクタの引数
name 必須 デフォルト値 description
core
いいえ core デバッグするコアファイルのパス名
javaExecutable
はい
""
コアファイルを生成した Java 実行可能ファイルのパス名。  

SA PID 接続コネクタ

このコネクタは、プロセスをデバッグするときに、デバッガアプリケーションから使用できます。Microsoft Windows プラットフォームおよび Linux Itanium プラットフォームでは使用できません。利用可能なすべてのデバッグ操作を実行できるとはかぎらないため、プロセスが破損する可能性があります。

このコネクタの attach() メソッドによって返される VirtualMachine オブジェクトは、読み取り専用です。 つまり、メソッドは次のようになります。
            vm.canBeModified()
は false を返し、この場合、JDI クライアントは VMCannotBeModifiedException をスローするように定義されている JDI メソッドを呼び出しません。

デバッグされるプロセスが、デバッグモードで (つまり、-agentlib:jdwp or -Xrunjdwp を使用して) 開始されている必要はありません。 プロセスがハングアップしても問題ありません。  デバッガと debuggee のワードサイズ (つまり、32 ビットまたは 64 ビット) やバージョン (5.0、5.1 など) は同じである必要があります。プロセスは、このコネクタの接続時に中断され、分離時に再開されます。1 つのプロセスに複数の SAPIDAttachingConnector を同時に接続することはできません。

このコネクタは、「sun.jvm.hotspot.jdi.SAPIDAttachingConnector」という名前で一意に識別されます。

SA PID 接続コネクタの引数
    name 必須 デフォルト値 description
pid はい "" デバッグされるプロセスのプロセス ID。 

SA デバッグサーバー接続コネクタ

このコネクタは、デバッガを実行中のマシン以外のマシンでプロセスまたはコアファイルをデバッグするときに、デバッガアプリケーションから使用できます。Microsoft Windows プラットフォームおよび Linux Itanium プラットフォームでは使用できません。利用可能なすべてのデバッグ操作を実行できるとはかぎらないため、リモートプロセスまたはコアファイルが破損する可能性があります。

このコネクタの attach() メソッドによって返される VirtualMachine オブジェクトは、読み取り専用です。 つまり、メソッドは次のようになります。
            vm.canBeModified()
は false を返し、この場合、JDI クライアントは VMCannotBeModifiedException をスローするように定義されている JDI メソッドを呼び出しません。

このコネクタは、RMI を使用してリモートマシンを実行する「デバッグサーバー」と通信します。
このコネクタに対して attach() メソッドが呼び出される前に、リモートマシンでデバッグサーバーを起動し、
どのプロセスまたはコアファイルをデバッグするかを通知する必要があります。次の操作をリモートマシンで実行する必要があります。 
        
${JAVA_HOME}/bin/rmiregistry -J-Xbootclasspath/p:${JAVA_HOME}/lib/sa-jdi.jar
${JAVA_HOME}/bin/java \ 
    -classpath ${JAVA_HOME}/lib/sa-jdi.jar \
    sun.jvm.hotspot.jdi.SADebugServer \
    <pid> \
    [uniqueID]

または

${JAVA_HOME}/bin/java \
    -classpath ${JAVA_HOME}/lib/sa-jdi.jar \
    sun.jvm.hotspot.jdi.SADebugServer \
    <pathname to the java executable that produced the core file>\
    <pathname of the corefile to debug> \
     [uniqueID]

上記の 2 つの手順の代わりに、jsadebugd コマンドを使用して、リモートマシンで RMI レジストリとデバッグサーバーを起動する方法もあります。

「uniqueID」はオプションの文字列です。同じマシンで複数のデバッグサーバーを同時に実行する場合は、各サーバーに異なる「uniqueID」文字列を指定する必要があります。

上の例の JAVA_HOME には、デバッグ対象で使用されるバージョンと同じビットサイズ (つまり 32 ビットまたは 64 ビット) および同じバージョン (5.0、5.1 など) の Java インストールのパス名が含まれていなければなりません。ただし、デバッガのビットサイズとバージョンは同じである必要はありません。

デバッグされるプロセスが、デバッグモードで (つまり、-agentlib:jdwp または -Xrunjdwp を使用して) 開始されている必要はありません。 プロセスがハングアップしても問題ありません。プロセスは、デバッグサーバーの接続時に中断されます。プロセスに接続されているデバッグサーバーを (^C またはほかの方法で) 終了すると、デバッグ対象プロセスは再開されます。コアファイルに複数のデバッグサーバーを接続することはできますが、プロセスに接続できるデバッグサーバーは 1 つだけです。

このコネクタでは、同じデバッグサーバーに複数のデバッグセッションを接続できます。

このコネクタは、「sun.jvm.hotspot.jdi.SADebugServerAttachingConnector」という名前で一意に識別されます。

SA DebugServer 接続コネクタの引数
name 必須 デフォルト値 description
debugServerName はい "" デバッグサーバーが実行されているマシンの IP アドレスまたは名前。このマシンに複数のデバッグサーバーが含まれている場合、この名前は、
   uniqueID@IPAddress
または
   uniqueID@hostname
という形式である必要があります。ここで、「uniqueID」は対応するデバッグサーバーを起動するために使用される文字列です。


Sun VM の呼び出しオプション

このセクションでは、デバッグ時に Sun VM を呼び出すときに必要なオプションについて説明します。

Sun の VM 実装には、デバッグ用の JDWP エージェントをロードするコマンド行オプションが必要です。5.0 以降では、JDWP エージェントをロードしたり、そのオプションを指定したりするために -agentlib:jdwp オプションが使用されます。5.0 より前のリリースでは、-Xdebug および -Xrunjdwp オプションが使用されます (5.0 の実装では、-Xdebug および -Xrunjdwp オプションもサポートされますが、5.0 の JDWP エージェントは、VM に対して以前の JVMDI インタフェースではなく JVM TI インタフェースを使用するため、新しい -agentlib:jdwp オプションの使用をお勧めします)。

デバッガアプリケーションで JDI の Sun コマンド行起動コネクタを使用する場合、5.0 より前のターゲット VM への接続にこのコネクタが使用される可能性があるため、-Xdebug および -Xrunjdwp オプションがコネクタで使用されます。

ターゲット VM が 5.0 以降の場合、-agentlib:jdwp オプションは次のように指定します。

-agentlib:jdwp=<サブオプション>
JDWP の JPDA リファレンス実装をロードする。このライブラリは、ターゲット VM に配置されており、ターゲット VM と対話するときは JVM TI および JNI が使用される。別のデバッガアプリケーションと通信するときは、トランスポートと JDWP プロトコルが使用される。各サブオプションについては、後述する説明を参照してください。

5.0 より前のリリースの場合、-Xdebug および -Xrunjdwp オプションが使用されます。

-Xdebug
デバッグを有効にする
-Xrunjdwp:<サブオプション>
JDWP の JPDA リファレンス実装をロードする。このライブラリは、ターゲット VM に配置されており、ターゲット VM と対話するときは JVMDI および JNI が使用される。別のデバッガアプリケーションと通信するときは、トランスポートと JDWP プロトコルが使用される。各サブオプションについては、後述する説明を参照してください。

-agentlib:jdwp および -Xrunjdwp サブオプション

-agentlib:jdwp および -Xrunjdwp オプションは、サブオプションを指定することによって詳細に設定できます。サブオプションは、次の形式で指定します。

    -agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...

または

    -Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...

使用できるオプションについて、次の表で説明します。
 

-Xrunjdwp のサブオプション
name 必須 デフォルト値 description
help いいえ なし 簡単なヘルプメッセージを出力して VM を終了する。
transport はい なし デバッガアプリケーションに接続するときに使用するトランスポートの名前。
サーバー いいえ "n" 「y」の場合は、デバッガアプリケーションへの接続を待機する。そうでない場合は、指定されたアドレスのデバッガアプリケーションに接続する。

「y」が指定されているときにアドレスが指定されていない場合は、デバッガアプリケーションを待機するトランスポートアドレスを選択し、標準出力ストリームにそのアドレスを出力する。

address server=n
の場合は、はい。それ以外の場合は、いいえ
"" 接続用のトランスポートアドレス。server=n の場合は、このアドレスのデバッガアプリケーションに対して接続する。server=y の場合は、このアドレスで接続を待機する。
timeout いいえ "" server=y の場合は、デバッガからの接続を待機するときに使用するタイムアウト (ミリ秒単位) を指定する。server=n の場合は、デバッガへの接続時に使用するタイムアウト (ミリ秒単位) を指定する。一部のトランスポート実装では、タイムアウトオプションが無視される場合がある。
launch いいえ なし JDWP の初期化が完了したときに、この文字列に指定されたプロセスを起動する。このオプションは、「Just-In-Time デバッグ」を行うときに、onthrow または onuncaught、あるいはその両方のオプションと組み合わせて使用する。「Just-In-Time デバッグ」では、この VM で特定のイベントが発生したときにデバッガプロセスが起動する。

起動されるプロセスは、自身のウィンドウでは起動されない。ほとんどの場合、起動されるプロセスは小さなアプリケーションで、起動後にデバッガアプリケーションが自身のウィンドウで起動される。

この引数に指定した文字列には、空白で区切られた次の文字列が追加される。これらの文字列は、起動されたデバッガがこの VM との接続を確立するために使われる。こうして生成された文字列が実行される。

  • transport サブオプションの値。
  • address サブオプションの値 (指定されていない場合は、生成されたアドレス)
onthrow いいえ なし 特定のクラスの例外がこの VM にスローされるまで、JDWP ライブラリの初期化を遅延する。例外クラス名は、パッケージで修飾されていなければならない。JDWP が初期化されたときに接続が確立されるため、この例外がスローされるまで接続は確立されない。
onuncaught いいえ "n" 「y」の場合は、uncaught 例外がこの VM にスローされるまで、JDWP ライブラリの初期化を遅延する。JDWP が初期化されたときに接続が確立されるため、この例外がスローされるまで接続は確立されない。uncaught 例外の定義については、JDI 仕様の com.sun.jdi.ExceptionEvent を参照。
suspend いいえ "y" 「y」の場合、VMStartEvent は中断ポリシーが SUSPEND_ALL になる。「n」の場合、VMStartEvent の中断ポリシーは SUSPEND_NONE になる。

-agentlib:jdwp=transport=dt_socket,server=y,address=8000
ポート 8000 上でソケット接続を待機する。メインクラスがロードされる前にこの VM を中断する (デフォルトでは suspend=y)。デバッガアプリケーションが接続されたあと、そのアプリケーションが JDWP コマンドを送信して VM を再開する。

-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
ループバックアドレス上のポート 8000 でのみソケット接続を待機する。デバッガが 5 秒以内に接続しない場合は終了する。メインクラスがロードされる前にこの VM を中断する (デフォルトでは suspend=y)。デバッガアプリケーションが接続されたあと、そのアプリケーションが JDWP コマンドを送信して VM を再開する。

-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
使用可能な共用メモリートランスポートのアドレスを選択して、標準出力に出力する。そのアドレスで共用メモリー接続を待機する。デバッガアプリケーションが接続される前に、VM は実行を開始する。

-agentlib:jdwp=transport=dt_socket,address=myhost:8000
実行中のデバッガアプリケーションに対して、ホスト myhost のポート 8000 にソケットを介して接続する。メインクラスがロードされる前に、この VM を中断する。

-agentlib:jdwp=transport=dt_shmem,address=mysharedmemory
トランスポートアドレス「mysharedmemory」の共用メモリーを介して、実行中のデバッガアプリケーションに接続する。メインクラスがロードされる前に、この VM を中断する。

-agentlib:jdwp=transport=dt_socket,server=y,address=8000,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
java.io.IOException のインスタンスがこの VM でスローされるのを待機する。この VM を中断する (デフォルトでは suspend=y)。ポート 8000 でソケット接続を待機する。「/usr/local/bin/debugstub dt_socket myhost:8000」を実行する。このプログラムによって、別のウィンドウでデバッガプロセスが起動されてこの VM に接続され、デバッグが開始される。

-agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
uncaught 例外がこの VM でスローされるのを待機する。VM を中断する。共用メモリートランスポートのアドレスを選択し、そのアドレスで接続を待機する。「d:\bin\debugstub.exe dt_shmem <address>」を実行する。<address> は、選択された共用メモリーアドレス。このプログラムによって、別のウィンドウでデバッガプロセスが起動されてこの VM に接続され、デバッグが開始される。

Plug-in アプレットのデバッグ

バージョン 1.2.2 の Java Plug-in から、Plug-in 環境で動作するアプレットをデバッグできるようになりました。前述した必要な VM オプションは、Java Plug-in コントロールパネルの「基本」タブの下にある「Java 実行環境オプション」で指定できます。「詳細」タブの下にあるデバッグオプションは、従来の sun.tools.debug デバッグサポート用なので、使用しないでください。今後のバージョンの Plug-in では、これらのデバッグオプションは、JPDA を使用するように変更される予定です。

JDI の起動コネクタは、Plug-in アプレットのデバッグには使用できません。

JDB との接続

JPDA に付属している JDB の実装例は、JDI コネクタの使用法を示すものになっています。JDB には、「ショートカット」オプションがあります。このオプションでは、JDB に認識されているコネクタ (リファレンス実装に存在するコネクタ) が使用されることが前提です。また、任意のコネクタを使用して一般的な接続を確立することもできます。JDB は最良のデバッガインタフェースの例ではありませんが、コネクタの簡単な使用例として参照できます。

JDB では、-attach オプションを指定すると、リファレンス実装の接続コネクタ (Microsoft Windows 上では共用メモリー、Solaris および Linux プラットフォーム上ではソケット) にアクセスできます。-listen オプションを指定すると、リファレンス実装の待機コネクタ (Microsoft Windows 上では共用メモリー、Solaris および Linux プラットフォーム上ではソケット) にアクセスできます。コマンド行にクラス名と引数を直接指定すると、Sun コマンド行起動コネクタにアクセスできます。

たとえば、

jdb -attach myhost:8000

上のように入力すると、ソケット接続コネクタを使用して簡単にターゲット VM に接続できます (Solaris オペレーティング環境の場合)。

jdb Hello 1 2 3

上のように入力すると、Sun コマンド行起動コネクタを使用して簡単にターゲット VM を起動できます。

ただし、JDB には -connect オプションも用意されています。これにより、コネクタ名と、名前と値の引数ペアの任意のセットを指定することによって任意のコネクタを処理できます。たとえば、上記の 2 つのコマンド行は、次のコマンド行と同じことです。

jdb -connect com.sun.jdi.SocketAttach:hostname=myhost,port=8000
jdb -connect "com.sun.jdi.CommandLineLaunch:main=Hello 1 2 3"

これらのコマンド行は、最初の例よりも複雑ですが、-connect オプションを指定すれば任意のコネクタを使用できます。これらの操作から、JDI デバッガでは、任意のコネクタを使用できることがわかります。また、よく使われるコネクタを使用するための簡単なインタフェースも提供されています。


サービスプロバイダインタフェース

JPDA に含まれているサービスプロバイダインタフェースを使うと、コネクタやトランスポートの実装を開発および配置できます。これらのサービスプロバイダインタフェースにより、デバッガやほかのツールベンダーで新しいコネクタ実装を開発し、Sun が提供するソケットおよび共用メモリートランスポートを超える別のトランスポートメカニズムを提供できます。JDI のサービスプロバイダインタフェースは、com.sun.jdi.connect.spi パッケージで指定されます。

JDI のサービスプロバイダインタフェースに加え、Sun の実装には、Java TMDebug Wire Protocol Transport Interface と呼ばれるトランスポートライブラリインタフェースも含まれています。トランスポートライブラリは、ターゲット VM の JDWP エージェントによってロードされ、デバッガとの接続の確立、およびデバッガと VM 間の JDWP パケットのトランスポートに使用されます。

サービスプロバイダインタフェースに関する詳細は、「JavaTM Platform Debugger Architecture - サービスプロバイダインタフェース」のドキュメントを参照してください。


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.