有没有人知道我怎么看到v8从Javascript生成的实际机器代码?我在src/api.cc
中得到了Script::Compile()
,但我无法弄清楚从那里去哪里。如何查看由v8生成的机器码?
回答
我想你是走在正确的轨道上。
它看起来像你需要从脚本::编译到编译器::编译,这将导致你的代码生成器(codegen * .cc和.h)。
所有这一切都可以这么说,看着codegen-ia32.cc,如果你在构建时定义了ENABLE_DISASSEMBLER ,我认为你的反汇编应该打印出来。
当然,所有这些只是通过快速浏览我在这里的源代码的旧副本,所以YMMV,但我认为这应该起作用。 (看看你的帖子,我看到你正在寻找机器语言,而不是汇编 - 我不确定,但是如果你想要汇编的代码输出,你可能需要修改逻辑,而不是它的反汇编)
我不知道如何从C++代码调用反汇编程序,但有一种快速和肮脏的方式从shell中反汇编。
首先,编译V8与反汇编器支持:
./shell --print_code hello.js
这应该给你这样的::
scons [your v8 build options here] disassembler=on sample=shell
现在你可以用 “--print_code” 选项调用shell
--- 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主干。
您需要使用反汇编程序支持来构建v8。
下载v8源代码。
git clone https://chromium.googlesource.com/v8/v8.git
使用反汇编程序支持构建。
make dependencies
make ia32.release objectprint=on disassembler=on
使用某些标志调用d8(v8 shell),具体取决于你想要的。
out/ia32.release/d8 --code-comments --print-code <app.js>
参考:
- --code-评论:包括代码的注释。
- - 打印代码:打印出代码至标准输出。
- - 打印代码存根:打印代码存根。
- --print-opt-code:打印优化的代码。
- --trace-hydrogen:将IR(中间表示)代码打印到hydrogen.cfg。该文件可以用Java's C1Visualizer打开。
看看v8_root/build/features.gypi
,你会发现V8的反汇编程序相关的和许多其他的编译时功能开关。
尝试或的NodeJS铬:
-print-opt-code
:代码通过优化编译器产生。-print-bytecode
:解释器生成的字节码。-trace-opt
和-trace-depot
:哪些功能是(优化)的。
检查这篇文章@Franziska Hinkelmann:
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
- 1. 如何查看由CLR生成的本机代码?
- 2. 如何查看由.net JITer生成的机器代码的反汇编?
- 3. 如何查看由nHibernate生成的SQL?
- 4. 如何查看机器码?
- 5. 由IBM的企业COBOL编译器生成的查看代码
- 6. 如何查看由Azure计算模拟器生成的错误
- 7. 如何查看编译器为OpenMP构造生成的代码
- 8. 如何检查由C++编译器生成的代码?
- 9. 查看由模板生成的代码的首选方法Haskell
- 10. 如何查看NHibernate生成的查询?
- 11. 查看由Aeson中deriveJSON生成的代码
- 12. 查看由@synthesize for getter/setter生成的代码
- 13. 如何查看由屏幕生成的日志文件(screenlog.0)
- 14. 如何查看由open-uri生成的GET请求标题
- 15. 发送随机生成的号码进行查看
- 16. jQuery - 如何查看jQuery生成的html?
- 17. 如何查看SQL ActiveRecord生成的?
- 18. 如何查看由C/C++程序的gcc(任何flavor)编译器生成的汇编代码?
- 19. 如何在生成的源代码中查看doctype
- 20. 如何在Firefox中查看“生成的HTML代码”?
- 21. 如何在Visual Studio代码中查看JSCode生成的文档?
- 22. 如何在ASP.NET MVC中查看自动生成的代码?
- 23. 如何查看VC++编译器生成的.cod文件?
- 24. 如何设计生成Python代码的代码生成器
- 25. Angular 2组件路由器 - 如何运行查看代码
- 26. Openscenegraph不生成查看器示例
- 27. 如何查看包含由我的方法生成的框架的strackrace?
- 28. 如何生成随机密码
- 29. 如何生成随机密码
- 30. 指数由查询生成器