【问题标题】:How to read assembler code for NodeJS in 20212021 年如何阅读 NodeJS 的汇编代码
【发布时间】:2021-10-07 03:47:22
【问题描述】:

我想为我的简单程序读取生成的选项代码:

function test() {
  const i = 2845884;
  const k = 3;

  return i == 2845884 ? k : 7;
}

test();

我发现这个要点说我需要从源代码构建 d8 并使用 --trace-opt-verbose 标志运行它。

https://gist.github.com/kevincennis/0cd2138c78a07412ef21

我在网上找到的其他方法都对我不起作用。看起来所有当前的解决方案都已过时。

如何查看将为该程序生成哪些选项代码?

【问题讨论】:

    标签: reverse-engineering v8


    【解决方案1】:

    如何查看将为该程序生成哪些选项代码?

    对于这个程序,你已经看到了所有优化的代码,因为不会为它生成优化的代码,因为它运行的时间不足以让优化编译值得付出努力.

    一般来说,要打印 V8 生成的优化代码,你需要三样东西:

    (1) 具有反汇编器支持的二进制文件。这在 Debug 和“optdebug”构建中是默认开启的;对于发布版本,您需要 GN arg v8_enable_disassembler = true

    (2) 命令行标志--print-opt-code

    (3) 一个运行热到可以优化的函数。

    尝试循环调用您的test()。如果您仍然看不到任何内容,请更频繁地运行循环。
    (阈值因 V8 版本、测试程序大小和行为而异,并且由于后台编译可能还包括您的硬件,所以我不能在这里说明一般的经验法则。对于单行函数,预计需要几千个电话。)


    回答您的另一个问题:是的,V8 的优化编译器支持常量折叠,您的测试程序将被折叠为 return 3


    旁注:

    我发现这个要点说我需要从源代码构建 d8 并使用 --trace-opt-verbose 标志运行它。

    --trace-opt-verbose 从未打印过优化代码,并且您链接的要点并没有声称它确实如此。 (也就是说,这个要点提出了一堆相当可疑的说法,所以它不是一个特别好的来源。)

    看起来所有当前的解决方案都已过时。

    或者更准确地说:一个要点并没有解决您的问题。

    仅在 SO 上,您就可以找到 How to print the compiled instructions in V8 engine?V8 will not print out disassemblyAre there ways to see the assembly code for the code generated by any of the JavaScript jits, especially V8's?,它们都在处理这个问题的变体。

    这一切最近都没有改变;至少从 2014 年开始,构建标志是一项要求,命令行标志以及仅在一段时间后才开始优化这一事实至少自 2011 年以来一直没有改变。

    FWIW,自己构建 V8 的最简单方法是关注official documentation。该流程使用的gm.py 帮助程序脚本甚至会自动为您设置v8_enable_disassembler 标志。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-05-20
      • 1970-01-01
      • 2016-08-09
      相关资源
      最近更新 更多