1

現在、IDebugContextListener クラス (Eclipse 開発者ツール API/ライブラリの一部) を実装して、デバッガーでイベントの変更をリッスンしています。これを実現する方法は次のとおりです。

private void contextActivated(ISelection context) {
        if (context instanceof StructuredSelection) {
                Object data = ((StructuredSelection) context).getFirstElement();
                if (data instanceof IStackFrame) {
                        reciever.setStackFrame((IStackFrame) data);
                } else {
                        reciever.setStackFrame(null);
                }
        }
}

基本的に、デバッガーは、デバッグ中のプログラムで何が起こっているかのモデルを提供する、IVariables を内部に持つ私のプログラム IStackFrame を提供しています。私が知る限り、これらはデバッグ中のプログラムで実行されている真の変数のデータ表現です。IVariable は、表す変数の名前の取得や型の取得などの基本的なことを実行できるため、機能が制限されています。

これは不可能かもしれませんが、IDebugContextListener クラスを使用して IVariable データ表現ではなく、それが表す実際のオブジェクトのコピーを取得する方法はありますか?

私の目的は、オブジェクトの内部関数を使用することです。IVariables を使用すると、オブジェクト内の変数のプロパティにしかアクセスできません。

4

2 に答える 2

2

IVariable/IValue インターフェイスは、デバッグ情報を取得するための、言語に依存しない汎用的な方法を提供します。つまり、これらの値を使用してデバッガーから現在の値を直接取得することは実際には不可能です。

ただし、JDT などの言語環境は、その情報を取得するのに役立つ 2 番目の言語固有のレイヤーを提供します。JDT の場合は、org.eclipse.jdt.debug projectを参照してください。

Java デバッガーの値を取得するためのより詳細なサンプルについては、検査アクションのソース コードを参照してください。基本的に、このコードはデバッグされた JVM と通信する方法を示しています。

警告: ここで示す解決策は、JDT の内部コードに依存している可能性があります (jdt プラグインの外部でも使用できる可能性があります)。また、他の JVM との通信は非常に遅くなる可能性があります。気をつけて。

于 2012-07-09T21:03:57.920 に答える
1

IDebugContextListener は、具体的には IJavaVariable インターフェイスを実装している IVariable のコレクションを持つ IStackFrame を実際に返します。これを知っていれば、IJavaVariable から IJavaValue を取得できます。これは、IJavaObject にキャストできます。

IJavaObject は、sendMessage() というメソッドを提供します。このメソッドでは、デバッガー JVM と通信して、スタック上のメソッドを実行し、メソッドの戻り値の IValue を返すことができます。

これが私がこの問題を解決する方法です。

于 2012-07-13T02:20:53.113 に答える