D8 是一个非常有用的调试工具,你可以把它看成是 debug for V8 的缩写。我们可以使用 d8 来查看 V8 在执行 JavaScript 过程中的各种中间数据,比如作用域、AST、字节码、优化的二进制代码、垃圾回收的状态,还可以使用 d8 提供的私有 API 查看一些内部信息。

V8 源码编译出来的可执行程序名为 d8。d8 作为 V8 引擎在命令行中可以使用的交互 shell 存在。Google 官方已经不记得 d8 这个名字的由来,但是做为 delveloper shell 的缩写,用首字母 d 和 8 结合,恰到好处。还有一种说法是 d8 最初叫 developer shell,因为 d 后面有 8 个字符,因此简写为 d8,类似于 i18n(internationalization) 这样的简写。参考:Using d8

安装 D8

方法一:自行下载编译

  • v8 google 下载及编译使用
  • 官方文档:Using d8

方法二:使用编译好的 d8 工具 (解压文件,点击 d8 打开(mac 安全策略限制的话,按住 control,再点击,弹出菜单中选择打开)

  • mac 平台
  • linux32 平台
  • linux64 平台
  • win32 平台
  • win64 平台

方法三:mac

# 如果已有 HomeBrew,忽略第一条命令

ruby -e "\$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
brew install v8

方法四:使用 node 代替,比如可以用 node –print-bytecode ./test.js,打印出 Ignition(解释器)生成的 Bytecode(字节码)。

都有哪些 d8 命令可供使用?

1、查看 d8 命令

# 如果不想使用./d8 这种方式进行调试,可将 d8 加入环境变量,之后就可以直接`d8 --help`了

./d8 --help
`2、过滤特定的命令`

# 如果是 Windows 系统,可能缺少 grep 程序,请自行下载安装并添加环境变量

./d8 --help |grep print

如:

  • print-bytecode 查看生成的字节码
  • print-opt-code 查看优化后的代码
  • print-ast 查看中间生成的 AST
  • print-scopes 查看中间生成的作用域
  • trace-gc 查看这段代码的内存回收状态
  • trace-opt 查看哪些代码被优化了
  • trace-deopt 查看哪些代码被反优化了
  • turbofan-stats 打印优化编译器的一些统计数据

如何使用 d8 进行调试?

下面是一段 js 测试代码:

`// test.js function sum(a) { var b = 6; return a + 6; } console.log(sum(3));`

执行命令:

# d8 后面跟上文件名和要执行的命令,如执行下面这行命令,就会打印出 test.js 文件所生成的字节码。

./d8 ./test.js --print-bytecode

# 执行以下命令,输出 9

./d8 ./test.js

内部方法的使用

还可以使用 V8 所提供的一些内部方法,只需要在启动 V8 时传入 –allow-natives-syntax 命令,你就可以在 test.js 中使用诸如 HasFastProperties(检查一个对象是否拥有快属性)的内部方法 (索引属性、常规属性、快属性等下文会介绍)。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
function Foo(property_num, element_num) { //添加可索引属性 
    for (let i = 0; i < element_num; i++) {
        this[i] = `element${i}`; 
    } //添加常规属性 
    for (let i = 0; i < property_num; i++) { 
        let ppt = `property${i}`; 
        this[ppt] = ppt; 
    } 
} 
var bar = new Foo(10, 10); // 检查一个对象是否拥有快属性 
console.log(%HasFastProperties(bar)); 
delete bar.property2; 
console.log(%HasFastProperties(bar)); 

执行:

./d8 --allow-natives-syntax ./test.js

# 依次打印:true false