安装

安装过程比较简单,按照 官网文档 即可。

需要注意如下几点:

  • 依赖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会自动在断点处中断,然后打印出寄存器和栈帧信息