モジュール jdk.jdi
パッケージ com.sun.jdi

インタフェースVirtualMachineManager


public interface VirtualMachineManager
ターゲット仮想マシンへの接続を管理するマネージャです。 VirtualMachineManagerを使用すると、1つのアプリケーションから複数のターゲットVMをデバッグすることができます。 ただし、この逆はサポートされていません。つまり、ターゲットVMは、複数のデバッガ・アプリケーションからデバッグすることはできません。 このインタフェースには、リモート・ターゲットVMへの接続を管理するメソッドと、使用可能なターゲットVMのVirtualMachineミラーを取得するメソッドが組み込まれています。

接続の確立のためには、いくつかのConnectorオブジェクトから1つを選んで使用します。 各コネクタには、デバッガをターゲットVMに接続する方法がカプセル化されています。

VirtualMachineManagerでは、デバッガを仮想マシンに接続するための複数の方法がサポートされています。 次の表に、4つの例を示します。 これらの例では、Sunの実装で採用されていたコマンド行構文を使用します。 一部のConnector実装では、次に示す例と若干異なった操作が必要になることがあります。

デバッガを仮想マシンに接続するための4つのシナリオ"
シナリオ 説明
デバッガからターゲットVMを起動する(もっとも簡単で一般的な方法) デバッガが、defaultConnector()で取得したデフォルトのコネクタのLaunchingConnector.launch(java.util.Map)メソッドを呼び出します。 ターゲットVMが起動し、そのVMとデバッガ間の接続が確立されます。 VirtualMachineミラーが返されます。

より詳細に制御することも可能です。

  • デバッガがlaunchingConnectors()によって返されたリストから、トランスポートの種類など、必要な特性に応じてコネクタを選択します。
  • 選択したコネクタのLaunchingConnector.launch(java.util.Map)メソッドを呼び出します。 ターゲットVMが起動し、そのVMとデバッガ間の接続が確立されます。 VirtualMachineミラーが返されます。

デバッガから稼動中のVMに接続する
  • ターゲットVMは、-agentlib:jdwp=transport=xxx,server=yオプションを使用して起動されます
  • ターゲットVMは、接続を待機するトランスポート固有のアドレスを生成および出力します。
  • デバッガが起動します。 トランスポートと「xxx」という名前を照合しながら、attachingConnectors()によって返されたリストからコネクタを選択します。
  • Connector.defaultArguments()によって取得したデフォルトのコネクタのパラメータがユーザーに提供されます。ユーザーは、ターゲットVMによって生成されたトランスポート固有のアドレスを入力できます。
  • デバッガは選択したコネクタのAttachingConnector.attach(java.util.Map)メソッドを呼び出し、ターゲットVMに接続します。 VirtualMachineミラーが返されます。
ターゲットVMからすでに稼動中のデバッガに接続する
  • 起動時に、デバッガは1つまたは複数のトランスポートに対して、listeningConnectors()によって返されたリストから1つまたは複数のコネクタを選択します。
  • 選択した各コネクタのListeningConnector.startListening(java.util.Map)メソッドを呼び出します。 エンド・ユーザーに、トランスポート名と対応するアドレス文字列が提供されます。 デバッガは、トランスポート名と対応するアドレス文字列をエンド・ユーザーが使用できるようにします。
  • 選択した各コネクタに対してListeningConnector.accept(java.util.Map)を呼び出し、ターゲットVMの接続を待機します。
  • あとでエンド・ユーザーが、-agentlib:jdwp=transport=xxx,address=yyyオプションを指定してターゲットVMを起動します。「xxx」はデバッガが選択したいずれかのコネクタのトランスポート、「yyy」はListeningConnector.accept(java.util.Map)によってそのトランスポートに対して生成されたアドレスです。
  • デバッガがListeningConnector.accept(java.util.Map)を呼び出すと、VirtualMachineミラーが返されます。
ターゲットVMからデバッガを起動する(「Just-In-Time」デバッグと呼ばれることもある)
  • ターゲットVMが-agentlib:jdwp=launch=cmdline,onuncaught=y,transport=xxx,server=yオプションを使用して起動されます
  • ターゲットVM内にキャッチされない例外がスローされます。 ターゲットVMは、接続を待機するトランスポート固有のアドレスを生成します。
  • 次の項目で構成されるコマンド行を使用して、ターゲットVMからデバッガを起動します。各項目は、空白で区切られています。
    • launch=値
    • transport=値
    • VMがデバッガの接続を待機する、トランスポート固有の生成されたアドレス。
  • デバッガは、起動時に、トランスポートと「xxx」という名前を照合しながら、attachingConnectors()によって返されたリストからコネクタを選択します。
  • Connector.defaultArguments()を使って取得したデフォルトのコネクタのパラメータを変更して、VMが待機するトランスポート固有のアドレスを指定します。 オプションで、ほかのコネクタの引数もユーザーに提供できます。
  • デバッガは選択したコネクタのAttachingConnector.attach(java.util.Map)メソッドを呼び出し、ターゲットVMに接続します。 VirtualMachineミラーが返されます。

Connectorsは起動時に生成されます。 つまり、Bootstrap.virtualMachineManager()の呼出し時にはじめて生成されることになります。 起動時に生成されたすべてのConnectorのリストは、allConnectorsメソッドを呼び出してVirtualMachineManagerから取得できます。

Connectorsは、プラットフォームにインストールされている場合、起動時に生成されます。 加えて、ConnectorsはVirtualMachineManagerにより自動的に生成され、プラットフォームにインストールされたTransportServiceの実装にカプセル化されます。 ここでは、Connectorsを生成する2つのメカニズムについて説明します。

コネクタがConnectorタイプの定義クラス・ローダーに表示されるjarファイルにインストールされ、jarファイルにリソース・ディレクトリMETA-INF/services内のプロバイダ構成ファイルConnectorとプロバイダ構成ファイルが含まれている場合、コネクタがプラットフォームにインストールされますConnector実装の完全修飾クラス名をリストします。 Connectorは、Connectorインタフェースを実装するクラスです。 より適切に説明するなら、このクラスは、特定のConnector型(AttachingConnectorListeningConnector、またはLaunchingConnector)のうちどれか1つを実装します。 プロバイダ構成ファイルの形式は、行ごとに1つの完全指定クラス名が示された形式です。 各クラスを囲む空白文字とタブ文字ばかりでなく空白行も無視されます。 コメント文字は'#' (0x23)で、各行で最初のコメント文字に続くすべての文字は無視されます。 ファイルはUTF-8で符号化されている必要があります。

起動時、VirtualMachineManagerはプロバイダ構成ファイルに示されている各クラスをロードおよびインスタンス化しようとします(引数なしのコンストラクタを使用)。 Connectorのロードおよび生成時にスローされた例外は、キャッチされ、無視されます。 つまり、起動プロセスはエラーにかかわらず続行されます。

VirtualMachineManagerは、プラットフォームにインストールされたConnectorに加え、プラットフォームにインストールされた任意のTransportService実装をカプセル化するConnectorも生成します。 TransportServiceは、TransportServiceタイプの定義クラス・ローダーに表示されるjarファイルにインストールされ、jarファイルにはリソース・ディレクトリMETA-INF/servicesTransportServiceという名前のプロバイダ構成ファイルが含まれ、プロバイダ構成ファイル・リストTransportService実装の完全修飾されたクラス名。 TransportServiceは、TransportServiceの具象サブクラスです。 各クラスはTransportServiceインタフェースを実装するクラスの完全指定クラス名でなければならない点を除き、プロバイダ構成ファイルの形式はConnectorsのプロバイダ構成ファイルと同じです。

VirtualMachineManagerは、プラットフォームにインストールされたTransportServiceごとに、対応するAttachingConnectorListeningConnectorを生成します。 これらのConnectorは、TransportServiceをさらにその次にカプセル化するTransportをカプセル化するために生成されます。 AttachingConnectorには、文字列Attachを連結したトランスポート・サービスの名前に基づいて名前が付けられます。 たとえば、トランスポート・サービスのname()メソッドがtelepathicを返す場合、AttachingConnectorの名前はtelepathicAttachになります。 同様に、ListeningConnectorには、トランスポート・サービスの名前にタグ付けされた文字列Listenを使用して名前が付けられます。 AttachingConnectorとListeningConnectorのdescription()メソッドは、配下のトランスポート・サービスのdescription()メソッドに委譲されます。 AttachingConnectorとListeningConnectorのどちらも、2つのConnector Argumentsを持ちます。 addressという名前のStringArgumentは、アタッチするアドレスも指定するか、リスニングするアドレスを指定するためのコネクタ引数です。 timeoutという名前のIntegerArgumentは、接続時または受入れ時にタイムアウトを指定するコネクタ引数です。 タイムアウト・コネクタは、トランスポート・サービスが接続タイム・アウトまたは受け入れタイム・アウトをサポートしているかどうかに応じて無視できます。

コネクタを作成できない場合、仮想マシン・マネージャの初期化は失敗し、Bootstrap.virtualMachineManager()によってエラーがスローされます。

導入されたバージョン:
1.3