web-dev-qa-db-ja.com

Javaリモートデバッグ、それは技術的にどのように機能しますか?

JVMのリモートデバッグ機能が本当に好きです。しかし、内部的にはどのように機能するのでしょうか。

私の仮定:実行中のプロセスが、接続されたリモートデバッガー(IDEなど)からソースコードをダウンロード/使用しているJVM機能を介して行われます。現在のスタックトレースの行を認識し、それぞれの=にジャンプできます。 IDEブレークポイント。スタックトレースの通信とアプリケーションの状態のイントロスペクションは、ソケットまたは共有メモリ(リモートデバッガの設定)を介して行われます。

その上に興味深いリンク/リソースがありますか?

65
manuel aldana

JVMのデバッグ機能は Java Platform Debugger Architecture(JPDA) を介して提供されます。

JPDA自体は次の要素で構成されています。

  • Java仮想マシンツールインターフェイス(JVM TI)-ツールが使用するネイティブプログラミングインターフェイス。このインターフェイスは、状態の検査を可能にし、デバッグ対象内の実行フローの制御に役立ちます。
  • Java Debug Wire Protocol(JDWP)-デバッガーとデバッグ対象プロセス間の通信を定義するために使用されます。
  • Java Debug Interface(JDI)-このインターフェースにより、ツール開発者はリモートデバッガアプリケーションを作成できます。

JPDAアーキテクチャ構造 にリストされている図は、出発点として適しています。追加の検索場所は JPDAページにリストされているガイド です。

43
Vineet Reynolds

Eclipseのデバッグは、エージェントと呼ばれるものから始まります。

コンパイルされた「.class」ソースを実行するJVMには、実行時に外部ライブラリ(JavaまたはC++)で記述)をJVMに注入できる機能があります。これらの外部ライブラリは、エージェントとして実行され、実行された.classファイルの内容を変更する機能があります。これらのエージェントは、通常のJava内部で実行されるコード内からアクセスできないJVMの機能にアクセスできます。 JVMとそれらは、実行中のソースコードの挿入と変更、プロファイリングなどの興味深いことを行うために使用できます。JRebel(コードのホット置換に使用)などの一部のツールは、この機能を利用して魔法を実現します。

そして、エージェントLibをJVMに渡すには、起動引数を使用して、-

agentlib:libname[=options]

実際には、jdwpという名前のエージェントライブラリをTomcatを実行しているJVMに渡していました。 jdwpは、JDWP(Java Debug Wire Protocol)のJVM固有のオプション実装であり、デバッガーと実行中のJVMの間の通信を定義するために使用されます。実装されている場合は、jdwp.soまたはjdwp.dllのいずれかとしてJVMのネイティブライブラリとして提供されます。

それでそれは何をしますか?簡単に言うと、渡すjdwpエージェントは基本的に、アプリケーションを実行しているJVMインスタンスとデバッガ(リモートまたはローカルのいずれかに配置可能)の間のリンクとなる機能を果たしています。これはエージェントライブラリであるため、実行中のコードを傍受し、JVMとデバッガーの間にブリッジを作成し、デバッガーの機能をJVMに適用することができます。 JVMアーキテクチャでは、デバッグ機能はJVM自体にはありませんが、外部ツール(デバッガーと呼ばれます)に抽象化されているため、これらのツールは、デバッグ中のJVMを実行しているローカルマシンに常駐するか、実行できます。外部マシンから。リモートマシンでJVMを実行し、JDWPを使用して、リモートデバッガーと通信できるようにするのは、この分離されたモジュラーアーキテクチャです。

つまり、Eclipseデバッガーはこのように機能します。

11
Pritam Banerjee

JavaのデバッグアーキテクチャはJPDAと呼ばれます。あなたはおそらくJPDA documentation を読みたいでしょう。特に、 ウォークスルーセクション は、IDEがJDIとインターフェースしてスタック上の値を取得する例です。

9
Daniel Trebbien