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

时间:2018-11-11 21:08:50

标签: c++ google-chrome google-chrome-devtools v8

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

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),但我不确定如何激活它。有人对以上两个问题有什么建议吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

V8开发人员在这里。我不确定我是否正确理解您的要求,但我认为答案是“不可能”。解释器不是编译器,因此根据设计,它不会为您的函数生成机器码,而仅生成字节码。字节码由所谓的“字节码处理程序”“执行” /解释,但不是特定于函数的:同一字节码始终由同一处理程序处理,这是V8二进制文件的一部分。您可以打印每个处理程序的机器指令,但这对任何“源代码级调试”都没有帮助。

也就是说,我不确定“源代码级调试”是什么意思。如果要调试JavaScript程序,我的建议是使用Chrome DevTools(或其他浏览器的等效工具)。调试V8确实是为了查找V8中的错误。使用低级V8见解来检查JavaScript变量或设置JavaScript断点或理论上不可能的东西,但是比使用浏览器的DevTools困难几个数量级-我从没做过,并且建议不要尝试,因为不是适合该工作的工具。

  

使用d8激活gdb之类的调试器

就像您将在GDB中运行任何其他程序一样:gdb -args out/x64.debug/d8 foo.js,但请参见上文:对于JavaScript调试,这将无济于事。