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 | |--------------|
JPDAは、複数のプラットフォーム、仮想マシン(VM)実装、およびJDKバージョン間で高い移植性を持つデバッガ・アプリケーションを、ツール開発者が容易に作成できるようにする多層デバッグ・アーキテクチャです。
JPDAは、次の3つの階層で構成されます。
これらのインタフェースの仕様に加え、Oracleはリファレンス実装も提供します。リファレンス実装は、次のようなコンポーネントで構成されます。
結果として、任意の層を置換可能な多層実装が提供されます。
デバッガ開発者は、任意の層でJPDAにアクセスできます。 JDIはもっとも高レベルかつ使いやすいインタフェースであるため、JDIを使用することを開発者の皆さんにお薦めします。 企業がJDIを使ってデバッガを開発する場合を考えてみましょう。 これらは、リファレンス実装とともに使用でき、またVMおよびOracleがサポートするプラットフォームで自動的に機能します。 さらに、たとえば、リファレンス実装のフロントエンドと、JDWPを実装する他社のVM (JVM TIを使用しても省略してもよい)で動作しているdebuggeeでも機能します。
デバッガの中には、より低い層であるJDWP (フロントエンドがJavaで記述されていない場合)やJVM TI (低レベルの機能を必要とする特殊なデバッガの場合)の上に構築されるものもあります。
debuggeeは、デバッグされているプロセスです。デバッグされているアプリケーション(示されていません)、そのアプリケーションが動作しているVM、およびデバッガのバックエンドで構成されます。
デバッグしているアプリケーションが動作しているVMです。
このデバッガのアーキテクチャは、さまざまなVM実装で使用できるように設計されています。
VMはJava仮想マシン・ツール・インタフェース(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つのコネクタが定義されています。
トランスポート。 トランスポートとは、フロントエンドとバックエンドの間でビットを移動するために使用される、基盤となるメカニズムのことです。
使用されるトランスポート・メカニズムは指定されていませんが、ソケット、シリアル回線、および共用メモリーが含まれる可能性があります。 ただし、チャネルを介して転送される直列化ビット・ストリームの形式およびセマンティックスは、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)の情報が使用されます。
デバッガのユーザー・インタフェースは指定されていません。ツール・ベンダーから、使いやすい実装が提供される予定です。 ただし、簡単なグラフィカル・ユーザー・インタフェース(GUI)の例は提供されています。このGUI例を、テスト・ツール、またはより高度なGUIを開発するためのひな形として使用できます。 JDBバージョンも、例として使用できます。
これらのUIの例は、Java Debug Interface (JDI)のクライアントになっています。
VMによって実装されるネイティブ・インタフェースです。
デバッグのためにVMから提供する必要のあるサービスを定義します。 情報(現在のスタック・フレームなど)の要求、アクション(ブレークポイントの設定など)、および通知(ブレークポイントに到達したときなど)が含まれます。 デバッガでは、これ以外のVM情報(Java Native Interface (JNI)など)も使用されますが、これがすべてのデバッガ固有情報のソースになります。
VMインタフェースを指定すると、VM実装側からデバッグ・アーキテクチャに簡単にプラグインすることができます。 また、代替通信チャネルを実装することもできます。 このインタフェースに準拠しないVM実装を使用した場合でも、Java Debug Wire Protocol (JDWP)を介してアクセスできます。
関連項目:
debuggeeプロセスとデバッガのフロントエンドとの間で転送される情報と要求の形式を定義します。 ただし、トランスポート・メカニズム(ソケット、シリアル回線、共用メモリーなど)は定義しません。
このプロトコルの仕様によって、debuggeeとデバッガのフロントエンドを、異なるVM実装または異なるプラットフォーム(その両方が異なってもかまわない)で実行できるようになります。 さらに、Java以外の言語で記述されたフロントエンド、またはネイティブ以外のdebuggee (Javaなど)も使用できるようになります。
情報および要求は、多くの場合、Java Virtual Machine Debug Interface (JVM TI)層のものです。しかし、帯域幅の問題が発生した場合には、必要な情報および要求が追加されることがあります。たとえば、情報のフィルタ処理やバッチ処理などです。
関連項目:
フロントエンドによって実装される100% Pure Javaインタフェースです。
ユーザー・コード・レベルでの情報および要求を定義します。
デバッガの実装者は、Java Debug Wire Protocol (JDWP)またはJava Virtual Machine Tool Interface (JVM TI)を直接使用できますが、このインタフェースは開発環境へのデバッグ機能の統合を容易にします。 すべてのデバッガ開発でJDI層を使用することをお薦めします。
関連項目:
Copyright © 1993, 2017, Oracle and/or its affiliates. All rights reserved.