構成の概要

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
JVM TI は、JVMDI に置き換わるものとして J2SE 5.0 に導入された新しいインタフェースです。VM が提供するデバッグサービスを定義します。
JDWP - Java Debug Wire Protocol
debuggee とデバッガプロセスの間の通信を定義します。
JDI - Java Debug Interface
高レベルの Java 言語インタフェースを定義します。これを使用することにより、ツール開発者は、リモートデバッガアプリケーションを容易に記述できます。

リファレンス実装

これらのインタフェースの仕様に加え、Sun Microsystems はリファレンス実装も提供します。リファレンス実装は、次のようなコンポーネントで構成されます。 結果として、任意の層を置換可能な多層実装が提供されます。

JPDA の使用

デバッガ開発者は、任意の層で JPDA にアクセスできます。JDI はもっとも高レベルかつ使いやすいインタフェースであるため、JDI を使用することを開発者の皆さんにお勧めします。企業が JDI を使ってデバッガを開発する場合を考えてみましょう。JDI は、リファレンス実装とともに使用でき、また VM および Sun がサポートするプラットフォームで自動的に機能します。さらに、たとえば、リファレンス実装のフロントエンドと、JDWP を実装する他社の VM (JVM TI を使用しても省略してもよい) で動作している debuggee でも機能します。

デバッガの中には、より低い層である JDWP (フロントエンドが Java で記述されていない場合) や JVM TI (低レベルの機能を必要とする特殊なデバッガの場合) の上に構築されるものもあります。


コンポーネント

debuggee

debuggee は、デバッグされているプロセスです。デバッグされているアプリケーション (示されていません)、そのアプリケーションが動作している VM、およびデバッガのバックエンドで構成されます。

Java 仮想マシン (VM)

デバッグしているアプリケーションが動作している VM です。

このデバッガのアーキテクチャーは、さまざまな VM 実装で使用できるように設計されています。

この VM では、Java Virtual Machine Debug Interface (JVM TI) が実装されます。

バックエンド

デバッガのバックエンドは、デバッガのフロントエンドからの要求を debuggee VM に通信したり、これらの要求への応答 (必要なイベントを含む) をフロントエンドに通信したりする役割を果たします。バックエンドは、Java Debug Wire Protocol (JDWP) を使用して、通信チャネル経由でフロントエンドと通信します。バックエンドは、Java Virtual Machine Debug Interface (JVM TI) を使用して debuggee VM と通信します。

Java で記述されたデバッガサポートコードを debuggee 上で実行した場合、debuggee との競合が発生し、ハングアップおよびその他の予期しない動作をする可能性があります。このため、バックエンドはネイティブコードで記述されています。JVM TI は純粋なネイティブインタフェースになっています。

通信チャネル

通信チャネルは、デバッガのフロントエンドバックエンドの間のリンクです。これは、次の 2 つのメカニズムで構成されていると考えることができます。

  1. コネクタ。コネクタは、フロントエンドとバックエンド間で接続を確立する手段として使用される JDI オブジェクトです。

    JPDA では、次の 3 つのコネクタが定義されています。

    • 待機コネクタ:フロントエンドが、バックエンドからの着信接続を待機する
    • 接続コネクタ:フロントエンドが、すでに実行中のバックエンドに接続する。
    • 起動コネクタ:フロントエンドが、debuggee コードおよびバックエンドを実行する Java プロセスを実際に起動する。
  2. トランスポート。トランスポートとは、フロントエンドとバックエンドの間でビットを移動するために使用される、基盤となるメカニズムのことです。

    使用されるトランスポートメカニズムは指定されていませんが、ソケット、シリアル回線、および共用メモリーが含まれる可能性があります。ただし、チャネルを介して転送される直列化ビットストリームの形式およびセマンティクスは、Java Debug Wire Protocol (JDWP) に指定されています。
J2SE 5.0 から、JPDA にはサービスプロバイダインタフェースが含まれており、これを使うと、コネクタやトランスポートの実装を開発および配置できます。これらのサービスプロバイダインタフェースにより、デバッガやほかのツールベンダーで新しいコネクタ実装を開発し、Sun が提供するソケットおよび共用メモリートランスポートを超える別のトランスポートメカニズムを提供できます。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 から提供する必要のあるサービスを定義します。情報 (現在のスタックフレームなど) の要求、アクション (ブレークポイントの設定など)、および通知 (ブレークポイントに到達したときなど) が含まれます。デバッガでは、JVMDI 以外の VM 情報 (Java Native Interface (JNI) など) も使用されますが、JVMDI はすべてのデバッガ固有情報のソースになります。

VM インタフェースを指定すると、VM 実装側からデバッグアーキテクチャーに簡単にプラグインすることができます。また、代替通信チャネルを実装することもできます。このインタフェースに準拠しない VM 実装を使用した場合でも、Java Debug Wire Protocol (JDWP) を介してアクセスできます。

関連項目:

JVM TI の仕様
 

Java Debug Wire Protocol (JDWP)

debuggee プロセスとデバッガのフロントエンドとの間で転送される情報と要求の形式を定義します。ただし、トランスポートメカニズム (ソケット、シリアル回線、共用メモリーなど) は定義しません。

このプロトコルの仕様によって、debuggee とデバッガのフロントエンドを、異なる VM 実装または異なるプラットフォーム (その両方が異なってもかまわない) で実行できるようになります。さらに、Java 以外の言語で記述されたフロントエンド、またはネイティブ以外の debuggee (Java など) も使用できるようになります。

情報および要求は、多くの場合、Java Virtual Machine Debug Interface (JVM TI) 層のものです。しかし、帯域幅の問題が発生した場合には、必要な情報および要求が追加されることがあります。たとえば、情報のフィルタ処理やバッチ処理などです。

関連項目:

JDWP の仕様
JDWP トランスポートの仕様
 

Java Debug Interface (JDI)

フロントエンドによって実装される 100% Pure Java インタフェースです。

ユーザーコードレベルでの情報および要求を定義します。

デバッガの実装側は Java Debug Wire Protocol (JDWP) を直接使用するか、または Java Virtual Machine Debug Interface (JVM TI) を使用する可能性がありますが、このインタフェースにより、デバッグ機能の開発環境への統合が大幅に促進されます。すべてのデバッガ開発で JDI 層を使用することをお勧めします。

関連項目:

JDI の仕様


Copyright © 1993, 2013, Oracle and/or its affiliates. All rights reserved.