2010-12-04 7 views
0

ASM APIを使用して配列へのアクセスをトレースできるかどうかを知りたいと思います。ASMを使用した配列へのアクセス

私の目標は、アレイのどのインデックスにアクセスするのか、いつ(この部分が簡単か - System.NanoTime()を使用する)を決定することです。インデックスにアクセスしているかどうかを判断する方法が見つかりませんでした。

私は成功せず、次のものを使用しようとしている - (静的および非静的ローカル変数のために)visitVarInsn、(クラスの静的および非静的VARSのため)visitFieldInsn、およびvisitMultiANewArrayInsn - 実際に任意の配列を認識しませんでした。

答えて

2

特定のインデックスは、命令の一部ではありません。オペランドスタックの一番上にある値を調べて、命令が参照するインデックスを見つけなければなりません。 JVM referenceを参照してください。

しかし、配列アクセス命令が発生した場合は、DUPを実行してスタックの先頭を複製してください(命令が指すインデックスを複製してください)。あなたが好きなことを何でもして元の指示に従ってください。

あなたは、アレイにアクセスするための複数の異なる命令があることがわかっている必要があります。

  • aaloadialoadlaloadsaloadbaloadcaloadや読書のためのdaload、および
  • aastore
  • iastorelastoreは、 sastore, bastore, castoreおよび dastore書き込み用
+0

ありがとうございます、私はそれを撃つでしょう。 – RanZilber

0

nanoTime()が配列のアクセス自体に約100倍の長さを要することは注目に値する。これは結果を著しく歪める可能性があります。

ASMifierでコードを見てみましたか?これにより、コードによってトリガされるイベントが表示されます。

ご参考までに、配列検索をメソッド呼び出しで置き換えることができます。

のpublic static int型arrayGet(INT [] int型。INTインデックス)

これは、あなたがint []がアクセスしたときに、それがやりたいものは何でも、Javaで置くことができます。

+0

は、同じ解像度で結果を乱すことなく時間を得る良い方法はありますか? – RanZilber

+0

AFAIKでは、JNI経由で時間を取得するための別の方法は、ほぼ同じ時間がかかります。 –

関連する問題