Пользовательская эмуляция Qemu с Java

Я использую эмулятор QEMU для отслеживания выполнения пользовательской программы. Мы добавили вспомогательную функцию, которая печатает IP всех выполненных инструкций. Мы протестировали работу этого инструмента для двух вариантов программы простого номера: один в C и другой на Java. Мы пробовали 4 разных входных аргумента для каждой программы, ожидая различного количества команд, выполняемых в каждом случае. C-версия программы простых чисел следует ожидаемому линейному тренду, т.е. Число строк увеличивается с большими входами. Тем не менее, программа Java дает одинаковое количество инструкций каждый раз.

Я чувствую, что трассировка выполнения Java захватывает только код JVM, а не текущий код, который выполняется.

Где код, измененный JVM, запускается на QEMU? Есть ли какой-либо особый способ QEMU фиксирует выполнение самомодифицирующего кода?

Ответ 1

JVM Hotspot (тот, который вы, вероятно, используете) имеет два режима выполнения java-кода: интерпретируется и компилируется. Когда вы запускаете программу, она сначала запускается в интерпретируемом режиме. Если JVM решает, что код кода выполняется достаточно часто, он будет скомпилировать его и использовать скомпилированный код.

Итак, вы должны увидеть линейный тренд в количестве выполненных команд, но пока JVM работает в интерпретируемом режиме, вы увидите только инструкции от интерпретатора, так как нет байтового кода, соответствующего java-коду.

Знаете ли вы о счетчиках производительности процессоров x86? Они могут использоваться для измерения количества инструкций без использования какой-либо виртуальной машины. https://perf.wiki.kernel.org/index.php/Main_Page