v8调试环境搭建(Ubuntu22.04)

  • 写在前面

最近开始学习浏览器相关的知识了,这也是以后想深入研究的方向,俗话说工欲善其事,必先利其器。所以记录一下自己v8环境搭建的过程。

相关的知识在网上其实非常多了,但是没有找到ubuntu22.04版本的教程,虽然都差不多,但是我还是决定记录一下自己搭建环境的过程。

参考教程:v8环境搭建

教程讲的非常好,本人也是跟着这个教程做的,只是根据自己的实际情况做出了一些调整。

其次,由于某些东西的存在,导致搭建环境的时候需要科学上网,这里一定要注意,找个速度快而且下载不限速的,不然就和我一样,直接痛苦面具。

本教程的环境:Ubuntu22.04

  • 虚拟机通过主机实现代理

这里虽然和搭建环境没关系,但是还是写一下怎么通过主机为虚拟机实现科学上网,我们需要开启代理客户端的允许其他设备加入的选项(不同的客户端叫法不一样,这里请自行查询)。

然后在ubuntu中打开网络设置,选择手动配置代理,进行如下设置:

在Socks的地方写入主机的IP,这里一定要注意,是主机的IP,不是虚拟机,然后端口就填Socks代理的端口,这个端口可以在工具中查看到。

然后打开浏览器访问www.google.com,能成功访问,就说明成功了。

这里要注意,打开谷歌可能会出现这样的情况:

这里为什么出现这样的情况,原因我不清楚,但是我们可以直接ping www.google.com,能ping通,那就没关系了。

这里成功以后,就不需要像参考教程中那样单独设置git以及其他的代理了,因为此时Ubuntu的所有流量都走的代理了,后面操作起来也比较方便。

  • v8相关工具下载

从这里开始我们进入主题,开始搭建调试v8的环境。

  • depot_tools的安装

    这是一个构建工具,利用该工具可以快速下载代码,并构建编译的环境。

    安装方法如下(安装前请确保你有git,python等工具,没有的话需要先安装):

    1
    2
    3
    4
    5
    6
    git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git 
    echo 'export PATH=/path/to/depot_tools:$PATH' >> ~/.zshrc

    # 第一行命令就是通过git将depot_tools克隆到本地
    # 第二行命令是将depot_tools加入环境变量中,这里需要注意的是,我使用的是zsh,如果你是bash,后面的需要写成~/.bashrc,其他的类似,自行谷歌
    # 根据自身安装的目录,将/path/to/depot_tools改为自己的安装路径就行了
  • ninja的下载与安装

    ninja是一个专门设计来编译类似chromium这样的大型项目的编译工具,可以显著的提高编译的速度。

    安装方法如下:

    1
    2
    3
    4
    5
    6
    git clone https://github.com/ninja-build/ninja.git
    cd ninja && ./configure.py --bootstrap
    echo 'export PATH=/path/to/ninja:$PATH' >> ~/.zshrc
    zsh
    # 这里也是根据自身安装的目录,将/path/to/depot_tools改为自己的安装路径就行了
    # 执行zsh是为了加载环境变量,直接把终端退了重开也行
  • 相关依赖和工具的安装

    这里非常重要,因为我按照教程这一步之后直接执行fetch v8后,他会报错,找了好久不知道是为什么,后来根据报错查阅资料以后发现,这里是因为没有初始化gclient,缺少相关的环境和依赖,这一步不做的话,后面大概率报错,直接执行如下命令就好了。

    1
    gclient

    这里有一个小技巧,这一步根据网速,会出现的慢的要死和快的一批的情况,但是他是没有反馈的,我们并不知道他执行到哪里了,是不是哪一步卡住了,就很难受(比如我就以为卡死了,疯狂ctrl+c,然后重新开始),所以我们可以修改depot_tools中的cipd_bin_setup.sh文件,将下面这一行中的warning改成info,就可以看见他的执行细节了:

    这里原本是warning,我这图里已经改成info了。

  • 安装Turbolizer

    这是一个谷歌开发人员的工具,用来在各个优化阶段来观察TurboFan的sea of nodes图

    需要的依赖的安装方式如下:

    1
    2
    3
    sudo apt-get install curl software-properties-common
    curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -
    sudo apt-get install nodejs

    Turbolizer的安装启动:

    1
    2
    3
    4
    cd v8/tools/turbolizer
    npm i
    npm run-script build
    python -m SimpleHTTPServer
  • GDB中调试v8的插件

    安装方式如下:

    1
    2
    3
    4
    vim ~/.gdbinit
    source /path/to/v8/tools/gdbinit
    source /path/to/v8/tools/gdb-v8-support.py
    # 这里也是一样,/path/to/v8改成前面fetch v8的路径就行了
  • 杂七杂八的依赖(在Sakura大佬的博客看见的)

    1
    sudo apt install binutils python2.7 perl socat git build-essential gdb gdbserver

到这里,我们的依赖以及工具就装的差不多了,可以开始编译v8了,下面来介绍如何利用ninja来编译v8。

  • 编译v8

这里开始就比较容易了,我们基本上已经准备的差不多了,但是由于我是Ubuntu22.04的版本,还是出现了很多奇怪的问题,下面先讲一下正常编译过程的命令,后面会讲一下我遇到的报错以及解决方法,感觉Ubuntu高版本的用户多多少少都会遇到类似的问题。

  • 编译的正常过程

执行如下命令即可:

1
2
3
4
5
6
7
8
9
10
fetch v8
# 下载v8的repo,为后面做准备,如果根据前面的步骤将-log-level从warning调成了info,那这里也是可以看见进度条和细节的
cd v8
git reset --hard [commit hash]
# 这里是为了调洞方便,可以切换到对应版本,不是调洞那就不需要了
gclient sync
# gclient sync 用来下载相关依赖
tools/dev/v8gen.py x64.debug(release版本用 x64.release)
ninja -C out.gn/x64.debug(release版本用x64.release)
# 使用ninja编译v8

编译完成以后,就可以启动我们编号的v8了,这里注意,v8编译好之后的名字叫d8,而不是v8,使用如下命令来启动v8 shell:

1
2
3
./out.gn/x64.debug/d8
# 同上面一样,如果是release版本就改成x64.release就好了
# 如果要直接运行程序,那么执行:./out.gn/x64.debug/d8 xxx.js
  • 疯狂报错

在这里执行tools/dev/v8gen.py x64.debug命令时,我疯狂报错,人都傻了,网上的方法找遍了都没用:

这还只是其中一个错误,还有很多错误,我来一个一个的说一下我遇到的问题以及怎么解决。

  • 报错找不到urllib2的库

这个是因为python版本是python3导致的,哪怕把这里改成网上所说的urllib.request啥的,也没用,因为后面还会报错(没错,我试过了)。

  • 图中那样的报错

这个有两个原因,第一个没有安装pkg-config库,直接执行以下命令就行了:

1
sudo apt install pkg-config

安装以后还在报错也别慌,因为还有第二个原因:默认python版本是python3,前面说了我用的是Ubuntu22.04,默认是没有python2的,那么我们需要先安装python2.7,命令如下:

1
sudo apt install python2.7

然后我们需要把python2.7设置为默认python版本,这里其实不用怕,要用python3的话,直接用命令python3 xxx.py就好了,实在不舒服还可以编译好v8以后换回来也行,用如下命令先检查python替代版本信息:

1
update-alternatives --list python

如果出现如图所示的报错:

这个就是 Python 的替代版本尚未被 update-alternatives 命令识别导致的,执行以下命令:

1
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7  1

这个时候输入命令python --version,就可以看见默认版本是python2.7了,此时再执行命令:

1
tools/dev/v8gen.py x64.debug

就没啥问题了,成功执行:

这里再说一下怎么删除默认python2.7,执行命令:

1
update-alternatives --remove python /usr/bin/python2.7 

执行完这个命令,就删除了默认python替代版本了。

  • 结尾

之前看很多人都说编译v8很痛苦,一直不理解,直到自己来了一次,虽然文章很短,但是这里面的每一步都夹杂着我的眼泪(太菜了),最后,欢迎各位对浏览器感兴趣的师傅一起来交流学习。

  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2022-2023 h1J4cker
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信