0

ASMAPIを使用してアレイへのアクセスをトレースできるかどうか知りたいのですが。

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

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

4

2 に答える 2

2

特定のインデックスは命令の一部ではありません。命令が参照しているインデックスを見つけるには、オペランドスタックの最上位の値を確認する必要があります。JVMリファレンスを参照してください。

ただし、オペランドスタックを破壊したくない場合は、配列アクセス命令に遭遇したときにDUP、スタックの最上位を複製して(命令が参照するインデックスを複製して)、値を出力するか、好きなことを実行します。それを使用して、元の手順にアクセスして続行します。

ただし、配列にアクセスするには複数の異なる命令があることを知っておく必要があります。

  • aaload、、、、、、および読書iaload用、およびlaload_saloadbaloadcaloaddaload
  • aastore、、、、、、および書き込み用_ iastore_ lastore_sastorebastorecastoredastore
于 2010-12-04T13:42:07.970 に答える
0

nanoTime()は、配列がそれ自体にアクセスするのに約100倍の時間がかかることに注意してください。これにより、結果が大幅に歪む可能性があります。

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

ところで、配列ルックアップをメソッド呼び出しに置き換えることができます。

public static int arrayGet(int []int。intindex)

これにより、int[]にアクセスしたときにJavaで実行したいことを何でも実行できるようになります。

于 2010-12-04T13:42:29.020 に答える