Доступ к массивам с использованием ASM - PullRequest
0 голосов
/ 04 декабря 2010

Я хотел бы знать, возможно ли отследить доступ к массиву с помощью ASM API.

Моя цель - определить, к какому индексу массива и когда (эта часть проста - использоватьSystem.NanoTime()).Я просто не смог найти способ определить, к какому индексу обращаются.

Я пытался использовать следующие безуспешно - visitFieldInsn (для статических и нестатических переменных класса), visitVarInsn (для статических и нестатических локальных переменных) и visitMultiANewArrayInsn - которые на самом деле не распознают какой-либо массив.

Ответы [ 2 ]

2 голосов
/ 04 декабря 2010

Конкретный индекс не является частью инструкции. Вы должны взглянуть на значение в верхней части стека операндов, чтобы узнать, к какому индексу относится инструкция. См. Справочник JVM .

.

Однако вы не хотите разрушать стек операндов, поэтому, когда вы сталкиваетесь с инструкцией доступа к массиву, выполните DUP, дублируйте вершину стека (дублируйте индекс, к которому относится инструкция), а затем напечатайте цените или делайте с ним что угодно, а затем продолжайте, посетив оригинальную инструкцию.

Однако вы должны знать, что существует несколько различных инструкций для доступа к массиву:

  • aaload, iaload, laload, saload, baload, caload и daload для чтения и
  • aastore, iastore, lastore, sastore, bastore, castore и dastore для записи
0 голосов
/ 04 декабря 2010

Стоит отметить, что nanoTime () занимает около 100 раз больше, чем сам массив.Это может существенно исказить результаты.

Вы пытались просмотреть свой код с помощью ASMifier.Это должно показать вам, какие события инициируются вашим кодом.

Кстати, вы можете заменить поиск в массиве вызовами методов, например:

public static int arrayGet (int [] int. Int index)

Это позволит вам помещать в Java все, что вы хотите, при обращении к int [].

...