首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何查看v8生成的机器码?

如何查看v8生成的机器码?
EN

Stack Overflow用户
提问于 2008-11-10 09:31:58
回答 5查看 12.1K关注 0票数 27

有人知道我如何才能看到v8从Javascript生成的实际机器码吗?我已经在src/api.cc中找到了Script::Compile(),但是我不知道该从哪里开始。

EN

回答 5

Stack Overflow用户

发布于 2009-07-29 00:55:44

我不知道如何从C++代码中调用反汇编程序,但是有一种快捷的方法可以从shell中进行反汇编。

首先,使用反汇编程序支持编译v8:

代码语言:javascript
复制
scons [your v8 build options here] disassembler=on sample=shell

现在您可以使用"--print_code“选项调用shell:

代码语言:javascript
复制
./shell --print_code hello.js

这应该会给你类似这样的结果:

代码语言:javascript
复制
--- Raw source ---
print("hello world");

--- Code ---
kind = FUNCTION
Instructions (size = 134)
0x2ad0a77ceea0     0  55             push rbp
0x2ad0a77ceea1     1  488bec         REX.W movq rbp,rsp
0x2ad0a77ceea4     4  56             push rsi
0x2ad0a77ceea5     5  57             push rdi
0x2ad0a77ceea6     6  49ba59c13da9d02a0000 REX.W movq r10,0x2ad0a93dc159    ;; object: 0xa93dc159 <undefined>
0x2ad0a77ceeb0    16  4952           REX.W push r10
0x2ad0a77ceeb2    18  49ba688b700000000000 REX.W movq r10,0x708b68
0x2ad0a77ceebc    28  493b22         REX.W cmpq rsp,[r10]
0x2ad0a77ceebf    31  0f824e000000   jc 115  (0x2ad0a77cef13)
0x2ad0a77ceec5    37  488b462f       REX.W movq rax,[rsi+0x2f]
0x2ad0a77ceec9    41  4883ec18       REX.W subq rsp,0xlx
0x2ad0a77ceecd    45  49ba094b3ea9d02a0000 REX.W movq r10,0x2ad0a93e4b09    ;; object: 0xa93e4b09 <String[5]: print>
0x2ad0a77ceed7    55  4c8955e0       REX.W movq [rbp-0x20],r10
0x2ad0a77ceedb    59  488945d8       REX.W movq [rbp-0x28],rax
0x2ad0a77ceedf    63  49ba014d3ea9d02a0000 REX.W movq r10,0x2ad0a93e4d01    ;; object: 0xa93e4d01 <String[11]: hello world>
0x2ad0a77ceee9    73  4c8955d0       REX.W movq [rbp-0x30],r10
0x2ad0a77ceeed    77  49baa06c7ba7d02a0000 REX.W movq r10,0x2ad0a77b6ca0    ;; debug: statement 0
                                 ;; code: contextual, CALL_IC, UNINITIALIZED, argc = 1
0x2ad0a77ceef7    87  49ffd2         REX.W call r10
0x2ad0a77ceefa    90  488b75f8       REX.W movq rsi,[rbp-0x8]
0x2ad0a77ceefe    94  4883c408       REX.W addq rsp,0xlx
0x2ad0a77cef02    98  488945e8       REX.W movq [rbp-0x18],rax
0x2ad0a77cef06   102  488be5         REX.W movq rsp,rbp      ;; js return
0x2ad0a77cef09   105  5d             pop rbp
0x2ad0a77cef0a   106  c20800         ret 0x8
0x2ad0a77cef0d   109  cc             int3
0x2ad0a77cef0e   110  cc             int3
0x2ad0a77cef0f   111  cc             int3
0x2ad0a77cef10   112  cc             int3
0x2ad0a77cef11   113  cc             int3
0x2ad0a77cef12   114  cc             int3
0x2ad0a77cef13   115  49ba60657ba7d02a0000 REX.W movq r10,0x2ad0a77b6560    ;; code: STUB, StackCheck, minor: 0
0x2ad0a77cef1d   125  49ffd2         REX.W call r10
0x2ad0a77cef20   128  488b7df0       REX.W movq rdi,[rbp-0x10]
0x2ad0a77cef24   132  eb9f           jmp 37  (0x2ad0a77ceec5)

RelocInfo (size = 10)
0x2ad0a77ceea8  embedded object  (0xa93dc159 <undefined>)
0x2ad0a77ceecf  embedded object  (0xa93e4b09 <String[5]: print>)
0x2ad0a77ceee1  embedded object  (0xa93e4d01 <String[11]: hello world>)
0x2ad0a77ceeed  statement position  (0)
0x2ad0a77ceeef  code target (context) (CALL_IC)  (0x2ad0a77b6ca0)
0x2ad0a77cef06  js return
0x2ad0a77cef15  code target (STUB)  (0x2ad0a77b6560)

hello world

当然,您的输出会有所不同。上面的代码来自为Linux x64编译的v8主干。

票数 14
EN

Stack Overflow用户

发布于 2014-04-09 18:43:58

您需要构建具有反汇编程序支持的v8。

下载v8源代码。

代码语言:javascript
复制
git clone https://chromium.googlesource.com/v8/v8.git

使用反汇编程序支持进行构建。

代码语言:javascript
复制
make dependencies
make ia32.release objectprint=on disassembler=on

根据需要,使用特定的标志调用d8 (v8 shell)。

代码语言:javascript
复制
out/ia32.release/d8 --code-comments --print-code <app.js>

供参考:

  • --code-comments:包含代码comments.
  • --print-code:将代码打印到stdout.
  • --print-code-stubs:打印代码stubs.
  • --print-opt-code:打印优化的code.
  • --trace-hydrogen:将IR (中间表示)代码打印到hydrogen.cfg。可以使用Java's C1Visualizer.

打开此文件

票数 8
EN

Stack Overflow用户

发布于 2017-10-01 17:58:54

尝试使用NodeJS或Chrome:

通过优化interpreter.

  • -trace-opt
  1. -print-opt-code:生成的compiler.
  2. -print-bytecode:字节码生成的-trace-depot代码:哪些函数是(de)optimized.

请查看@Franziska撰写的这篇文章:

https://medium.com/dailyjs/understanding-v8s-bytecode-317d46c94775

此外,您还可以尝试

D8:它将帮助您编译V8并查看从JavaScript生成的汇编代码。

有关用法和详细信息,请执行以下操作:

http://www.mattzeunert.com/2015/08/19/viewing-assembly-code-generated-by-v8.html

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/277423

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档