|
JavaTM Platform Debugger Architecture - 解説
|
ホームページ
アーキテクチャの概要
JavaTM Platform Debugger Architecture の構成は次のとおりです。
コンポーネント デバッガインタフェース
/ |--------------|
/ | VM |
debuggee ----( |--------------| <------- JVMDI - Java VM Debug Interface
\ | バックエンド |
\ |--------------|
/ |
通信チャネル -( | <--------------- JDWP - Java Debug Wire Protocol
\ |
|--------------|
|フロントエンド |
|--------------| <------- JDI - Java Debug Interface
| UI |
|--------------|
Java Platform Debugger Architecture (JPDA) とは何か
JPDA は、複数のプラットフォーム、Virtual Machine (VM) 実装、および SDK バージョン間で高い移植性を持つデバッガアプリケーションを、ツール開発者が容易に作成できるようにする多層デバッグアーキテクチャです。
JPDA は、次の 3 つの階層で構成されます。
- JVMDI - Java VM Debug Interface
- VM が提供するデバッグサービスを定義します。
- JDWP - Java Debug Wire Protocol
- debuggee とデバッガのプロセス間で行われる通信を定義します。
- JDI - Java Debug Interface
- 高レベルの Java 言語インタフェースを定義します。これを使用することにより、ツール開発者は、リモートデバッガアプリケーションを容易に記述できます。
リファレンス実装
これらのインタフェースの仕様に加え、Sun Microsystems はリファレンス実装も提供します。リファレンス実装は、以下で構成されます。
- 複数の Sun VM (VM のドキュメントを参照) 上での JVMDI 実装
- JVMDI を使って JDWP の debuggee 側を実装するバックエンド
- JDWP のデバッガ側を使って JDI を実装するフロントエンド
- JDI 上に構築された 2 つの簡単なサンプルデバッガアプリケーション
結果として、任意の層を置換可能な多層実装が提供されます。
JPDA の使用
デバッガ開発者は、任意の層で JPDA にアクセスできます。JDI は最も高レベルかつ使いやすいインタフェースであるため、JDI を使用することを開発者の皆さんにお勧めします。企業が JDI を使ってデバッガを開発する場合を考えてみましょう。JDI は、リファレンス実装とともに使用でき、また VM および Sun がサポートするプラットフォームで自動的に機能します。さらに、たとえば、リファレンス実装のフロントエンド、および JDWP を実装する他社の VM (JVMDI を使用または省略する) でも機能します。
デバッガの中には、より低い層である JDWP (フロントエンドが Java で記述されていない場合) や JVMDI (低レベルの機能を必要とする特殊なデバッガの場合) の上に構築されるものもあります。
コンポーネント
debuggee
debuggee とは、デバッグしているプロセスのことです。 デバッグしているアプリケーション (表示されていない)、アプリケーションが動作している VM、およびデバッガのバックエンドで構成されます。
Java Virtual Machine (VM)
デバッグしているアプリケーションが動作している VM です。
このデバッガのアーキテクチャは、さまざまな VM 実装で使用できるように設計されています。
この VM では、Java Virtual Machine Debug Interface (JVMDI) が実装されます。
バックエンド
デバッガのバックエンドでは、デバッガのフロントエンドから debuggee VM に対して要求が送信され、さらに要求 (必要なイベントなど) に対する応答がフロントエンドに返信されます。バックエンドおよびフロントエンド間の通信は、Java Debug Wire Protocol (JDWP) を使用し、通信チャネルを介して行われます。バックエンドおよび debuggee VM 間の通信は、Java Virtual Machine Debug Interface (JVMDI) を使って行われます。
Java で記述されたデバッガサポートコードを debuggee 上で実行した場合、debuggee との競合が発生し、ハングアップおよびその他の予期しない動作をする可能性があります。このため、バックエンドはネイティブコードで記述されており、JVMDI は純粋なネイティブインタフェースになっています。
通信チャネル
通信チャネルは、デバッガのフロントエンドおよびバックエンド間のリンクです。使用されるトランスポート機構は指定されていませんが、ソケット、シリアル回線、および共用メモリが使用されます。ただし、チャネルを介して転送される直列化ビットストリームの形式およびセマンティクスは、Java Debug Wire Protocol (JDWP) に指定されています。
フロントエンド
デバッガのフロントエンドには、高レベルの Java Debug Interface (JDI) が実装されています。このフロントエンドでは、低レベルの Java Debug Wire Protocol (JDWP) の情報が使用されます。
ユーザインタフェース (UI)
デバッガインタフェース
Java Virtual Machine Debugger Interface (JVMDI)
JVMDI は、VM に実装されているネイティブインタフェースです。
デバッグするときに VM に必要なサービスを定義します。情報 (現在のスタックフレームなど)、アクション (ブレークポイントの設定など)、および通知 (ブレークポイントに到達したときなど) に対する要求を含みます。デバッガでは、JVMDI 以外の VM 情報 (Java Native Interface (JNI) など) も使用されますが、JVMDI はすべてのデバッガ固有情報のソースになります。
VM インタフェースを指定すると、VM 実装側からデバッグアーキテクチャに簡単にプラグインすることができます。また、代替通信チャネルを実装することもできます。このインタフェースに準拠しない VM 実装を使用した場合でも、Java Debug Wire Protocol (JDWP) を介してアクセスすることができます。
関連項目:
Java Debug Wire Protocol (JDWP)
debuggee プロセスおよびデバッガのフロントエンド間で転送される情報と要求の形式を定義します。ただし、トランスポート機構 (ソケット、シリアル回線、共用メモリなど) は定義しません。
このプロトコルの仕様によって、異なる VM 実装または異なるプラットフォーム、あるいはその両方で、debuggee およびデバッガのフロントエンドを実行することができます。Java 以外の言語で記述されたフロントエンド、またはネイティブ以外の debuggee (Java など) も使用できます。
情報および要求は、多くの場合、Java Virtual Machine Debug Interface (JVMDI) 層にあります。 ただし、帯域幅の問題が発生した場合は、必要な情報および要求が追加されます。 例には、フィルタ処理およびバッチ処理の情報も含まれています。
関連項目:
Java Debug Interface (JDI)
フロントエンドで実装される 100% Pure Java インタフェースです。
ユーザコードレベルの情報および要求を定義します。
デバッガの実装側では、Java Debug Wire Protocol (JDWP) および Java Virtual Machine Debug Interface (JVMDI) が直接使用されますが、このインタフェースを使用すると、デバッグ機能を開発環境に簡単に統合することができます。すべてのデバッガ開発で JDI を使用することをお勧めします。
関連項目: