Eclipse プラットフォーム用のプラグインを開発しています。このプラグインは、現在デバッグ中の Java ソース コードの行に関する情報を提供するために使用されます。
Java プログラムをデバッグするとき、ブレークポイントに到達すると、Eclipse は標準のデバッグ パースペクティブに切り替わります。このパースペクティブ内では、標準のコンソール出力、スタック トレース、およびその他のさまざまなビューとは別に、現在デバッグ中の Java プログラムのソース コードを確認できます。この「ソース コード ビュー」内で、強調表示された行が表示されます。これは、現在デバッグ/評価されているコード行です。この強調表示されたコード行は、私がアクセスしたいものです。
デバッガーがいつ実行されているかを知っていると仮定すると (私は を実装する DebugBreakpointListener クラスを介してそれを評価しますIJavaBreakpointListener
)、デバッガーに「質問する」必要があります。私が必要だと思うのは、デバッガーが現在強調表示/デバッグ/評価しているコード行、またはそのコード行の行番号を直接デバッガーに尋ねることです。
JDIDebugModel への静的アクセスを作成して、Java ブレークポイント リスナーを追加します。
JDIDebugModel.addJavaBreakpointListener(new DebugBreakpointListener);
静的参照を使用してデバッガーにアクセスできると思っJDIDebugPlugin
ていましたが、探しているものがまだ見つかりません。
この研究論文のパート 3 で、著者は次のことを提案しました。
Eclipse Java デバッガーは、Java Development Toolkit の一部である Java Debug Interface (JDI) の API に基づいて構築されています。この API を使用すると、リクエストを追加して、BreakpointEvent などの JVM イベントを監視できます。イベントが発生すると、デバッガーは通知を受け取り、このイベントが発生したスレッドを取得できます。このスレッドのスタック トレース内の各フレームについて、次の情報を取得できます。
• このフレームで実行が行われたソース Java ファイル (ソースが利用できない場合は null)。
• メソッドと行番号 (利用可能な場合)。
• メソッドが静的な場合は、このオブジェクトまたは null。
Eclipse デバッガーは、ブレークポイントに到達したときにこの情報を使用します。中断されたスレッドのスタック トレースが [デバッグ] ビューに表示されます。このトレースで選択されたフレームについて、Eclipse はソース ファイル内の対応する行番号を強調表示し、この変数を「変数」ビューに表示します。
この箇条書きにリストされているものは、まさに私が探しているものです。
残念ながら、デバッガーに「プラグイン」する方法に関する詳細なドキュメントは見つかりません。
誰かが私に情報を提供してくれたり、情報やサンプル コードを教えてくれたり、Eclipse JDI プロジェクトの誰かの連絡先を教えてくれたりしたら、非常にありがたいです。
前もって感謝します。
------更新と回答: ------
greg-449 の回答の助けを借りて、やりたいことを正確に実行しました。これが私がしたことです:
私が書いた前述のブレークポイント リスナーbreakpointHit
は、次のようなインターフェイス メソッドを実装しています。
@Override
public int breakpointHit(IJavaThread thread, IJavaBreakpoint breakpoint) {
System.out.println("Just hit a breakpoint!");
// Save pointers to the thread & breakpoint for future use.
return 0;
}
オブジェクトの 1 つに保存されているスレッド オブジェクトとブレークポイント オブジェクトへのポインターを使用してクエリを実行し、フレーム スタック、スレッド、およびヒットした特定のブレークポイントの状態に関する最新情報を取得できました。次のように呼び出して、デバッガーが現在デバッグしているクラスの名前 dn パスを取得できます。
IStackFrame topStackFrame = thread.getTopStackFrame();
int debuggedLineNumber = topStackFrame.getLineNumber();
String debuggedClassPath = topStackFrame.getLaunch().getSourceLocator().getSourceElement(thread.getTopStackFrame()).toString();
これはまさに私が探していたものでした。ソースコードファイルを手動で読み取り、「改行」文字を区切り文字としてトークナイザーを介して実行し、対応するトークンを取得してその特定の行を読み取る必要があると思います。