如何打印 V8 解释器机器代码?

How can I print V8 interpreter machine code?

假设我有一个函数和一个如下所示的函数调用:

function foo(i, j) {
  return i + j;
}

foo(1, 2);

目前,我可以打印解释器生成的带有标志“--print-bytecode”的字节码,如下所示。

$v8/out/x64.release/d8 --print-bytecode foo.js

我真正感兴趣的是在 CPU 级别打印出的机器代码(我不确定这对于解释器级别是否可行,所以如果不行请告诉我.) 我可以获得指令指针信息来进行某种源代码级调试和寄存器信息。

另外,我在某处读到我可以用 d8 激活像 gdb 这样的调试器(不是 JIT gdb),我不太确定如何激活它。有没有人对以上两个问题有什么建议?

提前致谢。

这里是 V8 开发人员。我不完全确定我是否正确理解了您的要求,但我认为答案是 "it's not possible"。解释器不是编译器,因此在设计上它不会为您的函数生成机器码,只会生成字节码。字节码是 "executed"/由所谓的 "bytecode handlers" 解释的,但它们并不特定于一个函数:相同的字节码总是由相同的处理程序处理,这是 V8 二进制文件的一部分。您可以打印每个处理程序的机器指令,但这对任何 "source level debugging".

都没有帮助

就是说,我不确定 "source level debugging" 是什么意思。如果您想调试 JavaScript 程序,我的建议是使用 Chrome DevTools(或其他浏览器的等效工具)。调试 V8 其实就是为了找 V8中的 bug;使用低级 V8 洞察力检查 JavaScript 变量或设置 JavaScript 断点或诸如此类的东西在理论上是可能的,但比使用浏览器的 DevTools 困难几个数量级——我从来没有这样做过,并建议不要尝试,因为它不是完成这项工作的正确工具。

activate the debugger like gdb with d8

就像你 运行 GDB 中的任何其他程序一样:gdb -args out/x64.debug/d8 foo.js,但见上文:对于 JavaScript 调试,这不会有帮助。