接続および呼出しの詳細
目次
トランスポート
コネクタ
Oracle VMの呼出しオプション
Plug-inアプレットのデバッグ
JDBとの接続
サービス・プロバイダ・インタフェース
トランスポート
JPDA トランスポートとは、デバッガと、デバッグされている仮想マシン(以下、「ターゲットVM」)の間の通信方法のことです。 通信は接続指向です。一方がサーバーとして動作し、接続を待機します。 他方がクライアントとして動作し、サーバーに接続します。 JPDAでは、デバッガ・アプリケーションまたはターゲットVMのどちらかをサーバーとして動作させることができます。 トランスポートを実装することによって、単一のコンピュータまたは別のコンピュータ、あるいはその両方で動作中のプロセス間で通信できるようになります。 接続の確立時、「移送アドレス」は接続のエンドポイントを識別するために使用されます。 トランスポート・アドレスの形式は、トランスポートのタイプに依存します。
JPDA内では、デバッガ・アプリケーションはJava Debug Interface (JDI)インタフェースとコネクタ抽象を使用してターゲットVMへの接続を確立します。 デバッガ・アプリケーションによって使用されるコネクタは、トランスポートをカプセル化します。 ターゲットVMでは、デバッガとの通信にJava Debug Wire Protocolをサポートするエージェントが使用されます。 このエージェント(ターゲットVMに組み込むか、実行時ライブラリからロード可能)は、デバッガと通信するためにトランスポートをカプセル化します。
TCP/IPに基づくソケット・トランスポートと共用メモリー・トランスポートの2つのトランスポート実装は、リファレンス実装とともに出荷されます。 仕様では、特定のトランスポートの実装を必要としません。 この実装とともに提供されるトランスポートのほかにも、アーキテクチャに含まれるサービス・プロバイダ・インタフェースを使用して、別のトランスポートを開発および配備できます。
ソケット・トランスポート
JPDAリファレンス実装は、LinuxおよびMicrosoft Windowsプラットフォーム用のソケット・トランスポートを提供します。 ソケット・トランスポートを使用する場合は、デバッガ・アプリケーションとターゲットVMは、同じコンピュータ上に存在していても、異なるコンピュータ上に存在していてもかまいません。 ソケット・トランスポートでは、デバッガ・アプリケーションとターゲットVMの間でシングル・ストリームのTCP/IP接続が使用されます。 IPv4とIPv6の両方が、JDI側およびターゲットのVM側のソケット・トランスポートでサポートされています。
コマンドと応答パケットは、JDWPトランスポート・インタフェースを使用して、JDWP仕様に従ってストリームに書き込まれます。 JDWPを介して多数の小さなパケットを送信できるため、TCP_NO_DELAYソケット・オプションにより、小さなパケットが送信される前にソケット実装によってバッファされる場合に発生する可能性のある遅延を回避することによって、一部のソケット実装でパフォーマンスを向上させることができます。 可能な場合は未送信のデータが送信されるように、ソケットは適切に閉じられます。
ソケット・トランスポートは、dt_socket
という一意の文字列で識別されます。 この名前は、ターゲットVMを呼び出すときに、ソケット・トランスポートを選択するために使用できます。 デバッガ・アプリケーションでは、対応するコネクタによってソケット・トランスポートがカプセル化されます。
ソケット・トランスポート・アドレスの形式は"<host>:<port>
"で、<host>
はホスト名、IPアドレス(大カッコで囲むことができます)および<port>
は、アタッチ先またはリスニングするソケット・ポート番号です。 <host>
が空の場合は、ローカル・ループバック・アドレスが使用されます。 サーバーがクライアントの連結を待機しているコンテキストで<host>
と"*
"が等しい場合、サーバーはすべてのネットワーク・インタフェースでリスニングします。
共用メモリー・トランスポート
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()によって返されるリストに含まれます。
コマンド行起動コネクタ
このコネクタは、Oracle VMや、デバッグに関して同じ呼び出しオプションをサポートしているその他のすべてのVMを起動するときに、デバッガ・アプリケーションから使用できます。 VMの起動および必要なデバッグ・オプションの指定の詳細は、コネクタによって制御されます。 このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。 Microsoft Windowsの場合は、共用メモリー・トランスポートが使用されます。 Linuxでは、ソケット・トランスポートが使用されます。
このコネクタは、「com.sun.jdi.CommandLineLaunch」という名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
home
|
no |
現在のjava.home プロパティ値
|
ターゲットVMの呼出しに使用されるJava Runtime Environment (JRE)の場所。 |
options
|
no | "" | VMを呼び出すために使用する標準のデバッグ・オプションを含むオプション。 |
main
|
はい | "" | デバッグするアプリケーションのメイン・クラスおよびコマンド行の引数。 |
suspend
|
no | true | メイン・クラスがロードされる直前にターゲットVMが中断される場合はtrue、そうでない場合はfalse。 |
quote
|
はい | """ | コマンド行上で、空白で区切られたテキストを結合するときに使用する文字。 |
vmexec
|
はい | java | VM起動用ウィンドウの実行可能ファイル。 デバッグ時には、javawまたはjava_gに変更できる(それらの起動用ウィンドウが使用可能な場合)。 |
Rawコマンド行起動コネクタ
このコネクタは、任意のVMを起動するときに、デバッガ・アプリケーションから使用できます。 コマンド行全体を指定してください。コマンド行は編集しないでください。 指定したコマンド行でVMを起動する際の詳細は、コネクタによって制御されます。 このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。 Microsoft Windowsの場合は、共用メモリー・トランスポートが使用されます。 Linuxでは、ソケット・トランスポートが使用されます。
このコネクタは、「com.sun.jdi.RawCommandLineLaunch」という名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
command
|
はい | "" | デバッグするアプリケーションからターゲットVMを呼び出すときに使用するコマンド行全体。 |
address
|
はい | "" | 新しく起動されたターゲットVMの接続を待機するトランスポート・アドレス。 この値は、通常はrawコマンドの引数として使用される。ただし、接続先のトランスポート・アドレスを、ターゲットVMで独自に識別できる場合は必須ではない。 |
quote
|
はい | """ | コマンド行上で、空白で区切られたテキストを結合するときに使用する文字。 |
ソケット接続コネクタ
このコネクタは、現在動作中のターゲットVMにソケット・トランスポートを介して接続するときに、デバッガ・アプリケーションから使用できます。 このターゲットVMは、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。 Oracle VMの場合、必要なオプションについてはOracle VMの呼出しオプションで説明されています。
このコネクタは、「com.sun.jdi.SocketAttach」という名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
hostname
|
no | ローカル・ホスト名 | 接続先のホスト・マシン名。 |
port
|
はい | "" |
接続先のhost マシン上のポート番号。
|
timeout
|
no | "" | ターゲットVMへの接続時に使用するタイム・アウト(ミリ秒単位)。 |
共用メモリー接続コネクタ
このコネクタは、共用メモリー・トランスポートを介して現在実行中のターゲットVMに接続するときに、デバッガ・アプリケーションから使用できます。 Microsoft Windowsプラットフォーム上でのみ使用できます。 このターゲットVMは、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。 Oracle VMの場合、必要なオプションについては「Oracle VMの呼出しオプション」で説明されています。
このコネクタは、「com.sun.jdi.SharedMemoryAttach」という名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
name
|
はい | "" | ターゲットVMがリスンしている共有メモリー「移送アドレス」。 |
timeout
|
no | "" | ターゲットVMに接続するときに使用するタイム・アウト(ミリ秒単位) |
ソケット待機コネクタ
このコネクタは、別個に呼び出されたターゲットVMからの接続をソケット・トランスポートを介して受け入れるときに、デバッガ・アプリケーションから使用できます。 このターゲットVMは、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。 Oracle VMの場合、必要なオプションについては「Oracle VMの呼出しオプション」で説明されています。
このコネクタでは、複数のターゲットVMからの接続を受け入れることができます。
このコネクタは、「com.sun.jdi.SocketListen」という名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
port
|
no | 一時的なポート番号(TCP/IPスタックによって割り当てられるポート) | 接続をリスニングするポート番号。 |
localAddress
|
no | ホストに割り当てられるすべてのアドレス | ホストに割り当てられるIPアドレス |
timeout
|
no | "" | ターゲットVMの接続を待機する間に使用するタイム・アウト(ミリ秒単位) |
共用メモリー待機コネクタ
このコネクタは、共用メモリー・トランスポートを介して個別に呼び出されたターゲットVMからの接続を受け入れるときに、デバッガ・アプリケーションから使用できます。 Microsoft Windowsプラットフォーム上でのみ使用できます。 このターゲットVMは、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。 Oracle VMの場合、必要なオプションについては「Oracle VMの呼出しオプション」で説明されています。
このコネクタでは、複数のターゲットVMからの接続を受け入れることができます。
このコネクタは、「com.sun.jdi.SharedMemoryListen」という名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
name
|
はい | "" | ターゲットVMの接続を待機する共用メモリーのトランスポート・アドレス。 |
timeout
|
no | "" | ターゲットVMの接続を待機する間に使用するタイム・アウト(ミリ秒単位) |
プロセス接続コネクタ
このコネクタは、「Oracle VMの呼出しオプション」の「server=y」デバッグ・サブオプションで起動された現在実行中のターゲットVMに接続するときに、デバッガ・アプリケーションから使用できます。 このターゲットVMは、Java SE 6以降である必要があります。
プロセス接続コネクタには、関連付けられたトランスポートはありません。 その代わりに、実際に接続されると、トランスポートが動的に決定されます。 そのため、このコネクタのtransport().name()メソッドは「local」を返します。
このコネクタは、「com.sun.jdi.ProcessAttach」という名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
pid
|
はい | "" | デバッグされるプロセスのプロセスID。 |
timeout
|
no | "" | ターゲットVMへの接続時に使用するタイム・アウト(ミリ秒単位)。 |
Oracle VMの呼出しオプション
このセクションでは、デバッグ時にOracle VMを呼び出すときに必要なオプションについて説明します。
OracleのVM実装には、デバッグ用のJDWPエージェントをロードするコマンド行オプションが必要です。 JDWPエージェントをロードしたり、そのオプションを指定したりするために-agentlib:jdwp
オプションが使用されます。
-agentlib:jdwp
オプションは、次のように指定されます。
- -agentlib:jdwp=<sub-options>
- JDWPのJPDAリファレンス実装をロードする。 このライブラリは、ターゲットVMに配置されており、ターゲットVMと対話するときはJVM TIおよびJNIが使用される。 別のデバッガ・アプリケーションと通信するときは、トランスポートとJDWPプロトコルが使用される。 個別のサブオプションについては、「-Xrunjdwpのサブオプション」で説明されています。
-agentlib:jdwpおよび -Xrunjdwpサブオプション
-agentlib:jdwpおよび -Xrunjdwpオプションは、サブオプションを指定することによって詳細に設定できます。 サブオプションは、次の形式で指定します。
-agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...
or
-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
次の表では、使用可能なオプションについて説明します。
name | 必須? | デフォルト値 | description |
---|---|---|---|
help
|
no | 該当なし | 簡単なヘルプ・メッセージを出力してVMを終了する。 |
transport
|
はい | なし | デバッガ・アプリケーションに接続するときに使用するトランスポートの名前。 |
server
|
no | "n" |
「y」の場合は、デバッガ・アプリケーションへの接続を待機する。そうでない場合は、指定された 「y」が指定されているときにアドレスが指定されていない場合は、デバッガ・アプリケーションを待機するトランスポート・アドレスを選択し、標準出力ストリームにそのアドレスを出力する。 |
address
|
server=n の場合は、はい。それ以外の場合は、いいえ
|
"" | 接続用のトランスポート・アドレス。 server=nの場合は、このアドレスのデバッガ・アプリケーションに対して接続する。 server=yの場合は、このアドレスで接続を待機する。 |
timeout
|
no | "" | server=yの場合は、デバッガからの接続を待機するときに使用するタイム・アウト(ミリ秒単位)を指定する。 server=nの場合は、デバッガへの接続時に使用するタイム・アウト(ミリ秒単位)を指定する。 一部のトランスポート実装では、タイムアウト・オプションが無視される場合がある。 |
launch
|
no | なし |
JDWPの初期化が完了したときに、この文字列に指定されたプロセスを起動する。 このオプションは、「Just-In-Timeデバッグ」を行うときに、 起動されるプロセスは、自身のウィンドウでは起動されない。 ほとんどの場合、起動されるプロセスは小さなアプリケーションで、起動後にデバッガ・アプリケーションが自身のウィンドウで起動される。 この引数に指定した文字列には、空白で区切られた次の文字列が追加される。 これらの文字列は、起動されたデバッガがこのVMとの接続を確立するために使われる。 こうして生成された文字列が実行される。
|
onthrow
|
no | なし | 特定のクラスの例外がこのVMにスローされるまで、JDWPライブラリの初期化を遅延する。 例外クラス名はパッケージ修飾されていなければなりません。 JDWPが初期化されたときに接続が確立されるため、この例外がスローされるまで接続は確立されない。 |
onuncaught
|
no | "n" | 「y」の場合は、uncaught例外がこのVMにスローされるまで、JDWPライブラリの初期化を遅延する。 JDWPが初期化されたときに接続が確立されるため、この例外がスローされるまで接続は確立されない。 uncaught例外の定義については、JDI仕様のcom.sun.jdi.ExceptionEventを参照。 |
suspend
|
no | "y" | 「y」の場合、VMStartEventは中断ポリシーがSUSPEND_ALLになる。 「n」の場合、VMStartEventの中断ポリシーはSUSPEND_NONEになる。 |
さらに、dt_socket転送では、次のオプションがサポートされています: |
|||
allow
|
no | "*" |
server=yの場合、指定したアドレス/サブネットからの接続のみを許可します。 値として、"*" (アドレスからの接続を許可)か、または'+'で区切られたアドレスのリストを指定できます。 リストの各エントリは次のように指定できます:
|
例
-agentlib:jdwp=transport=dt_socket,server=y,address=8000
- ループバック・アドレスのみでポート8000のソケット接続をリスニングします。 メイン・クラスがロードされる前にこのVMを中断する(デフォルトではsuspend=y)。 デバッガ・アプリケーションが接続されたあと、そのアプリケーションがJDWPコマンドを送信してVMを再開する。
-agentlib:jdwp=transport=dt_socket,server=y,address=*:8000,allow=192.168.1.0/24+::1,timeout=5000
- すべてのネットワーク・インタフェースでポート8000のソケット接続をリスニングします。 192.168.1.00アドレスからのみデバッガの接続を許可 - IPv6アドレス(::1)による192.168.1.255およびローカル・マシンから。 デバッガが5秒以内に接続しない場合は終了する。 メイン・クラスがロードされる前にこのVMを中断する(デフォルトではsuspend=y)。 デバッガ・アプリケーションが接続されたあと、そのアプリケーションがJDWPコマンドを送信してVMを再開する。
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
- 使用可能な共用メモリー・トランスポートのアドレスを選択して、標準出力に出力する。 そのアドレスで共用メモリー接続を待機する。 デバッガ・アプリケーションが接続される前に、VMは実行を開始する。
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
- ポート8000でホストmyhostのソケットを介して、実行中のデバッガ・アプリケーションにアタッチしてください。 メイン・クラスがロードされる前に、このVMを中断する。
-agentlib:jdwp=transport=dt_shmem,address=mysharedmemory
- トランスポート・アドレス「
mysharedmemory
」の共用メモリーを介して、実行中のデバッガ・アプリケーションに接続する。 メイン・クラスがロードされる前に、このVMを中断する。
-agentlib:jdwp=transport=dt_socket,server=y,address=192.168.1.18:8000,allow=*,onthrow=java.io.IOException,launch=/usr/local/bin/debugstub
- java.io.IOExceptionのインスタンスがこのVMでスローされるのを待機する。 このVMを中断する(デフォルトではsuspend=y)。 ポート8000で、アドレス192.168.1.18でソケット接続をリスニングします。 デバッガが任意のアドレスから接続できるようにします。 「
/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アプレットのデバッグ
Java Plug-in環境で動作するアプレットをデバッグできます。 前述した必要なVMオプションは、Java Plug-inコントロール・パネルの「基本」タブの下にある「Java実行環境オプション」で指定できます。 「詳細」タブの下にあるデバッグ・オプションは、従来のsun.tools.debug
デバッグ・サポート用なので、使用しないでください。 今後のバージョンのJava Plug-inでは、これらのデバッグ・オプションは、JPDAを使用するように変更される予定です。
JDIの起動コネクタは、Plug-inアプレットのデバッグには使用できません。
JDBとの接続
JPDAに付属しているJDBの実装例は、JDIコネクタの使用法を示すものになっています。 JDBには、「ショートカット」オプションがあります。このオプションでは、JDBに認識されているコネクタ(リファレンス実装に存在するコネクタ)が使用されることが前提です。 また、任意のコネクタを使用して一般的な接続を確立することもできます。 JDBは最良のデバッガ・インタフェースの例ではありませんが、コネクタの簡単な使用例として参照できます。
JDBでは、 -attachオプションを使用して、リファレンス実装(Microsoft Windowsの共有メモリー、Linuxプラットフォームのソケット)のいずれかの接続コネクタにアクセスできます。 -listenオプションは、リファレンス実装(Microsoft Windowsの共有メモリー、Linuxプラットフォームのソケット)のいずれかのリスニング・コネクタへのアクセスを提供します。 コマンド行にクラス名と引数を直接指定すると、コマンド行起動コネクタにアクセスできます。
次に例を示します。
jdb -attach myhost:8000
これは、ソケット・アタッチ・コネクタ(Linuxの場合)を使用してターゲットVMに簡単にアタッチする方法です。
jdb Hello 1 2 3
上のように入力すると、コマンド行起動コネクタを使用して簡単にターゲット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に含まれているサービス・プロバイダ・インタフェースを使うと、コネクタやトランスポートの実装を開発および配置できます。 これらのサービス・プロバイダ・インタフェースにより、デバッガや他のツール・ベンダーで新しいコネクタ実装を開発し、Oracleが提供するソケットおよび共用メモリー・トランスポートを超える別のトランスポート・メカニズムを提供できます。 JDIのサービス・プロバイダ・インタフェースは、 com.sun.jdi.connect.spiパッケージで指定されます。
JDIのサービス・プロバイダ・インタフェースに加え、Oracleの実装には、Java Debug Wire Protocol Transport Interfaceと呼ばれるトランスポート・ライブラリ・インタフェースも含まれています。 トランスポート・ライブラリは、ターゲットVMのJDWPエージェントによってロードされ、デバッガとの接続の確立、およびデバッガとVM間のJDWPパケットのトランスポートに使用されます。
サービス・プロバイダ・インタフェースに関する詳細は、「Java Platform Debugger Architecture - サービス・プロバイダ・インタフェース」のドキュメントを参照してください。