OpenJDK 8 解释器调试
OpenJDK 8 interpreter debug
我想看看 JVM 解释器是如何工作的。我可以使用 NetBeans 或 GDB 跟踪函数调用吗?这样做会更方便吗?我有兴趣使用 -Xint 选项启动 HelloWorld 并查看执行了哪些步骤并查看解释器源代码。
我指的不仅是解释器的结果,还有 HotSpot 源中的解释器代码本身。
我使用 --with-debug-level=slowdebug 选项从源代码构建了 OpenJDK 8。
如果您想了解 JVM 解释器的工作原理,最好使用 C++ 解释器构建 HotSpot。为此,将 CC_INTERP=true
传递给 make
命令。
这是字节码解释器的简化版本,主要用 C++ 编写。主要源文件(实现主解释器循环和大多数字节码)在 bytecodeInterpreter.cpp 中。您可以在自己喜欢的 IDE 中轻松调试此代码。但是,这个解释器实现实际上并没有用在生产 JVM 中;它的目的是快速试验和制作新端口的原型。
真正的解释器(又名Template Interpreter)是用特定于平台的宏汇编器编写的,其源代码在src/cpu/<arch>/vm/templateInterpreter_<arch>.cpp
和src/cpu/<arch>/vm/templateTable_<arch>.cpp
中。这个解释器是在JVM启动时动态生成的,所以调试起来并不容易:首先,因为这是汇编代码;其次,因为没有从生成的代码到原始源文件的直接映射。
-XX:+PrintInterpreter
选项将转储反汇编的模板解释器。
此外,在 HotSpot 的调试版本中有 -XX:+TraceBytecodes
标记。启用后,它会在执行每个字节码指令之前调用 trace function。这在调试解释器时很有用。
我想看看 JVM 解释器是如何工作的。我可以使用 NetBeans 或 GDB 跟踪函数调用吗?这样做会更方便吗?我有兴趣使用 -Xint 选项启动 HelloWorld 并查看执行了哪些步骤并查看解释器源代码。
我指的不仅是解释器的结果,还有 HotSpot 源中的解释器代码本身。
我使用 --with-debug-level=slowdebug 选项从源代码构建了 OpenJDK 8。
如果您想了解 JVM 解释器的工作原理,最好使用 C++ 解释器构建 HotSpot。为此,将 CC_INTERP=true
传递给 make
命令。
这是字节码解释器的简化版本,主要用 C++ 编写。主要源文件(实现主解释器循环和大多数字节码)在 bytecodeInterpreter.cpp 中。您可以在自己喜欢的 IDE 中轻松调试此代码。但是,这个解释器实现实际上并没有用在生产 JVM 中;它的目的是快速试验和制作新端口的原型。
真正的解释器(又名Template Interpreter)是用特定于平台的宏汇编器编写的,其源代码在src/cpu/<arch>/vm/templateInterpreter_<arch>.cpp
和src/cpu/<arch>/vm/templateTable_<arch>.cpp
中。这个解释器是在JVM启动时动态生成的,所以调试起来并不容易:首先,因为这是汇编代码;其次,因为没有从生成的代码到原始源文件的直接映射。
-XX:+PrintInterpreter
选项将转储反汇编的模板解释器。
此外,在 HotSpot 的调试版本中有 -XX:+TraceBytecodes
标记。启用后,它会在执行每个字节码指令之前调用 trace function。这在调试解释器时很有用。