Пользовательская эмуляция 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

Другие вопросы по тегам