准备工作
假设 openjdk 源代码目录为 jdk9dev
编译 openjdk 时启用了 zero 解释器(参考 OpenJDK9 Hotspot Mac OSX 编译和调试)
调用栈
先在 JavaMain 函数(参考 OpenJDK9 Hotpot java 虚拟机入口)中 CallStaticVoidMethod 设断点,然后在 CppInterpreter_zero.cpp 的 normal_entry 方法中设置断点:
CppInterpreter::normal_entry
通过 THREAD 宏获取当前 thread,然后创建第 0 个栈帧,然后进入 main loop 解释执行 字节码
int CppInterpreter::normal_entry(Method* method, intptr_t UNUSED, TRAPS) {
JavaThread *thread = (JavaThread*) THREAD;
// Allocate and initialize our frame.
InterpreterFrame *frame = InterpreterFrame::build(method, CHECK_0);
thread->push_zero_frame(frame);
// Execute those bytecodes!
main_loop(0, THREAD);
// No deoptimized frames on the stack
return 0;
}
CppInterpreter::main_loop
void CppInterpreter::main_loop(int recurse, TRAPS) {
...
while (true) {
if (JvmtiExport::can_post_interpreter_events()) {
BytecodeInterpreter::runWithChecks(istate);
} else {
BytecodeInterpreter::run(istate);
}
}
}
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。