准备工作
假设 openjdk 源代码目录为 jdk9dev
编译 openjdk 时启用了 zero 解释器(参考 )
调用栈
先在 JavaMain 函数(参考 )中 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); } }}