在 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 代码本身不包含在最终二进制文件(d8
或 libv8.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
将代码发送到生成的内置函数中,该代码将在 运行时间。这可能是展示我在上面试图描述的效果的最具说明性的方式。)
我目前正在尝试调试 V8 中的一些 CodeStubAssembler 内置函数。
如果我没理解错的话,CSA 只是花哨的 C++ 代码,可以高效地为不同平台生成汇编指令。
但是,即使在调试版本中,我也无法在 builtins/*-gen.cc
文件中的任何代码上使用 gdb
设置断点。既不是通过在文件和源代码行上设置断点,也不是通过尝试在函数名称上中断。唯一可以通过 运行 objdump -D
对目标文件进行反汇编的方法。但我想在 运行.
能否以某种方式在 CSA 生成的内置函数上设置断点?
这里是 V8 开发人员。 CSA 生成 汇编代码,确实如此。当 mksnapshot
二进制 运行 作为 V8 构建过程的一部分时,它会这样做。 CSA 代码本身不包含在最终二进制文件(d8
或 libv8.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
将代码发送到生成的内置函数中,该代码将在 运行时间。这可能是展示我在上面试图描述的效果的最具说明性的方式。)