GDB JIT 编译接口集成

GDB JIT 编译接口集成允许 V8 向 GDB 提供 V8 运行时生成的原生代码的符号和调试信息。

当 GDB JIT 编译接口被禁用时,GDB 中的典型回溯包含标记为 ?? 的帧。这些帧对应于动态生成的代码。

#8  0x08281674 in v8::internal::Runtime_SetProperty (args=...) at src/runtime.cc:3758
#9  0xf5cae28e in ?? ()
#10 0xf5cc3a0a in ?? ()
#11 0xf5cc38f4 in ?? ()
#12 0xf5cbef19 in ?? ()
#13 0xf5cb09a2 in ?? ()
#14 0x0809e0a5 in v8::internal::Invoke (construct=false, func=..., receiver=..., argc=0, args=0x0,
    has_pending_exception=0xffffd46f) at src/execution.cc:97

但是,启用 GDB JIT 编译接口允许 GDB 生成更具信息量的堆栈跟踪。

#6  0x082857fc in v8::internal::Runtime_SetProperty (args=...) at src/runtime.cc:3758
#7  0xf5cae28e in ?? ()
#8  0xf5cc3a0a in loop () at test.js:6
#9  0xf5cc38f4 in test.js () at test.js:13
#10 0xf5cbef19 in ?? ()
#11 0xf5cb09a2 in ?? ()
#12 0x0809e1f9 in v8::internal::Invoke (construct=false, func=..., receiver=..., argc=0, args=0x0,
    has_pending_exception=0xffffd44f) at src/execution.cc:97

GDB 未知的帧对应于没有源信息的原生代码。有关更多详细信息,请参阅 已知限制

GDB JIT 编译接口在 GDB 文档中指定:https://sourceware.org/gdb/current/onlinedocs/gdb/JIT-Interface.html

先决条件 #

启用 GDB JIT 编译接口 #

GDB JIT 编译接口目前默认情况下不包含在编译中,并且在运行时被禁用。要启用它:

  1. 使用定义了 ENABLE_GDB_JIT_INTERFACE 的编译 V8 库。如果您使用 scons 构建 V8,请使用 gdbjit=on 运行它。
  2. 启动 V8 时传递 --gdbjit 标志。

要检查您是否已正确启用 GDB JIT 集成,请尝试在 __jit_debug_register_code 上设置断点。此函数被调用以通知 GDB 有关新的代码对象。

已知限制 #