Java

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

目次

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


トランスポート

JPDA トランスポートは、デバッガアプリケーションのプロセスおよびデバッグ中の仮想マシン (「ターゲット VM」と呼ばれる) によって使用されるプロセス間通信の形式です。 JDI および JDWP によって、トランスポートの存在が認識され、各トランスポートが一意の名称で参照されます。 ただし、JDI および JDWP の仕様では、特定のトランスポートの実装が存在している必要はありません。 トランスポートを実装することによって、単一のコンピュータまたは別のコンピュータ、あるいはその両方で動作中のプロセス間で通信できるようになります。

デバッガアプリケーションとターゲット VM の間に接続が確立される際には、一方がサーバとして動作し、接続を待機します。 その後、もう一方がリスナーに接続され、接続が確立されます。 JPDA のトランスポートでは、デバッガアプリケーションまたはターゲット VM のどちらかをサーバとして動作させることができます。 接続が確立されている間は、「トランスポートアドレス」によって相互の接続が識別されます。 トランスポートアドレスは文字列です。その形式は、トランスポートの実装に依存します。

Win 32 プラットフォーム上の JPDA リファレンス実装では、 共用メモリトランスポートおよびソケットトランスポートの 2 つのトランスポートが提供されます。 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 コマンド行起動コネクタの引数
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 を起動する際の詳細は、コネクタによって制御されます。 このコネクタで使用される背後のトランスポートは、プラットフォームに依存しています。 Win32 の場合は、共用メモリトランスポートが使用されます。 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 必須 "" 接続先のホストマシン上のポート番号

共用メモリ接続コネクタ

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

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

共用メモリ接続コネクタの引数
name 必須 デフォルト値 description
name 必須 "" ターゲット VM が待機中の共用メモリのトランスポートアドレス

ソケット待機コネクタ

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

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

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

ソケット待機コネクタの引数
name 必須 デフォルト値 description
port 必須 "" 接続を待機するポート番号

共用メモリ待機コネクタ

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

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

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

共用メモリ待機コネクタの引数
name 必須 デフォルト値 description
name 必須 "" ターゲット VM の接続を待機する共用メモリのトランスポートアドレス

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

ここでは、デバッグ時に Sun VM を呼び出すときに必要なオプションについて説明します。 デバッガアプリケーションで JDI の Sun コマンド行起動コネクタを使用する場合は、適切なオプションが自動的に設定されます。 そのコネクタを使用せず、手動で VM を呼び出すときは、これらのオプションを設定する必要があります。

Classic VM で必要なオプション

Classic VM 環境で動作するアプリケーションをデバッグするには、次の VM 呼び出しオプションが必要です。
-Xdebug
デバッグを有効にする
-Xnoagent
古い sun.tools.debug エージェントを無効にする。 JPDA では、異なる方法で「エージェント」が接続される。以降の説明を参照
-Djava.compiler=NONE
JIT コンパイラを無効にする。 Classic VM を使用してデバッグする場合は、JIT コンパイラを無効にする必要がある
-Xrunjdwp:<サブオプション>
JDWP の JPDA リファレンス実装をロードする。 このライブラリは、ターゲット VM に配置されており、ターゲット VM と対話するときは JVMDI および JNI が使用される。 別のデバッガアプリケーションと通信するときは、トランスポートと JDWP プロトコルが使用される。 各サブオプションについては、後述する説明を参照


Hotspot Performance Engine がインストールされている場合は、Classic VM を選択するために -classic が必要です。

Hotspot Performance Engine に必要なオプション

Hotspot Performance Engine を使用する場合は、すでに説明した -Xdebug オプションおよび -Xrunjdwp オプションが必要です。 -Xnoagent オプションおよび -Djava.compiler=NONE オプションは必要ありません。ただし、互換性を維持するためにこれらのオプションも受け入れられますが、無視されます。

-Xrunjdwp のサブオプション

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

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

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

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

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

address server=n の場合は、必須。
server=y の場合は、オプション
"" 接続用のトランスポートアドレス。 server=n の場合は、このアドレスのデバッガアプリケーションに対して接続する。 server=y の場合は、このアドレスで接続を待機する
launch オプション none JDWP の初期化が完了したときに、この文字列に指定されたプロセスを起動する。 このオプションは、「Just-In-Time デバッグ」を行うときに、onthrow または onuncaught、あるいはその両方のオプションと組み合わせて使用する。「Just-In-Time デバッグ」では、この VM で特定のイベントが発生したときにデバッガプロセスが起動する

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

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

  • transport サブオプションの値
  • address サブオプションの値。指定されない場合は、生成されたアドレス
onthrow オプション none 特定のクラスの例外がこの VM にスローされるまで、JDWP ライブラリの初期化を遅延する。 例外クラス名は、パッケージで修飾されていなければならない。JDWP が初期化されたときに接続が確立されるため、この例外がスローされるまで接続は確立されない
onuncaught オプション "n" 「y」の場合は、uncaught 例外がこの VM にスローされるまで、JDWP ライブラリの初期化を遅延する。 JDWP が初期化されたときに接続が確立されるため、この例外がスローされるまで接続は確立されない。 uncaught 例外の定義については、JDI 仕様の com.sun.jdi.ExceptionEvent を参照
stdalloc オプション "n" JDWP リファレンス実装では、メモリを割り当てるときに代替アロケータがデフォルトで使用される。 「y」の場合は、標準の C 実行時ライブラリアロケータが使用される。 このオプションは、主にテスト用なので、注意して使用する必要がある。 代替アロケータが無効な場合は、この VM 内でデッドロックが発生することがある
strict オプション "n" 「y」の場合は、JVMDI に完全に準拠していることを前提とする。 このため、JVMDI 実装の既知のバグに対する回避策がすべて無効になる。 このオプションは、主にテスト用なので、注意して使用する必要がある
suspend オプション "y" 「y」の場合、VMStartEvent は中断ポリシーが SUSPEND_ALL になる。 「n」の場合、VMStartEvent の中断ポリシーは SUSPEND_NONE になる

-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

上のように入力すると、ソケット接続コネクタを使用して簡単にターゲット 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 デバッガでは、任意のコネクタを使用できることがわかります。また、よく使われるコネクタを使用するための簡単なインタフェースも提供されています。


Copyright © 2001 Sun Microsystems, Inc. All Rights Reserved.

コメントの送付先: java-debugger@java.sun.com

Sun