3

JVMTI エージェントのおかげで、Java アプリからのすべてのメソッド エントリを記録しています。今のところ、各メソッドの名前を取得できますが、メソッドが受け取ったパラメーターの値を取得できるようにしたいと考えています。

この問題は、以前のトピックで既に説明されています ( MethodEntry コールバックでパラメーター値を取得する方法を参照してください)。探しているものに完全に適合するため、GetLocalObject 関数を使用する必要があることはわかっていますが、その方法がわかりません (トピックに示されている例は壊れています)。

これを行う方法を見つけるのを手伝ってくれる人はいますか? ありがとう。

4

1 に答える 1

1

内容を事前に知らずに任意のメソッド パラメータにアクセスしたいと思いますが、そうでない場合は、質問を明確にしていただけますか?

ローカル変数に関する JVMTI ドキュメントを参照してください。

まず、ケーパビリティ リストでローカル変数アクセスが有効になっていることを確認する必要があります。次に、 を使用して使用可能なパラメーターを見つけますGetLocalVariableTable。返されるテーブルには、パラメーターを含む、メソッド内の各ローカル変数の説明が含まれます。Deallocate終わったら忘れずに。

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

jlocation現在のusing を見つけ、ローカル変数テーブルを反復処理し、現在の場所以下GetFrameLocationのローカル変数ごとに、スロット番号と型をパラメーターのリストに追加します。start_location

パラメータごとGetLocal{X}に、そのタイプに基づいて適切なメソッドを呼び出します。からすでに取得している現在のフレームの深度が必要になりますGetFrameLocation

これでパラメータが得られるはずですが、実装が遅く、扱いにくいでしょう。MethodEntry コールバックを回避し、代わりにバイトコード インストルメンテーション (BCI) を使用するというガイドの推奨事項に従う方がはるかに良いでしょう。

于 2012-04-15T20:05:12.623 に答える