JDKのバージョン5.0ファミリには、次のJPDA拡張機能が含まれています。
Java Virtual Machine Tool Interface (JVMTI)は、開発ツールやモニタリング・ツールで使用される新しいネイティブ・プログラミング・インタフェースです。JVMPIとJVMDIは、このインタフェースで置き換えられます。Java仮想マシン(VM)で動作するアプリケーションの状態検査と実行制御の両方の機能を提供します。JVMTIは、プロファイリング・ツール、デバッグ・ツール、モニタリング・ツール、スレッド分析ツール、カバレッジ分析ツールなど、VMの状態にアクセスする必要がある各種ツールのVMインタフェースとして機能します。
注: JVMPIとJVMDIは、Java SEの次のメジャー・リリースで削除される予定です。
ジェネリックは、Javaプログラミング言語の新機能です。これにより、JPDAインタフェースでデバッガがジェネリック情報にアクセスできるようになりました。この変更によって、JPDAのJDWPおよびJDIコンポーネントにインタフェース要素が追加されます。これらの要素を使用すると、JDIクライアントが.classファイルからSignature属性の実際の内容を含む文字列として、ジェネリック情報にアクセスできます。
JDWPの変更点
JDWPに次の新しいコマンドが追加されました。これらは既存のコマンドと似ていますが、JNIシグネチャに加えてジェネリック・シグネチャも返します(存在する場合)。
JDIの変更点
新しいメソッド:
列挙型は、Javaプログラミング言語の新機能です。これにより、JPDAインタフェースでデバッガが列挙型に関する情報にアクセスできるようになりました。
新しいメソッド:
可変数の引数を受け入れるとしてメソッドを宣言する機能は、Javaプログラミング言語の新機能です。JDIでは、デバッガがメソッドで可変数の引数が受け入れられるかどうかを問い合わせることができるようになりました。この変更では、メソッドを呼び出すことができる3つのJDIメソッドも可変引数を受け入れるように変更されています。
com.sun.jdi.Methodの新しいメソッド:
次のメソッドの仕様が更新されました。
以前のJava Debug Interface (JDI)には、ツールのベンダーが独自のコネクタを開発および配備できるプロバイダ・インタフェースがありませんでした。コネクタは、Javaデバッガがターゲット仮想マシンに接続するための手段です。
JDKには6つのコネクタが付属しています。そのうちの2つは起動コネクタで、ターゲットVMとのデバッグ・セッションを起動および確立する際に使用されます。その他の4つのコネクタは、リモート・デバッグ用のトランスポートをカプセル化します。以前は、これらの6つのコネクタの作成がVirtualMachineManagerのOracle JDI実装にハードコーディングされていたため、ツールのベンダーが追加のコネクタを開発または配備する手段がありませんでした。
上記と関連して、以前のJava Platform Debugger Architecture (JPDA)には、ツール・ベンダーが独自のトランスポート実装を組み込む手段がありませんでした。Oracle以外で提供されたトランスポートをデバッグする方法もサポートされていませんでした。JDKには、TCPトランスポート(Solaris、Linux、Windows用)と共有メモリー・トランスポート(Windows専用)の2つのトランスポートが付属しています。
この拡張は、次の2つのコンポーネントに行われます。
次の5つの既存のクラス/インタフェースの仕様が更新されました。
次の2つの新しいメソッドがcom.sun.jdi.VirtualMachineManagerに追加されました。
4つの新しいクラス:
2つの新しい例外:
ネイティブ・トランスポート・インタフェース(jdwpTransport.hで定義)
新しいコネクタ引数が次のように追加されました。
次のコネクタに「timeout」コネクタ引数が追加されました(クラス名ではなく、コネクタ名であることに注意してください)。
タイムアウト引数はオプションで、デバッグ対象への接続を確立する際に使用される接続または許可のタイムアウト(ミリ秒)を指定します。
com.sun.jdi.SocketListenに「localAddress」コネクタ引数が追加されました。このコネクタ引数は、デバッグ対象からの接続を許可するまでの待機中にバインドするローカル・アドレスを指定します。
また、JDWPエージェントへのオプション文字列もタイムアウト・オプションが含まれるように修正されました。タイムアウト引数は、デバッガへの接続を確立する際のタイムアウト(ミリ秒)を指定します。
-agentlib:jdwp=...,...,timeout=<timeout>
さらに、dt_socketトランスポートのアドレス文字列も、サーバー・モードでの実行中にローカル・アドレスが取得されるように修正されました。例:
-agentlib:jdwp=transport=dt_socket,address=127.0.0.1:4000,server=y
は、デバッグ対象がループバック・アドレス、ポート4000にバインドし、デバッガが接続するまで待機することを示します。
JPDAオプションの1つである「address=」パラメータの形式は、次のとおりです。
JPDA Server: address=port
JPDA Client: address=machine:port
この変更によって、JPDAサーバーが複数のネットワーク・カードとアドレスを持つコンピュータ上で実行されている場合に、サーバーがマシン名を受け入れることができます。ローカル・アドレスを指定できるように、Bootstrap.virtualMachineManager().defaultConnector()で返されるデフォルトの起動コネクタであるSunCommandLineLauncherに、localAddressコネクタ引数が追加されました。また、デバッグ対象側のJDWPオプション文字列が、ポートに加えてローカル・アドレスも受け入れることができるようになりました。
JDIを使用して変更不可能な「デバッグ対象」をデバッグする場合(デバッグ対象がコアファイルで表される場合など)、JDIクライアントは呼び出すことができるJDIメソッドと呼び出すことができないJDIメソッドを区別する必要があります。この変更によって、JDIクライアントがそのVMが読取り専用であるかどうかを判断できるメソッドがVirtualMachineインタフェースに追加されました。また、読取り専用VM上で呼び出された場合に新しい例外をスローするように、様々なJDIメソッドも定義されています。
com.sun.jdi.VirtualMachineの新しいメソッド:
新しい例外クラス:
仮想マシンが読取り専用の場合、次のメソッドの仕様に@throws VMCannotBeModifiedException節が追加されました({@link VirtualMachine#canBeModified()}を参照)。
com.sun.jdi.ArrayReference
com.sun.jdi.ArrayType
com.sun.jdi.ClassType
com.sun.jdi.ObjectReference
com.sun.jdi.ClassType
com.sun.jdi.ObjectReference
com.sun.jdi.StackFrame
com.sun.jdi.ThreadGroupReference
com.sun.jdi.ThreadReference
com.sun.jdi.VirtualMachine
JVMがクラッシュしたときに、開発者はコア・ファイルを調査し、クラッシュの発生時にどのコードが実行されていたのかを理解できることを望んでいます。JDI (Java Debug Interface)では、「コネクタ」用のインタフェースが定義されます。コネクタは、これらのインタフェースのいずれかの実装です。コネクタは、デバッガ・プロセスとデバッグ対象間の接続を確立する際に使用されます。Java SEには、いくつかのコネクタが付属しており、これらを使用すれば、デバッガ・プロセスがデバッグ対象を起動したり、すでに実行されているデバッグ対象に接続したり、まだ実行されていないデバッグ対象からの着信接続を待機したりできます。これらのコネクタは、JDIの仕様には含まれていませんが、プラットフォーム上のJDI実装には含まれています。他のベンダーは、任意に選択したコネクタを自由に追加できます。さらに、ユーザー自身も独自のコネクタを作成できます。
この機能によって、Oracle実装に3つの新しいコネクタが追加されます。各コネクタには、JDIユーザーがコネクタを使用するために設定できる引数や設定する必要のある引数のセットが含まれています。
次のインタフェースのサマリーには、新しい3つのコネクタのクラス名を一覧表示します。この解決法では、libproc.hでSolarisのプライベート・インタフェースが使用されます。
これにより、このJava SEリリースに3つの新しい接続コネクタが追加されます。
これらのコネクタは、次のJDIメソッドによってJDIクライアントに返されるコネクタのリストに含まれます。
これらのコネクタは、その他のJDI接続コネクタが使用されるときと同じ方法で、JDIクライアントで使用されます。
これらのコネクタのattach()メソッドによって返されるJDI VirtualMachineオブジェクトは、「読取り専用」です。つまり、VirtualMachine.canBeModified()ではfalseが返されます。言い換えると、VirtualMachineが読取り専用の場合にVMCannotBeModifiedExceptionをスローするようにJDIで定義されたメソッドは、JDIクライアントによって呼び出されるべきではありません。これらのコネクタは、Oracle Hotspot仮想マシンを使用するプロセスやコアファイルをデバッグする際にのみ使用できます。これらのコネクタは、WindowsまたはLinux Itaniumでは使用できません。
以前のcom.sun.jdi.connect.ListeningConnector.attach()メソッドには、タイムアウトを設定する方法や待機を中断する方法がなく、接続を無期限に待機していました。そのため、統合されたデバッガで使用することは大変危険でした。この変更によって、タイムアウトの設定、接続の即時テスト、または別のスレッドの中断が可能になりました。