接続および呼出しの詳細

機械翻訳について

接続および呼出しの詳細

目次

トランスポート
コネクタ
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 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の場合は、共用メモリー・トランスポートが使用されます。 Solarisオペレーティング環境の場合は、ソケット・トランスポートが使用されます。

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


Rawコマンド行起動コネクタの引数
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への接続時に使用するタイム・アウト(ミリ秒単位)。

SAコア接続コネクタ

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

このコネクタのattach()メソッドによって返されるVirtualMachineオブジェクトは、読取り専用です。
これは、以下のメソッドを意味します:
     vm.canBeModified()

この場合、VMCannotBeModifiedExceptionをスローするように定義されたJDIメソッドをJDIクライアントが呼び出さないようにする必要があります。 デバッガの仮想マシンのワード・サイズ(つまり32ビットまたは64ビット)およびバージョン(5.0、5.1など)は、コア・ファイルが生成されたプロセスの仮想マシンと同じである必要があります。
このコネクタでは、同じコア・ファイルで複数のデバッグ・セッションが可能です。


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

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

SA PID接続コネクタ

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

このコネクタのattach()メソッドによって返されるVirtualMachineオブジェクトは、読取り専用です。
これは、以下のメソッドを意味します:
     vm.canBeModified()

この場合、VMCannotBeModifiedExceptionをスローするように定義されたJDIメソッドをJDIクライアントが呼び出さないようにする必要があります。

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

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

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


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

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

このコネクタのattach()メソッドによって返されるVirtualMachineオブジェクトは、読取り専用です。
これは、以下のメソッドを意味します:
    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]

or

${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を呼び出すときに必要なオプションについて説明します。

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>]...

次の表では、使用可能なオプションについて説明します。

-Xrunjdwpのサブオプション
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デバッグを行うときに、onthrowまたはonuncaught、あるいはその両方のオプションと組み合わせて使用する。Just-In-Timeデバッグでは、このVMで特定のイベントが発生したときにデバッガ・プロセスが起動する。

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

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

  • transportサブオプションの値。
  • addressサブオプションの値(指定されていない場合は、生成されたアドレス)
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になる。

-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アプレットのデバッグ

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上では共用メモリー、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, 2018, Oracle and/or its affiliates. All rights reserved.