JPDA の拡張機能 |
JDK のバージョン 5.0 ファミリでは、次の JPDA の機能が追加されています。
- JVMTI の追加
- JPDA での汎用のサポート
- JPDA での enum のサポート
- JPDA での vararg のサポート
- JPDA のプラグイン可能な接続およびトランスポート
- JDWP によりサーバの address パラメータでマシンの指定が可能
- JDI の読み取り専用サブセット
- クラッシュした JVM からコアファイルを生成または分析するためのツール
- LinsteningConnector.accept() との接続に関するタイムアウトまたはテストの方法の追加
JVMTI の追加Java Virtual Machine Tool Interface (JVMTI) は、JVMPI と JVMDI に代わる、開発ツールおよび監視ツール用の新しいネイティブプログラミングインタフェースです。JVMTI は、Java 仮想マシン (VM) で動作するアプリケーションの状態検査と実行制御の両方の機能を提供し、プロファイリングツール、デバッグツール、監視ツール、スレッド分析ツール、カバレージ分析ツールなど、VM の状態その他にアクセスする必要がある各種ツールの VM インタフェースとして機能します。
注: JVMPI と JVMDI は、J2SE の次のメジャーリリースで削除される予定です。
JPDA での汎用のサポート汎用は、JavaTM プログラミング言語の新機能です。JPDA インタフェースでは、デバッガから汎用情報にアクセスできるようになりました。この変更により、JPDA の JDWP および JDI コンポーネントにインタフェース要素が追加されます。これらの要素を使うと、.class ファイルの Signature 属性の実際の内容を含む文字列として、JDI クライアントから汎用情報にアクセスできます。
JDWP の変更点
以下に示すのは、JDWP の新しいコマンドです。これらは既存のコマンドと似ていますが、すでに存在するコマンドの場合は、JNI シグニチャーのほかに汎用シグニチャーを返します。
- AllClassesWithGeneric: AllClasses と似ているが、各クラスの汎用シグニチャーも返す
- SignatureWithGeneric: ReferenceType.Signature コマンドと似ているが、汎用シグニチャーも返す
- FieldsWithGeneric: Fields コマンドと似ているが、各フィールドの汎用シグニチャーも返す
- MethodsWithGeneric: Methods コマンドと似ているが、各メソッドの汎用シグニチャーも返す
- VariableTableWithGeneric: VariableTable コマンドと似ているが、各変数の新しい汎用シグニチャー値も含む
JDI の変更点
新しいメソッド:
- LocalVariable.genericSignature()
- ReferenceType.genericSignature()
- TypeComponent.genericSignature()
- Method.isBridge()
JPDA での enum (列挙) のサポート列挙型は、JavaTM プログラミング言語の新機能です。JPDA インタフェースでは、デバッガから列挙型に関する情報にアクセスできるようになりました。
新しいメソッド:
- com.sun.jdi.ClassType.isEnum()
- com.sun.jdi.Field.isEnumConstant()
JPDA での Vararg (可変引数) のサポート引数の可変数を受け取るメソッドを宣言する機能は、JavaTM プログラミング言語の新機能です。JDI では、デバッガからメソッドが引数の可変数を受け取るかどうかを問い合わせることができるようになりました。また、この変更により、3 つの JDI メソッドが修正され、varargs を受け取るためにメソッドを呼び出すことができます。
com.sun.jdi.Method の新しいメソッド:
- boolean isVarargs();
次のメソッドの仕様更新:
- com.sun.jdi.Method.argumentTypes()
- com.sun.jdi.Method.argumentTypes()
- com.sun.jdi.ClassType.invokeMethod
- com.sun.jdi.ClassType.newInstance
- com.sun.jdi.ObjectReference.invokeMethod
JPDA のプラグイン可能な接続およびトランスポート以前の Java Debug Interface (JDI) には、ツールベンダが独自のコネクタを開発および配置できるプロバイダインタフェースがありませんでした。コネクタは、Java デバッガがターゲット仮想マシンへの接続に使用する手段です。
JDK は 6 つのコネクタとともに出荷されています。これらのうちの 2 つは、ターゲット VM とのデバッグセッションの起動および確立に使用される LaunchingConnectors です。ほかの 4 つは、リモートデバッグのためにトランスポートをカプセル化するコネクタです。これまで、これらの 6 つのコネクタの作成は VirtualMachineManager の Sun JDI 実装にハードコード化されており、ツールベンダが別のコネクタを開発および配置する手段はありませんでした。
これに関連して、これまでの Java Platform Debugger Architecture (JPDA) には、ツールベンダが独自のトランスポート実装をプラグインするための手段がありませんでした。Sun 以外が提供するトランスポートを介してデバッグする方法はサポートされていませんでした。JDK は、TCP トランスポート (Solaris、Linux、および Windows 用) と共用メモリトランスポート (Windows のみ) の 2 つのトランスポートとともに出荷されています。この拡張機能には、次の 2 つの構成要素があります。
- 仕様およびプロバイダインタフェースによる Java Debug Interface (JDI) の拡張。これにより、サードパーティのコネクタやトランスポートサービスの開発および配置が可能
- VM/debuggee 側ネイティブインタフェースの開発。これにより、VM で実行されているデバッグエージェントでサードパーティのトランスポートライブラリの配置およびロードが可能
次の 5 つのクラス/インタフェースの仕様が更新されました。
- com.sun.jdi.Bootstrap
- com.sun.jdi.VirtualMachineManager
- com.sun.jdi.connect.AttachingConnector
- com.sun.jdi.connect.ListeningConnector
- com.sun.jdi.connect.Transport
com.sun.jdi.VirtualMachineManager に次の 2 つのメソッドが新しく追加されました。
- VirtualMachine createVirtualMachine(Connection connection, Process process) throws IOException
- VirtualMachine createVirtualMachine(Connection connection) throws IOException;
4 つの新規クラス:
- com.sun.jdi.connect.spi.TransportService
- com.sun.jdi.connect.spi.TransportService.Capabilities (内部クラス)
- com.sun.jdi.connect.spi.TransportService.ListenKey (内部クラス)
- com.sun.jdi.connect.spi.Connection
2 つの新規例外:
- com.sun.jdi.connect.TransportTimeoutException
- com.sun.jdi.connect.spi.ClosedConnectionException
ネイティブトランスポートインタフェース (jdwpTransport.h による定義)
新しいコネクタ引数が次のように追加されました。
「timeout」コネクタ引数が、次のコネクタに追加されました (これらは、クラス名ではなくコネクタ名)。
- com.sun.jdi.SocketAttach
- com.sun.jdi.SocketListen
- com.sun.jdi.SharedMemoryAttach
- com.sun.jdi.SharedMemoryListen
オプションのタイムアウト引数は、debuggee との接続を確立するときに使用する接続タイムアウトまたは受け入れタイムアウト (ミリ秒単位) を指定します。
「localAddress」コネクタ引数が com.sun.jdi.SocketListen に追加されました。このコネクタ引数は、debugee からの接続の受け入れを待機するときにバインドするローカルアドレスも指定します。また、JDWP エージェントに対するオプション文字列は、タイムアウトオプションを含めるように修正されました。タイムアウト引数は、デバッガとの接続を確立するときのタイムアウト (ミリ秒単位) を次のように指定します。
-Xdebug -Xrunjdwp:...,...,timeout=<timeout>
さらに、dt_socket トランスポートのアドレス文字列は、サーバモードでの実行時にローカルアドレスをとるように修正されました。次に例を示します。
-Xrunjdwp:transport=dt_socket,address=127.0.0.1:4000,server=yこれは、debugee がループバックアドレス、ポート 4000 にバインドし、デバッガの接続を待機することを示しています。
JDWP によりサーバの address パラメータでマシンの指定が可能JPDA オプションには 「address=」パラメータが含まれます。これは次の形式で指定します。
JPDA サーバ: address=port
JPDA クライアント: address=machine:port
この変更により、JPDA サーバが複数のネットワークカードおよびアドレスを持つコンピュータ上で実行されている場合に、サーバがマシン名を受け入れることができます。SunCommandLineLauncher (Bootstrap.virtualMachineManager().defaultConnector() によって返されるデフォルトの LaunchingConnector) で localAddress コネクタ引数を使用して、ローカルアドレスを指定できるようになりました。また、debugee 側の JDWP オプション文字列で、ポートのほかにローカルアドレスが受け入れられるようになりました。
JDI の読み取り専用サブセット変更不可能な「debuggee」をデバッグするために JDI を使用する場合 (debuggee がコアファイルによって示される場合など)、JDI クライアントは呼び出し可能な JDI メソッドと呼び出し不可能な JDI メソッドを認識できる必要があります。この変更により、VirtualMachine インタフェースにメソッドが追加され、JDI クライアントでその VM が読み取り専用かどうかを判別できるようになりました。また、読み取り専用 VM が呼び出された場合に新しい例外をスローするさまざまな JDI メソッドを定義できます。
com.sun.jdi.VirtualMachine の新しいメソッド:
- boolean canBeModified()
新しい例外クラス:
- com.sun.jdi.VMCannotBeModified
「{@throws VMCannotBeModifiedException} VirtualMachine が読み取り専用の場合 - {@link VirtualMachine#canBeModified()} を参照」の節が、次のメソッドの仕様に追加されました。
com.sun.jdi.ArrayReference
- void setValue(int index, Value value)
- void setValues(List values)
- void setValues(int index, List values, int srcIndex, int length)
com.sun.jdi.ArrayType
- ArrayReference newInstance(int length);
com.sun.jdi.ClassType
- void setValue(Field field, Value value)
- Value invokeMethod(ThreadReference thread, Method method, List arguments, int options)
- ObjectReference newInstance(ThreadReference thread, Method method, List arguments, int options)
com.sun.jdi.ObjectReference
- ArrayReference newInstance(int length);
com.sun.jdi.ClassType
- void setValue(Field field, Value value)
- Value invokeMethod(ThreadReference thread, Method method, List arguments, int options)
- ObjectReference newInstance(ThreadReference thread, Method method, List arguments, int options)
com.sun.jdi.ObjectReference
- void setValue(Field field, Value value)
- Value invokeMethod(ThreadReference thread, Method method,
- List arguments, int options)
com.sun.jdi.StackFrame
- void setValue(LocalVariable variable, Value value)
com.sun.jdi.ThreadGroupReference
- void suspend();
- void resume();
com.sun.jdi.ThreadReference
- void suspend();
- void resume();
- void stop(ObjectReference throwable);
- void interrupt();
- void popFrames(StackFrame frame)
com.sun.jdi.VirtualMachine
- void redefineClasses(Map classToBytes);
- void suspend();
- void resume();
- EventQueue eventQueue();
- EventRequestManager eventRequestManager();
- void exit(int exitCode);
クラッシュした JVM からコアファイルを生成または分析するためのツールJVM がクラッシュした場合、開発者はコアファイルを調べ、クラッシュが発生したときに実行されていたコードを確認できる必要があります。JDI (Java Debug Interface) は、「コネクタ」のインタフェースを定義します。コネクタは、これらのインタフェースの実装です。コネクタは、デバッガプロセスと debuggee 間の接続を確立するために使用されます。J2SE はいくつかのコネクタとともに出荷されています。これらのコネクタでは、デバッガプロセスによる debuggee の起動、すでに実行されている debuggee への接続、まだ実行されていない debuggee からの着信接続の待機が可能です。これらのコネクタは、JDI 仕様の一部ではありませんが、プラットフォーム上の JDI の実装の一部です。ほかのベンダは、選択したコネクタを自由に組み込むことができます。また、ユーザ自身が独自のコネクタを作成できます。
この機能により、3 つの新しいコネクタが Sun の実装に追加されました。各コネクタには、JDI ユーザがコネクタを使用するために設定する引数のセットがあります。
これらの 3 つの新しいコネクタのクラス名を、以下のインタフェースの概要で示します。このソリューションでは、libproc.h の Solaris 非公開インタフェースが使用されます。
これにより、次の 3 つの新しい接続コネクタが J2SE のリリースに追加されます。
- sun.jvm.hotspot.jdi.SACoreAttachingConnector
- sun.jvm.hotspot.jdi.SAPIDAttachingConnector
- sun.jvm.hotspot.jdi.SADebugServerAttachingConnector
これらのコネクタは、次の JDI メソッドによって JDI クライアントに返されるコネクタのリストに含まれます。
- VirtualMachineManager.allConnectors()
- VirtualMachineManager.attachingConnectors()
これらのコネクタは、ほかの JDI 接続コネクタと同様に JDI クライアントによって使用されます。
これらのコネクタの attach() メソッドによって返される JDI VirtualMachine オブジェクトは、読み取り専用です。つまり、VirtualMachine.canBeModified() は false を返します。また、VirtualMachine が読み取り専用の場合に VMCannotBeModifiedException をスローするように JDI で定義されているメソッドは、JDI クライアントによって呼び出されません。これらのコネクタは、Sun Hotspot Virtual Machine を使用するプロセスとコアファイルのデバッグのみに使用されます。これらのコネクタは Windows および Linux Itanium 上では使用できません。
LinsteningConnector.accept() との接続に関するタイムアウトまたはテストの方法の追加これまでのメソッド com.sun.jdi.connect.ListeningConnector.attach() は、接続を無制限に待機し、タイムアウトを設定する方法や待機を中断する方法がありませんでした。統合されたデバッガで使用する場合、これは非常に危険でした。この変更により、タイムアウトの設定、接続の即時テスト、別のスレッドの割り込みが可能になりました。
Copyright © 2004 Sun Microsystems, Inc.All Rights Reserved. コメントの送付先: java-debugger@sun.com |
|