在 V8 中调试 CodeStubAssembler (CSA) 代码

Debugging CodeStubAssembler (CSA) code in V8

我目前正在尝试调试 V8 中的一些 CodeStubAssembler 内置函数。

如果我没理解错的话,CSA 只是花哨的 C++ 代码,可以高效地为不同平台生成汇编指令。

但是,即使在调试版本中,我也无法在 builtins/*-gen.cc 文件中的任何代码上使用 gdb 设置断点。既不是通过在文件和源代码行上设置断点,也不是通过尝试在函数名称上中断。唯一可以通过 运行 objdump -D 对目标文件进行反汇编的方法。但我想在 运行.

时看到它

能否以某种方式在 CSA 生成的内置函数上设置断点?

这里是 V8 开发人员。 CSA 生成 汇编代码,确实如此。当 mksnapshot 二进制 运行 作为 V8 构建过程的一部分时,它会这样做。 CSA 代码本身不包含在最终二进制文件(d8libv8.so)中,仅包含其输出。所以 CSA 代码 运行s 的时间与生成的内置 运行.

的时间完全不同

结果是:

  • 您可以像在任何其他 C++ 代码上一样在 CSA 代码上放置断点——如果您 运行 调试器中的 mksnapshot 二进制文件(或者如果您在没有编译 V8 的情况下快照,但那是 (1) 启动时超慢和 (2) 已弃用)。然后您可以单步执行 CSA 代码,因为它会发出 Turbofan IR 图,然后 Turbofan 后端会将其转换为机器代码。

  • 您可以通过将 DebugBreak() 指令放入 CSA 代码并重新编译,将断点放入 CSA-generated 内置函数。然后,您可以逐步执行生成的说明。请注意,将没有(C++ 或其他)源代码可用,您必须在 GDB 中使用 "layout asm"。

  • 如果你想使用 GDB 的工具将断点放入 CSA-generated 内置函数中,你必须以某种方式获取它的地址(这是可能的,但很麻烦,通过isolate->builtins) 然后在要中断的原始地址上放置一个断点。

  • 有时"printf debugging"更方便。为此,有 CodeStubAssembler::Print(...)。 (请注意,CSA 中的普通 printf 将在 mksnapshot 时间执行,并且不会影响生成的内置函数;而 CSA::Print 将代码发送到生成的内置函数中,该代码将在 运行时间。这可能是展示我在上面试图描述的效果的最具说明性的方式。)