【问题标题】:How can I print V8 interpreter machine code?如何打印 V8 解释器机器代码?
【发布时间】:2018-11-11 21:08:50
【问题描述】:

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

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

foo(1, 2);

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

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

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

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

提前谢谢你。

【问题讨论】:

  • 谷歌搜索“显示 v8 机器代码”我看到很多链接,例如this

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


【解决方案1】:

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

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

使用 d8 激活像 gdb 这样的调试器

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

【讨论】:

  • 我明白了。非常感谢您的详细解释。你解释说,由于点火是一个解释器,它不会打印机器级代码完全有意义。但是,如果您不介意,我想问一件事。在 objects.cc 中有两个单独的 Disassemble 函数。一个用于字节码,另一个用于代码。
  • 我的猜测是,如果我在 flag-definition.h 中将 ENABLE_DISASSEMBLE 设置为 true,那么当我使用 d8 运行时,code::Disassemble 应该会触发(不太确定该标志)。但是,它仍然只是简单地打印 bytecode::Disassemble。有没有办法让 Code::Disassemble 被调用?我想要打印源位置和 pc 偏移位置。
  • Code::Disassemble 反汇编代码,Bytecode::Disassembler 反汇编字节码。你不能反过来使用它们。
猜你喜欢
  • 1970-01-01
  • 2015-03-23
  • 2021-02-27
  • 2018-01-19
  • 1970-01-01
  • 2011-04-11
  • 2010-09-21
  • 1970-01-01
  • 2019-03-21
相关资源
最近更新 更多