从Node中转储v8 JIT输出

13

Node.js(或v8周围的某个其他v8接口或包装器)能否输出来自v8 JIT的生成汇编代码?

我想看看各种片段生成的汇编代码长什么样。


我已经尝试过这个,但它没有输出任何内容:node --expose-debug-as=d -e "function f(){return 1;}; d.Debug.disassemble(f)" - slipheed
有没有特定的代码片段您想要调查? - Vyacheslav Egorov
1个回答

25

你需要确保 node.js 是使用 V8 反汇编器构建的。在调试版中,它默认启用。对于发布版(在使用 GYP 构建的最新版本 Node.js 中),你可以通过以下方式启用:

GYP_DEFINES="v8_enable_disassembler=1 v8_object_print=1" ./configure

并重新构建节点。

当启用反汇编器时,您可以使用标志如 --print-code--print-code-stubs--print-opt-code--code-comments 来查看 V8 生成的代码。

如果您想要调查优化编译器使用的 IR,请使用 --trace-hydrogen 并查看 hydrogen.cfg(可以使用 C1 Visualizer 查看)。


这些信息还是最新的吗? - Oleksii Rudenko
1
@OleksiiRudenko 是的,大部分是这样。为什么?现在Node默认情况下在发布和调试中都启用了反汇编器(https://github.com/nodejs/node/blob/master/common.gypi#L21)。此外,我建议使用IRHydra (http://mrale.ph/irhydra/2) 而不是C1 Visualizer - 但除此之外所有标志都是相同的。 - Vyacheslav Egorov
1
IRHydra看起来真的很酷!谢谢,知道现在不需要重新编译node真是太好了。我想知道IRHydra是否与Benchmark.js集成?我的意思是它能否从分析中排除无关的benchmark.js代码?而且直接从基准测试中捕获编译产物真的有意义吗?还是创建隔离的示例更有意义? - Oleksii Rudenko
1
@OleksiiRudenko 不,它不会排除任何内容 - 它对你正在查看的代码持中立态度,实际上很难确定什么是相关的,什么不是。对于你的第二个问题的答案取决于你正在查看什么类型的代码。在某些情况下,你需要一个独立的示例,在某些情况下(微)基准测试可以提供足够的数据 - 当你决定在这样低的级别上进行优化时,没有通用的答案。 - Vyacheslav Egorov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接