|
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 は、複数のプラットフォーム、仮想マシン (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 を使用しても省略してもよい) で動作している debuggee でも機能します。
デバッガの中には、より低い層である JDWP (フロントエンドが Java で記述されていない場合) や JVMDI (低レベルの機能を必要とする特殊なデバッガの場合) の上に構築されるものもあります。
コンポーネント
debuggee
debuggee とは、デバッグしているプロセスのことです。デバッグしているアプリケーション (表示されていない)、アプリケーションが動作している VM、およびデバッガのバックエンドで構成されます。
Java 仮想マシン (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 プロセスとデバッガのフロントエンドとの間で転送される情報および要求の形式を定義します。ただし、トランスポート機構 (ソケット、シリアル回線、共用メモリなど) は定義しません。
このプロトコルの仕様によって、debuggee とデバッガのフロントエンドを、異なる VM 実装または異なるプラットフォーム (その両方が異なってもかまわない) で実行できるようになります。 さらに、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 インタフェースを使用すると、デバッグ機能を開発環境に簡単に統合することができます。 すべてのデバッガ開発で JDI 層を使用することをお勧めします。
関連項目: