JVMのリモートデバッグ機能が本当に好きです。しかし、内部的にはどのように機能するのでしょうか。
私の仮定:実行中のプロセスが、接続されたリモートデバッガー(IDEなど)からソースコードをダウンロード/使用しているJVM機能を介して行われます。現在のスタックトレースの行を認識し、それぞれの=にジャンプできます。 IDEブレークポイント。スタックトレースの通信とアプリケーションの状態のイントロスペクションは、ソケットまたは共有メモリ(リモートデバッガの設定)を介して行われます。
その上に興味深いリンク/リソースがありますか?
JVMのデバッグ機能は Java Platform Debugger Architecture(JPDA) を介して提供されます。
JPDA自体は次の要素で構成されています。
JPDAアーキテクチャ構造 にリストされている図は、出発点として適しています。追加の検索場所は JPDAページにリストされているガイド です。
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デバッガーはこのように機能します。
JavaのデバッグアーキテクチャはJPDAと呼ばれます。あなたはおそらくJPDA documentation を読みたいでしょう。特に、 ウォークスルーセクション は、IDEがJDIとインターフェースしてスタック上の値を取得する例です。