安装
安装过程比较简单,按照 官网文档 即可。
需要注意如下几点:
- 依赖Xcode,如果是安装的Xcode的命令行工具,需要先删除后再安装Xcode的软件,然后运行Xocde,同意协议。
- 依赖 depot_tools,安装说明
- 不要直接clone,需要用depot_tools来拉取代码
- 代码量有9G,建议科学上网
- 建议使用GN编译
- 编译至debug版本,相关参数如下
is_component_build = true is_debug = true symbol_level = 2 target_cpu = "x64" use_goma = false v8_enable_backtrace = true v8_enable_fast_mksnapshot = true v8_enable_slow_dchecks = true v8_optimized_debug = false v8_expose_symbols = true v8_symbol_level = 2 cppgc_enable_object_names = true v8_enable_disassembler = true v8_enable_gdbjit = true
注意
- gdb继承需要在编译v8时加入
v8_enable_gdbjit=true
参数 - 只有在linux下才能加载symbols,从而在gdb中显示函数名,源代码等信息,其他系统下则无法加载,打印debug信息时,源码相关信息可能会缺失
运行
编译成功后会在你指定的目录下生成d8文件,执行d8后进入v8的shell模式
或者直接执行js文件 ./d8 path_to_js_file
调试
Built-in functions
V8内置了一些函数可以用于调试,它们有的用c++编写,甚至也有用汇编实现。为了能在v8中执行这些原生函数,需要在执行时带上特定参数:
./d8 -allow_natives_syntax
常用函数:
%DebugPrint
,可以用来打印调试信息,内存结构等。%DebugPrintPtr
,打印指针所指内容
%SystemBreak()
打断点,使v8中断,配合GDB使用
%DebugTrace();
打印调用栈
还有其他内置函数,可以在 此处 查看。
GDB
全称 GNU Project debugger
,简单来说就是一个调试器,可以实现特定参数启动,断点等功能。
安装
brew安装即可。
值得注意的是mac下gdb获得有控制进程的权限,所以一些额外的工作:对gdb进行签名以获取系统信任。
具体步骤参照此处
另外安装一个gdb的插件gdb-peda,可在gdb中显示寄存器,内存信息,输出也更加美观友好 地址
命令
运行v8,此时会进入gdb的shell
gdb ./d8
带参数运行v8
r --allow_natives_syntax
执行特定js文件
r --allow_natives_syntax /Users/hang/mine/index.js
其他命令:
layout asm
查看汇编码layout regs
查看寄存器信息info files
查看可执行文件的结构,可打印出bss段,数据段之类的信息
info all-registers
查看所有寄存器info frame
查看调用栈b xxx
设置断点n
单步执行c
继续执行info b
查看断点信息.
打印内存 x/nfu addr
- n:输出单元的个数。
- f:输出格式。x代表16进制形式输出,o代表8进制形式输出,等。
- u:标明一个单元的长度。b是一个byte,h是两个byte(halfword),w是四个byte(word),g是八个byte(giant word)
v8中c代码的调试
- 只能通过函数名设置断点
- 如果设置断点,必须先在Initialize函数处设置一个初始断点
js文件的断点调试(无法通过gdb断点调试js代码)
- 借助
%DebugPrint
和%SystemBreak
在js文件中打印数据和设置断点 - 然后在gdb中运行该文件
- gdb会自动在断点处中断,然后打印出寄存器和栈帧信息