我正在使用 QEMU 模拟器来跟踪用户程序的执行。我们添加了一个辅助函数,可以打印所有已执行指令的 IP。我们已经针对素数程序的两种变体测试了该工具的工作情况——一种使用 C 语言,另一种使用 Java。我们为每个程序尝试了 4 个不同的输入参数,期望在每种情况下执行不同数量的指令。 C 版本的素数程序遵循预期的线性趋势,即行数随着输入的增加而增加。然而,Java 程序每次给出完全相同数量的指令。
我觉得 Java 执行跟踪只捕获 JVM 代码,而不是正在运行的实际代码。
JVM修改后的代码在QEMU上跑到哪里去了? QEMU 有什么特殊的方式来捕获自修改代码的执行吗?
最佳答案
Hotspot JVM(您可能正在使用的那个)有两种执行 java 代码的模式:解释和编译。当你启动一个程序时,它首先会以解释模式运行。如果 JVM 决定一段代码执行得足够频繁,它就会编译它并使用编译后的代码。
所以你应该看到执行的指令数量呈线性趋势,但只要 JVM 运行在解释模式下,你只会看到来自解释器的指令,因为没有与 java 代码对应的字节码。
您知道 x86 CPU 的性能计数器吗?它们可用于在不使用任何虚拟机的情况下测量指令数。 https://perf.wiki.kernel.org/index.php/Main_Page
关于java - 使用 Java 的 Qemu 用户仿真,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22506590/