图解 Google V8
李兵
前盛大创新院高级研究员
立即订阅
3749 人已学习
课程目录
已完结 25 讲
0/4登录后,你可以任选4讲全文学习。
宏观视角 (2讲)
开篇词 | 如何学习谷歌高性能 JavaScript 引擎V8?
免费
01 | V8是如何执行一段JavaScript代码的?
JavaScript设计思想篇 (7讲)
02 | 函数即对象:一篇文章彻底搞懂JavaScript的函数特点
03 | 快属性和慢属性:V8是怎样提升对象属性访问速度的?
04 | 函数表达式:涉及大量概念,函数表达式到底该怎么学?
05|原型链:V8是如何实现对象继承的?
06|作用域链:V8是如何查找变量的?
07|类型转换:V8是怎么实现1+“2”的?
08|答疑:如何构建和使用V8的调试工具d8?
V8编译流水线 (8讲)
09 | 运行时环境:运行JavaScript代码的基石
10 | 机器代码:二进制机器码究竟是如何被CPU执行的?
11 | 堆和栈:函数调用是如何影响到内存布局的?
12 | 延迟解析:V8是如何实现闭包的?
13 | 字节码(一):V8为什么又重新引入字节码?
14|字节码(二):解释器是如何解释执行字节码的?
15 | 隐藏类:如何在内存中快速查找对象属性?
16 | 答疑: V8是怎么通过内联缓存来提升函数执行效率的?
事件循环和垃圾回收 (6讲)
17 | 消息队列:V8是怎么实现回调函数的?
18 | 异步编程(一):V8是如何实现微任务的?
19|异步编程(二):V8是如何实现async/await的?
20 | 垃圾回收(一):V8的两个垃圾回收器是如何工作的?
21 | 垃圾回收(二):V8是如何优化垃圾回收器执行效率的?
22|答疑:几种常见内存问题的解决策略
结束语 (2讲)
结束语 | 我的前端学习踩坑史
结课测试 | 这些V8的知识你都掌握了吗?
图解 Google V8
15
15
1.0x
00:00/00:00
登录|注册

08|答疑:如何构建和使用V8的调试工具d8?

李兵 2020-04-02
你好,我是李兵。
今天是我们第一单元的答疑环节,课后有很多同学留言问我关于 d8 的问题,所以今天我们就来专门讲讲,如何构建和使用 V8 的调试工具 d8。
d8 是一个非常有用的调试工具,你可以把它看成是 debug for V8 的缩写。我们可以使用 d8 来查看 V8 在执行 JavaScript 过程中的各种中间数据,比如作用域、AST、字节码、优化的二进制代码、垃圾回收的状态,还可以使用 d8 提供的私有 API 查看一些内部信息。

如何通过 V8 的源码构建 D8?

通常,我们没有直接获取 d8 的途径,而是需要通过编译 V8 的源码来生成 d8,接下来,我们就先来看看如何构建 d8。
其实并不难,总的来说,大体分为三部分。首先我们需要先下载 V8 的源码,然后再生成工程文件,最后编译 V8 的工程并生成 d8。
接下来我们就来具体操作一下。考虑到使用 Windows 系统的同学比较多,所以下面的操作,我们的默认环境是 Windows 系统,Mac OS 和 Liunx 的配置会简单一些。

安装 VPN

V8 并不是一个单一的版本库,它还引用了很多第三方的版本库,大多是版本库我们都无法直接访问,所以,在下载代码过程中,你得先准备一个 VPN。

下载编译工具链:depot_tools

取消
完成
0/1000字
划线
笔记
复制
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
该试读文章来自付费专栏《图解 Google V8》,如需阅读全部文章,
请订阅文章所属专栏。
立即订阅
登录 后留言

精选留言(16)

  • h.g. 置顶
    mac brew install v8 就可以直接使用 d8 了

    作者回复: 赞

    2020-05-24
    3
    6
  • sugar
    这篇太棒了,终于有这样的手把手带着调试v8的课节了…真的希望这个系列课程中能多加餐一些面向v8底层 c++调试的一些内容,市面上这类资料良莠不齐 且很多资料时效性已经非常差了不具有参考性。几年前,那时我第一次编译chromium,一台顶配的macbookpro生生跑了一下午,然后要是想自己试着改一些地方的代码 反复编译出来看效果就更费劲了。当时一直苦于没人带走了很多弯路,如今看到老师您的这篇专栏喜出望外,真的很希望能多聊些深入的东西,照顾一下各个阶段的学员哈

    作者回复: chromium是个庞然大物,下载代码和配置工程和编译代码都是非常费时费力的,调试也是非常麻烦,各种跳转,各种跨进程通信

    2020-04-02
    13
  • champ可口可乐了
    找到了编译好的d8工具:
    mac平台:
    https://storage.googleapis.com/chromium-v8/official/canary/v8-mac64-dbg-8.4.109.zip
    linux32平台:
    https://storage.googleapis.com/chromium-v8/official/canary/v8-linux32-dbg-8.4.109.zip
    linux64平台:
    https://storage.googleapis.com/chromium-v8/official/canary/v8-linux64-dbg-8.4.109.zip
    win32平台:
    https://storage.googleapis.com/chromium-v8/official/canary/v8-win32-dbg-8.4.109.zip
    win64平台:
    https://storage.googleapis.com/chromium-v8/official/canary/v8-win64-dbg-8.4.109.zip

    作者回复: 不错

    2020-04-17
    2
    8
  • 踢车牛
    搞了两天,终于在 mac 上把 v8 编译成功了,记录下踩过的坑
    1. v8 编译依赖于 xcode, 首先安装相应的 xcode,然后 sudo xcode-select -s /Users/videojj/test/Xcode.app。
    2. 代理最好开成全局模式,否则,可能某些地址会访问不到,我通过 fetch v8 是就经常失败,然后全局模式后就成功了。
    3. xcode 大约 7G, v8 7.48G, depot_tools 400M,因此要想编译成功,首先硬盘空间要够。
    2020-04-11
    1
    2
  • 子云
    我有几点疑问呀。
    一:test.js 里似乎不能出现 require 和 import,d8 直接会报错连语法树都编译不了,。
    二:垃圾回收那个例子

    ```
    // 本节里的这个例子,我数了数一共打印了 14 次 Scavenge....
    function strToArray(str) {
      let i = 0;
      const len = str.length;
      let arr = new Uint16Array(str.length);
      for (; i < len; ++i) {
        arr[i] = str.charCodeAt(i);
      }
      return arr;
    }

    // 换成下面这个,之打印一次 Scavenge..... ,这是为什么?
    function strToArray(str) {
      let i = 0;
      const len = str.length;
      let arr = str.split(',');
      return arr;
    }
    ```

    作者回复: d8比较简单,不支持太复杂的功能,最好是单一文件

    第二个strtoarray中没有分配新的大数据,也就不会很快沾满新生代,当然就不会频繁触发垃圾回收器了

    2020-05-05
    1
  • -_-|||
    文中”不过使用了 delete bar.property2 之后,就没有快属性了”为什么一删就没快属性了,内存不连续了?
    2020-04-16
    4
    1
  • 高亮~
    glcient sync 命令应该是错的
    应该是gclient sync

    作者回复: 嗯,我改下

    2020-04-04
    1
  • Aaaaaaaaaaayou
    老师,代码中有 require 引用模块的语句,使用 d8 调试的时候会报 require is not defined,个人理解 require 应该是 nodejs 这个运行环境才能识别。我现在的目标是想看下有模块引入的时候 AST 是什么样子的,请问这个有其他方式吗

    作者回复: d8比较简单,不支持太复杂的功能

    2020-04-22
    1
  • 文蔺
    经过一番猛折腾 最后发现了jsvu 这个工具才是安装 d8 最简单的方式。https://github.com/GoogleChromeLabs/jsvu

    作者回复: 赞

    2020-04-19
  • 踢车牛
    老师,我从 mac 下编译的确实没有 d8 print-ast选项,第一节的 d8 --print-ast test.js 你是如何编译的?
    2020-04-11
    2
  • 杨越
    es6开始js开始从基于对象变成了面向对象,因为有了extends关键词,这种说法对吗老师?
    2020-04-02
    7
  • leaf
    在jvm中,针对存在大循环的方法,osr优化是将该方法的栈帧从解释栈帧在线替换成编译栈帧,从而让该方法进入编译执行模式。请问老师确定v8的osr是您文中的意义吗?
    2020-04-02
  • 一步
    nodejs 有个参数 也是打印有关 v8 的信息的 node --v8-options ,只不过这个 能打印的信息 比 d8 少了一部分
    2020-04-02
  • 成楠Peter
    思考题
    1、如文章所说,需要频繁切换栈帧操作的,在函数中的for循环操作。
    2、函数代码行数太少,V8会合并,减少不必要的开销
    3、在关键代码(频繁调用)中,函数频繁调用会增加开销,V8会优化这一部分代码,合并代码。
    2020-04-02
  • Bazinga
    mac 安装了 depot_tools 怎么配置,直接运行 glcient sync 运行不出啊

    作者回复: 需要将depot_tools的目录设置到环境变量中

    2020-04-02
    4
  • luckyone
    osr跟二进制转换有依赖关系吗,比如想要osr第一步要转二进制,还是不用转成二进制直接可以osr
    2020-04-02
收起评论
16
返回
顶部