|
接続および呼び出しの詳細
|
目次
トランスポート
コネクタ
Sun VM の呼び出しオプション
Plug-in アプレットのデバッグ
JDB との接続
トランスポート
JPDA トランスポートは、デバッガアプリケーションプロセスおよびデバッグ中の Virtual Machine (ターゲット VM と呼ばれる) で使用されるプロセス間通信の形式です。JDI および JDWP によって、トランスポートの存在が認識され、各トランスポートが一意の名称で参照されます。 ただし、JDI および JDWP の仕様では、特定のトランスポートの実装が存在している必要はありません。トランスポートを実装することによって、単一のコンピュータまたは別のコンピュータ、あるいはその両方で動作中のプロセス間で通信できるようになります。
デバッガアプリケーションおよびターゲット VM 間に接続を確立すると、一方がサーバとして動作し、接続を待機します。その後、もう一方がリスナーに接続され、接続が確立されます。JPDA のトランスポートを使用すると、デバッガアプリケーションまたはターゲット VM のいずれかをサーバとして動作させることができます。接続が確立されている間は、 トランスポートアドレスによって相互の接続が識別されます。トランスポートアドレスは文字列です。 形式は、トランスポート実装に依存します。
Win32 上の JPDA リファレンス実装では、共用メモリトランスポートおよびソケットトランスポートが提供されます。Solaris プラットフォーム上の JPDA リファレンス実装では、ソケットトランスポートが提供されます。今後の JPDA リファレンス実装には、追加のトランスポートが含まれる予定です。 また、JPDA の今後の仕様では、追加のトランスポートを実装に組み込むためのインタフェースが提供される予定です。
ソケットトランスポート
Solaris プラットフォーム上および Win32 プラットフォーム上の JPDA リファレンス実装では、ソケットトランスポートが提供されます。ソケットトランスポートでは、標準の TCP/IP ソケットを使用して、デバッガアプリケーションとターゲット VM 間で情報が通信されます。ソケットトランスポートを使用した場合は、デバッガアプリケーションおよびターゲット VM は、異なるコンピュータ上に存在させることもできます。ソケットトランスポートは、dt_socket という一意の文字列で識別されます。この名前を使用して、ターゲット VM を呼び出すときおよび JDI コネクタを選択するときに、ソケットトランスポートを選択することができます。
クライアントがサーバに接続されているコンテキストでは、ソケットトランスポートアドレスの形式は、「<name>:<port>」になります。<name> はホスト名です。 また、<port> は接続または待機しているソケットポート番号です。サーバがクライアントとの接続を待機しているコンテキストでは、アドレスはポート番号だけで構成されます (ホスト名は明示されない)。
共用メモリトランスポート
Win32 プラットフォーム上の JPDA リファレンス実装では、ソケットトランスポート以外に、共用メモリトランスポートが提供されます。共用トランスポートでは、Win32 の共用メモリのプリミティブを使用して、デバッガアプリケーションとターゲット VM 間の情報が通信されます。共用メモリトランスポートを使用する場合は、デバッガアプリケーションおよびターゲット VM は同じコンピュータに存在しなければなりません。共用メモリトランスポートは、dt_shmem という一意の文字列で識別されます。この名前を使用して、ターゲット VM を呼び出すときおよび JDI コネクタを選択するときに、ソケットトランスポートを選択することができます。
共用メモリのトランスポートアドレスは、Win32 のファイルマッピングオブジェクトの名前として使用することができます。この名前の文字列には、バックスラッシュを除く任意の文字を含めることができます。
コネクタ
コネクタは、JDI で記述されたデバッガアプリケーションとターゲット VM 間の接続を確立するときに使用される JDI の抽象化です。JDI およびコネクタはさまざまな組み合わせで実装できるため、各 JDI でサポートされているトランスポートおよび VM と一致させることができます。コネクタのインタフェースは広く普及しているため、JDI はさまざまなコネクタ実装に使用できます。コネクタは、名前と値の組み合わせとして構成されます。一部のコネクタでは、異なる名前と値の組み合わせを受け入れることができます。
実装されているコネクタをユーザが選択および構成できるように、JDI クライアントアプリケーションを作成することもできます。 また、特定のコネクタに関する情報をデバッガに組み込んでおくと、ユーザが使いやすい構成になります。JPDA から提供されている JDB の実装例では、この方法が採用されています。
JDI リファレンス実装では、使用可能なトランスポートの種類および接続モード (起動、待機、および接続) にマップしているいくつかのコネクタが提供されます。これらのコネクタについては、これから説明します。
Sun コマンド行起動コネクタ
このコネクタは、Sun VM、または同じデバッグ呼び出しオプションがサポートされているその他の VM を起動するときに、デバッガアプリケーションから使用できます。VM の起動および必要なデバッグオプションの指定の詳細は、コネクタによって制御されます。このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。Win32 の場合は、共用メモリトランスポートが使用されます。Solaris の場合は、ソケットトランスポートが使用されます。
このコネクタは、「com.sun.jdi.CommandLineLaunch」という名前で一意に識別されます。
Sun コマンド行起動コネクタの引数
| 名前 |
必須 |
既定値 |
解説 |
| 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 を起動する場合は、詳細はコネクタによって制御されます。このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。Win32 の場合は、共用メモリトランスポートが使用されます。Solaris の場合は、ソケットトランスポートが使用されます。
このコネクタは、「com.sun.jdi.RawCommandLineLaunch」という名前で一意に識別されます。
Raw コマンド行起動コネクタの引数
| 名前 |
必須 |
既定値 |
解説 |
| command |
必須 |
"" |
デバッグするアプリケーションからターゲット VM を呼び出すときに使用するコマンド行全体 |
| address |
必須 |
"" |
新しく起動されたターゲット VM の接続を待機するトランスポートアドレス。この値は、通常は raw コマンドの引数として使用される。ただし、接続先のトランスポートアドレスを、ターゲット VM で独自に識別できる場合は必須ではない |
| quote |
必須 |
"\"" |
コマンド行上で、空白で区切られたテキストを結合するときに使用する文字 |
ソケット接続コネクタ
このコネクタは、ソケットトランスポートを介して現在動作中のターゲット VM に接続するときに、デバッガアプリケーションから使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されている必要があります。Sun VM の場合は、必要なオプションは以降の説明のとおりです。
このコネクタは、「com.sun.jdi.SocketAttach」という名前で一意に識別されます。
ソケット接続コネクタの引数
| 名前 |
必須 |
既定値 |
解説 |
| host |
オプション |
ローカルホスト名 |
接続対象のホストマシン名 |
| port |
必須 |
"" |
接続先のホストマシン上のポート番号 |
共用メモリ接続コネクタ
このコネクタは、共用メモリトランスポートを介して現在実行中のターゲット VM に接続するときに、デバッガアプリケーションから使用できます。Win32 プラットフォーム上でのみ使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されている必要があります。Sun VM の場合は、必要なオプションは以降の説明のとおりです。
このコネクタは、「com.sun.jdi.SharedMemoryAttach」という名前で一意に識別されます。
共用メモリ接続コネクタの引数
| 名前 |
必須 |
既定値 |
解説 |
| 名前 |
必須 |
"" |
ターゲット VM が待機中の共用メモリのトランスポートアドレス |
ソケット待機コネクタ
このコネクタは、ソケットトランスポートを介して個別に呼び出されたターゲット VM からの接続を受け入れるときに、デバッガアプリケーションから使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されている必要があります。Sun VM の場合は、必要なオプションは以降の説明のとおりです。
このコネクタでは、複数のターゲット VM からの接続を受け入れることができます。
このコネクタは、「com.sun.jdi.SocketListen」という名前で一意に識別されます。
ソケット待機コネクタの引数
| 名前 |
必須 |
既定値 |
解説 |
| port |
必須 |
"" |
接続を待機するポート番号 |
共用メモリ待機コネクタ
このコネクタは、共用メモリトランスポートを介して個別に呼び出されたターゲット VM からの接続を受け入れるときに、デバッガアプリケーションから使用できます。Win32 プラットフォーム上でのみ使用できます。このターゲット VM は、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されている必要があります。Sun VM の場合は、必要なオプションは以降の説明のとおりです。
このコネクタでは、複数のターゲット VM からの接続を受け入れることができます。
このコネクタは、「com.sun.jdi.SharedMemoryListen」という名前で一意に識別されます。
共用メモリ待機コネクタの引数
| 名前 |
必須 |
既定値 |
解説 |
| 名前 |
必須 |
"" |
ターゲット VM の接続を待機する共用メモリのトランスポートアドレス |
Sun VM の呼び出しオプション
ここでは、デバッグ時に Sun VM を呼び出すときに必要なオプションについて説明します。デバッガアプリケーションで JDI Sun コマンド行起動コネクタを使用している場合は、適切なオプションが設定されます。このコネクタを使用せず、手動で VM を呼び出すときは、これらのオプションを設定する必要があります。
従来の VM で必要なオプション
従来の VM 環境で実行中のアプリケーションをデバッグするには、次の VM 呼び出しオプションが必要です。
- -Xdebug
- デバッグを有効にする
- -Xnoagent
- 古い sun.tools.debug エージェントを無効にする。JPDA では、「エージェント」は異なる方法で接続される。以降の説明を参照
- -Djava.compiler=NONE
- JIT コンパイラを無効にする。従来の VM を使用してデバッグする場合は、JIT コンパイラを無効にする必要がある
- -Xrunjdwp:<サブオプション>
- JDWP の JPDA リファレンス実装をロードする。このライブラリは、ターゲット VM に配置されており、ターゲット VM と対話するときは JVMDI および JNI が使用される。別のデバッガアプリケーションと通信するときは、トランスポートと JDWP プロトコルが使用される。各サブオプションについては、以降の説明を参照
Hotspot Performance Engine がインストールされている場合は、従来の VM を選択するときに -classic が必要です。
Hotspot Performance Engine に必要なオプション
Hotspot Performance Engine を使用する場合は、すでに説明した -Xdebug オプションおよび -Xrunjdwp オプションが必要です。-Xnoagent オプションおよび -Djava.compiler=NONE オプションは必要ありません。ただし、互換性を維持するために受け入れられますが、無視されます。
-Xrunjdwp サブオプション
-Xrunjdwp オプションは、サブオプションを指定することによって詳細に設定できます。サブオプションは、次の形式で指定します。
-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
使用できるオプションについて、次の表で説明します。
-Xrunjdwp のサブオプション
| 名前 |
必須 |
既定値 |
解説 |
| help |
オプション |
N/A |
簡単なヘルプメッセージを表示して VM を終了する |
| transport |
必須 |
なし |
デバッガアプリケーションに接続するときに使用するトランスポートの名前 |
| server |
オプション |
"n" |
「y」の場合は、デバッガアプリケーションの接続を待機する。 それ以外の場合は、指定されたアドレスのデバッガアプリケーションに接続する
「y」が指定されているときにアドレスが指定されていない場合は、デバッガアプリケーションを待機するトランスポートアドレスを選択し、標準出力ストリームにそのアドレスを印刷する |
| address |
server=n の場合は、必須。 server=y の場合は、オプション |
"" |
接続用のトランスポートアドレス。server=n の場合は、このアドレスのデバッガアプリケーションに対して接続する。server=y の場合は、このアドレスで接続を待機する |
| 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 例外の定義については、com.sun.jdi.ExceptionEvent の JDI の仕様を参照 |
| stdalloc |
オプション |
"n" |
JDWP リファレンス実装では、メモリを割り当てるときに代替アロケータがデフォルトで使用される。「y」の場合は、標準の C 実行時ライブラリアロケータが使用される。このオプションは、主にテスト用なので、注意して使用する必要がある。代替アロケータが無効な場合は、この VM 内でデッドロックが発生することがある |
| strict |
オプション |
"n" |
「y」の場合は、JVMDI に完全に準拠していることを前提とする。このため、JVMDI 実装の既知のバグに対する回避策がすべて無効になる。このオプションは、主にテスト用なので、注意して使用する必要がある |
-Xrunjdwp の例
- -Xrunjdwp:transport=dt_socket,server=y,address=8000
- ポート 8000 上でソケット接続を待機する。メインクラスがロードされる前にこの VM を中断する (デフォルトでは suspend=y)。デバッガアプリケーションが接続されたときに、JDWP コマンドを送信して VM を再開する
-
- -Xrunjdwp:transport=dt_shmem,server=y,suspend=n
- 使用可能な共用メモリトランスポートのアドレスを選択して、標準出力に印刷する。そのアドレスで共用メモリ接続を待機する。デバッガアプリケーションが接続される前に、VM は実行を開始する
-
- -Xrunjdwp:transport=dt_socket,address=myhost:8000
- 実行中のデバッガアプリケーションに対して、ホスト myhost のソケットを介してポート 8000 で接続する。メインクラスがロードされる前にこの VM を中断する。
-
- -Xrunjdwp:transport=dt_shmem,address=mysharedmemory
- 実行中のデバッガアプリケーションに対して、共用メモリを介してトランスポートアドレス「mysharedmemory」で接続する。メインクラスがロードされる前にこの VM を中断する
-
- -Xrunjdwp: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 に接続されている別のウィンドウでデバッガプロセスが起動され、デバッグが開始される
-
- -Xrunjdwp: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 オプションを指定すると、リファレンス実装の接続中のコネクタにアクセスすることができます (Win32 上では共用メモリ、Solaris 上ではソケット)。-listen オプションを指定すると、リファレンス実装内で待機中のコネクタにアクセスすることができます (Win32 上では共用メモリ、Solaris 上ではソケット)。コマンド行に直接クラス名および引数を指定すると、Sun コマンド行起動コネクタにアクセスすることができます。
例を示します。
jdb -attach myhost:8000
上記のように入力した場合は、Solaris 上のソケット接続コネクタを使用して、簡単にターゲット VM に接続できます。
jdb Hello 1 2 3
上記のように入力した場合は、Sun コマンド行起動コネクタを使用して、簡単にターゲット VM に接続できます。
また、JDB には、-connect オプションも提供されています。 コネクタ名を指定し、さらに引数として名前と値の任意の組み合わせを指定することによって、任意のコネクタを使用することもできます。たとえば、上記の 2 つのコマンド行は、次のコマンド行と同じです。
jdb -connect com.sun.jdi.SocketAttach:host=myhost,port=8000
jdb -connect "com.sun.jdi.CommandLineLaunch:main=Hello 1 2 3"
これらのコマンド行は、上記の例よりも複雑ですが、-connect オプションを指定して任意のコネクタを使用できます。これらの操作から、JDI デバッガでは任意のコネクタを使用できることがわかります。 また、一般的な既存のコネクタを使用できる簡単なインタフェースも提供されています。