構成の概要
Java Platform Debugger Architectureの構成は次のとおりです。
Components Debugger Interfaces / |--------------| / | VM | debuggee ----( |--------------| <------- JVM TI - Java VM Tool Interface \ | back-end | \ |--------------| / | comm channel -( | <--------------- JDWP - Java Debug Wire Protocol \ | |--------------| | front-end | |--------------| <------- JDI - Java Debug Interface | UI | |--------------|
Java Platform Debugger Architecture (JPDA)とは何か
JPDAは、複数のプラットフォーム、仮想マシン(VM)実装、およびJDKバージョン間で高い移植性を持つデバッガ・アプリケーションを、ツール開発者が容易に作成できるようにする多層デバッグ・アーキテクチャです。
JPDAは、次の3つの階層で構成されます。
- JVM TI - Java VM Tool Interface
- VMが提供するデバッグ・サービスを定義します。
- JDWP - Java Debug Wire Protocol
- debuggeeとデバッガ・プロセスの間の通信を定義します。
- JDI - Java Debug Interface
- 高レベルのJava言語インタフェースを定義します。これを使用することにより、ツール開発者は、リモート・デバッガ・アプリケーションを容易に記述できます。
リファレンス実装
これらのインタフェースの仕様に加え、Oracleはリファレンス実装も提供します。リファレンス実装は、次のようなコンポーネントで構成されます。
- 複数のVM上でのJVM TI実装(VMのドキュメントを参照)。
- JVM TIを使用してJDWPのdebuggee側を実装するバックエンド。
- JDWPのデバッガ側を使用してJDIを実装するフロントエンド。
- JDI上に構築された2つの簡単なサンプル・デバッガ・アプリケーション。
結果として、任意の層を置換可能な多層実装が提供されます。
JPDAの使用
デバッガ開発者は、任意の層でJPDAにアクセスできます。 JDIはもっとも高レベルかつ使いやすいインタフェースであるため、JDIを使用することを開発者の皆さんにお薦めします。 企業がJDIを使ってデバッガを開発する場合を考えてみましょう。 これらは、リファレンス実装とともに使用でき、またVMおよびOracleがサポートするプラットフォームで自動的に機能します。 さらに、たとえば、リファレンス実装のフロントエンドと、JDWPを実装する他社のVM (JVM TIを使用しても省略してもよい)で動作しているdebuggeeでも機能します。
デバッガの中には、より低い層であるJDWP (フロントエンドがJavaで記述されていない場合)やJVM TI (低レベルの機能を必要とする特殊なデバッガの場合)の上に構築されるものもあります。
コンポーネント
debuggee
debuggeeは、デバッグされているプロセスです。デバッグされているアプリケーション(示されていません)、そのアプリケーションが動作しているVM、およびデバッガのバックエンドで構成されます。
Java仮想マシン(VM)
デバッグしているアプリケーションが動作しているVMです。
このデバッガのアーキテクチャは、さまざまなVM実装で使用できるように設計されています。
VMはJava Virtual Machineツール・インタフェース(JVM TI)を実装します。
バックエンド
デバッガのバックエンドは、デバッガのフロントエンドからの要求をdebuggee VMに通信したり、これらの要求への応答(必要なイベントを含む)をフロントエンドに通信したりする役割を果たします。 バックエンドは、Java Debug Wire Protocol (JDWP)を使用して、通信チャネル経由でフロントエンドと通信します。 バックエンドは、Java Virtual Machine Tool Interface (JVM TI)を使用してデバッグ対象VMと通信します。
Javaで記述されたデバッガ・サポート・コードをdebuggee上で実行した場合、debuggeeとの競合が発生し、ハング・アップおよびその他の予期しない動作をする可能性があります。 このため、バックエンドはネイティブ・コードで記述されています。 JVM TIは純粋なネイティブ・インタフェースになっています。
通信チャネル
通信チャネルは、デバッガのフロント・エンドとバックエンドの間のリンクです。 これは、次の2つのメカニズムで構成されていると考えることができます。
コネクタ。 コネクタは、フロント・エンドとバックエンド間で接続を確立する手段として使用されるJDIオブジェクトです。
JPDAでは、次の3つのコネクタが定義されています。
- 待機コネクタ: フロントエンドが、バックエンドからの着信接続を待機する
- 接続コネクタ: フロントエンドが、すでに実行中のバックエンドに接続する。
- 起動コネクタ: フロントエンドが、debuggeeコードおよびバックエンドを実行するJavaプロセスを実際に起動する。
トランスポート。 トランスポートとは、フロントエンドとバックエンドの間でビットを移動するために使用される、基盤となるメカニズムのことです。
使用されるトランスポート・メカニズムは指定されていませんが、ソケット、シリアル回線、および共用メモリーが含まれる可能性があります。 ただし、チャネルを介して転送される直列化ビット・ストリームの形式およびセマンティックスは、Java Debug Wire Protocol (JDWP)に指定されています。
JPDAに含まれているサービス・プロバイダ・インタフェースを使うと、コネクタやトランスポートの実装を開発および配置できます。 これらのサービス・プロバイダ・インタフェースにより、デバッガや他のツール・ベンダーで新しいコネクタ実装を開発し、Oracleが提供するソケットおよび共用メモリー・トランスポートを超える別のトランスポート・メカニズムを提供できます。 JDIのサービス・プロバイダ・インタフェースは、 com.sun.jdi.connect.spiパッケージで指定されます。
JDIのサービス・プロバイダ・インタフェースに加え、JPDAでは、Java Debug Wire Protocol Transport Interfaceと呼ばれるトランスポート・ライブラリ・インタフェースも定義されています。 トランスポート・ライブラリは、ターゲットVMのJDWPエージェントによってロードされ、デバッガとの接続の確立、およびデバッガとVM間のJDWPパケットのトランスポートに使用されます。
これらのSPIの使用の詳細は、「Java Platform Debugger Architecture - サービス・プロバイダ・インタフェース」を参照してください。
フロントエンド
デバッガのフロントエンドには、高レベルのJava Debug Interface (JDI)が実装されています。 このフロントエンドでは、低レベルのJava Debug Wire Protocol (JDWP)の情報が使用されます。
ユーザー・インタフェース(UI)
デバッガのユーザー・インタフェースは指定されていません。ツール・ベンダーから、使いやすい実装が提供される予定です。 ただし、簡単なグラフィカル・ユーザー・インタフェース(GUI)の例は提供されています。このGUI例を、テスト・ツール、またはより高度なGUIを開発するためのひな形として使用できます。 JDBバージョンも、例として使用できます。
これらのUIの例は、Java Debug Interface (JDI)のクライアントになっています。
デバッガ・インタフェース
Java Virtual Machine Tool Interface (JVM TI)
VMによって実装されるネイティブ・インタフェースです。
デバッグのためにVMから提供する必要のあるサービスを定義します。 情報(現在のスタック・フレームなど)の要求、アクション(ブレークポイントの設定など)、および通知(ブレークポイントに到達したときなど)が含まれます。 デバッガでは、これ以外のVM情報(Java Native Interface (JNI)など)も使用されますが、これがすべてのデバッガ固有情報のソースになります。
VMインタフェースを指定すると、VM実装側からデバッグ・アーキテクチャに簡単にプラグインすることができます。 また、代替通信チャネルを実装することもできます。 このインタフェースに準拠しないVM実装を使用した場合でも、Java Debug Wire Protocol (JDWP)を介してアクセスできます。
関連項目:
Java Debug Wire Protocol (JDWP)
debuggeeプロセスとデバッガのフロントエンドとの間で転送される情報と要求の形式を定義します。 ただし、トランスポート・メカニズム(ソケット、シリアル回線、共用メモリーなど)は定義しません。
このプロトコルの仕様によって、debuggeeとデバッガのフロントエンドを、異なるVM実装または異なるプラットフォーム(その両方が異なってもかまわない)で実行できるようになります。 さらに、Java以外の言語で記述されたフロントエンド、またはネイティブ以外のdebuggee (Javaなど)も使用できるようになります。
情報および要求は、多くの場合、Java Virtual Machine Debug Interface (JVM TI)層のものです。しかし、帯域幅の問題が発生した場合には、必要な情報および要求が追加されることがあります。たとえば、情報のフィルタ処理やバッチ処理などです。
関連項目:
Javaデバッグ・インタフェース(JDI)
フロントエンドによって実装される100% Pure Javaインタフェースです。
ユーザー・コード・レベルでの情報および要求を定義します。
デバッガの実装者は、Java Debug Wire Protocol (JDWP)またはJava Virtual Machine Tool Interface (JVM TI)を直接使用できますが、このインタフェースは開発環境へのデバッグ機能の統合を容易にします。 すべてのデバッガ開発でJDI層を使用することをお薦めします。
関連項目: