2011-08-12 12 views
2

JVMTIエージェントのおかげで、Javaアプリケーションからすべてのメソッドエントリを記録しています。今のところ、私は各メソッドの名前を取得することができますが、私はメソッドが受け取ったパラメータの値を取得できるようにしたいと思います。JVMTI - コールバックからメソッドパラメータの値を取得する方法

この問題は、以前のトピック(How to get parameter values in a MethodEntry callbackを参照)で既に説明されています。それは私が探しているものに完全に合うので、私はGetLocalObject関数を使用しなければならないことを知っていますが、私はどのように(トピックで与えられた例が壊れているか)解りません。

誰でもこの方法を見つけるのを手助けできますか?ありがとう。

答えて

1

あなたはあなたの質問を明確にすることができない場合は、そのコンテンツの予知なしに任意のメソッドパラメータにアクセスしたいと思いますか?

JVMTI docs on local variablesを参照してください。

まず、機能リストでローカル変数アクセスを有効にする必要があります。次に、GetLocalVariableTableを使用して、使用可能なパラメータを調べます。返されるテーブルには、パラメータを含むメソッド内の各ローカル変数の説明が含まれます。完了したらDeallocateを忘れないでください。

どの変数がパラメータであるかを調べる必要があります。現在のjlocationを見つけて、まだ利用できないローカル変数を削除することで、これを行うことができます。これは、パラメータの順序を教えてくれるわけではありませんが、どのローカル変数がパラメータであるかがわかります。おそらく、スロット番号が正しい順序であると仮定できます。

は、GetFrameLocationを使用して、現在のjlocation検索ローカル変数テーブルを反復し、そのstart_location以下現在地に等しい各ローカル変数のために、パラメータのリストにスロット番号およびタイプを追加します。

各パラメータについて、そのタイプに基づいて適切なGetLocal{X}メソッドを呼び出します。あなたはすでに持っているあなたの現在のフレームの深さがGetFrameLocationから必要です。

これはパラメータを取得するはずですが、実装するのが遅くて手間がかかります。 MethodEntryコールバックを回避し、代わりにバイトコードインストルメンテーション(BCI)を使用することをお勧めします。

+0

jobject変数を取得したとしましょう.jvmtiを使用してjobject変数のフィールドを抽出するにはどうすればよいですか? – kumarD

関連する問題