トランスポート
コネクタ
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リファレンス実装では、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()によって返されるリストに含まれます。
このコネクタは、Oracle VMや、デバッグに関して同じ呼び出しオプションをサポートしているその他のすべてのVMを起動するときに、デバッガ・アプリケーションから使用できます。 VMの起動および必要なデバッグ・オプションの指定の詳細は、コネクタによって制御されます。 このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。 Microsoft Windowsの場合は、共用メモリー・トランスポートが使用されます。 SolarisおよびLinuxの場合は、ソケット・トランスポートが使用されます。
このコネクタは、com.sun.jdi.CommandLineLaunchという名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
home | いいえ | 現在のjava.homeプロパティ値 | ターゲットVMの呼出しに使用されるJava Runtime Environment (JRE)の場所。 |
options | いいえ | "" | VMを呼び出すために使用する標準のデバッグ・オプションを含むオプション。 |
main | はい | "" | デバッグするアプリケーションのメイン・クラスおよびコマンド行の引数。 |
suspend | いいえ | true | メイン・クラスがロードされる直前にターゲットVMが中断される場合はtrue、そうでない場合はfalse。 |
quote | はい | """ | コマンド行上で、空白で区切られたテキストを結合するときに使用する文字。 |
vmexec | はい | java | VM起動用ウィンドウの実行可能ファイル。 デバッグ時には、javawまたはjava_gに変更できる(それらの起動用ウィンドウが使用可能な場合)。 |
このコネクタは、任意のVMを起動するときに、デバッガ・アプリケーションから使用できます。 コマンド行全体を指定してください。コマンド行は編集しないでください。 指定したコマンド行でVMを起動する際の詳細は、コネクタによって制御されます。 このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。 Microsoft Windowsの場合は、共用メモリー・トランスポートが使用されます。 Solarisオペレーティング環境の場合は、ソケット・トランスポートが使用されます。
このコネクタは、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 | いいえ | ローカル・ホスト名 | 接続先のホスト・マシン名。 |
port | はい | "" | 接続先のhostマシン上のポート番号。 |
timeout | いいえ | "" | ターゲットVMへの接続時に使用するタイム・アウト(ミリ秒単位)。 |
このコネクタは、共用メモリー・トランスポートを介して現在実行中のターゲットVMに接続するときに、デバッガ・アプリケーションから使用できます。 Microsoft Windowsプラットフォーム上でのみ使用できます。 このターゲットVMは、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。 Oracle VMの場合、必要なオプションについてはOracle VMの呼出しオプションで説明されています。
このコネクタは、com.sun.jdi.SharedMemoryAttachという名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
name | はい | "" | ターゲットVMがリスンしている共有メモリー「移送アドレス」。 |
timeout | いいえ | "" | ターゲットVMに接続するときに使用するタイム・アウト(ミリ秒単位) |
このコネクタは、別個に呼び出されたターゲットVMからの接続をソケット・トランスポートを介して受け入れるときに、デバッガ・アプリケーションから使用できます。 このターゲットVMは、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。 Oracle VMの場合、必要なオプションについてはOracle VMの呼出しオプションで説明されています。
このコネクタでは、複数のターゲットVMからの接続を受け入れることができます。
このコネクタは、com.sun.jdi.SocketListenという名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
port | いいえ | 一時的なポート番号(TCP/IPスタックによって割り当てられるポート) | 接続を待機するポート番号。 |
localAddress | いいえ | ホストに割り当てられるすべてのアドレス | ホストに割り当てられるIPアドレス |
timeout | いいえ | "" | ターゲットVMの接続を待機する間に使用するタイム・アウト(ミリ秒単位) |
このコネクタは、共用メモリー・トランスポートを介して個別に呼び出されたターゲットVMからの接続を受け入れるときに、デバッガ・アプリケーションから使用できます。 Microsoft Windowsプラットフォーム上でのみ使用できます。 このターゲットVMは、次の表で説明するこのコネクタの引数と対応するオプションで呼び出されたものである必要があります。 Oracle VMの場合、必要なオプションについてはOracle VMの呼出しオプションで説明されています。
このコネクタでは、複数のターゲットVMからの接続を受け入れることができます。
このコネクタは、com.sun.jdi.SharedMemoryListenという名前で一意に識別されます。
name | 必須? | デフォルト値 | description |
---|---|---|---|
name | はい | "" | ターゲットVMの接続を待機する共用メモリーのトランスポート・アドレス。 |
timeout | いいえ | "" | ターゲットVMの接続を待機する間に使用するタイム・アウト(ミリ秒単位) |
プロセス接続コネクタの引数
name | 必須? | デフォルト値 | description |
---|---|---|---|
pid | はい | "" | デバッグされるプロセスのプロセスID。 |
timeout | いいえ | "" | ターゲットVMへの接続時に使用するタイム・アウト(ミリ秒単位)。 |
vm.canBeModified()この場合、VMCannotBeModifiedExceptionをスローするように定義されたJDIメソッドをJDIクライアントが呼び出さないようにする必要があります。 デバッガの仮想マシンのワード・サイズ(つまり32ビットまたは64ビット)およびバージョン(5.0、5.1など)は、コア・ファイルが生成されたプロセスの仮想マシンと同じである必要があります。
name | 必須? | デフォルト値 | description |
---|---|---|---|
core | いいえ | core | デバッグするコア・ファイルのパス名 |
javaExecutable | はい | "" | コア・ファイルを生成したJava実行可能ファイルのパス名。 |
vm.canBeModified()この場合、VMCannotBeModifiedExceptionをスローするように定義されたJDIメソッドをJDIクライアントが呼び出さないようにする必要があります。
SA PID接続コネクタの引数
name | 必須? | デフォルト値 | description |
---|---|---|---|
pid | はい | "" | デバッグされるプロセスのプロセスID。 |
vm.canBeModified()
この場合、VMCannotBeModifiedExceptionをスローするように定義されたJDIメソッドを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]
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 or uniqueID@hostname'uniqueID'は、対応するデバッグ・サーバーの起動に使用される文字列です。 |
このセクションでは、デバッグ時にOracle VMを呼び出すときに必要なオプションについて説明します。
OracleのVM実装には、デバッグ用のJDWPエージェントをロードするコマンド行オプションが必要です。 JDWPエージェントをロードしたり、そのオプションを指定したりするために-agentlib:jdwp
オプションが使用されます。
-agentlib:jdwp
オプションは、次のように指定されます。
-agentlib:jdwpおよび -Xrunjdwpオプションは、サブオプションを指定することによって詳細に設定できます。 サブオプションは、次の形式で指定します。
-agentlib:jdwp=<name1>[=<value1>],<name2>[=<value2>]...
or
-Xrunjdwp:<name1>[=<value1>],<name2>[=<value2>]...
次の表では、使用可能なオプションについて説明します。
name | 必須? | デフォルト値 | description |
---|---|---|---|
help | いいえ | なし | 簡単なヘルプ・メッセージを出力してVMを終了する。 |
transport | はい | なし | デバッガ・アプリケーションに接続するときに使用するトランスポートの名前。 |
server | いいえ | "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との接続を確立するために使われる。 こうして生成された文字列が実行される。
|
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
-agentlib:jdwp=transport=dt_socket,server=y,address=localhost:8000,timeout=5000
-agentlib:jdwp=transport=dt_shmem,server=y,suspend=n
-agentlib:jdwp=transport=dt_socket,address=myhost:8000
-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
/usr/local/bin/debugstub dt_socket myhost:8000
を実行する。このプログラムによって、別のウィンドウでデバッガ・プロセスが起動されてこのVMに接続され、デバッグが開始される。
-agentlib:jdwp=transport=dt_shmem,server=y,onuncaught=y,launch=d:\bin\debugstub.exe
d:\bin\debugstub.exe dt_shmem <address>
を実行する。<address>
は、選択された共用メモリー・アドレス。 このプログラムによって、別のウィンドウでデバッガ・プロセスが起動されてこのVMに接続され、デバッグが開始される。
Java Plug-in環境で動作するアプレットをデバッグできます。 前述した必要なVMオプションは、Java Plug-inコントロール・パネルの基本タブの下にあるJava実行環境オプションで指定できます。 詳細タブの下にあるデバッグ・オプションは、従来のsun.tools.debug
デバッグ・サポート用なので、使用しないでください。 今後のバージョンのJava Plug-inでは、これらのデバッグ・オプションは、JPDAを使用するように変更される予定です。
JDIの起動コネクタは、Plug-inアプレットのデバッグには使用できません。
JPDAに付属しているJDBの実装例は、JDIコネクタの使用法を示すものになっています。 JDBには、ショートカットオプションがあります。このオプションでは、JDBに認識されているコネクタ(リファレンス実装に存在するコネクタ)が使用されることが前提です。 また、任意のコネクタを使用して一般的な接続を確立することもできます。 JDBは最良のデバッガ・インタフェースの例ではありませんが、コネクタの簡単な使用例として参照できます。
JDBでは、-attachオプションを指定すると、リファレンス実装の接続コネクタ(Microsoft Windows上では共用メモリー、SolarisおよびLinuxプラットフォーム上ではソケット)にアクセスできます。 -listenオプションを指定すると、リファレンス実装の待機コネクタ(Microsoft Windows上では共用メモリー、SolarisおよびLinuxプラットフォーム上ではソケット)にアクセスできます。 コマンド行にクラス名と引数を直接指定すると、コマンド行起動コネクタにアクセスできます。
たとえば、
jdb -attach myhost:8000
上のように入力すると、ソケット接続コネクタを使用して簡単にターゲットVMに接続できます(Solarisオペレーティング環境の場合)。
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 - サービス・プロバイダ・インタフェース」のドキュメントを参照してください。
Copyright © 1993, 2017, Oracle and/or its affiliates. All rights reserved.