Z
Toggle Nav

Windows 搭建 Chromium 调试环境

开发环境:

  • Windows 11
  • AMD 5900X
  • 32GB 3600Mhz
  • 512GB 970 EVO Plus
  • Visual Studio 2019

clone 源代码

根据 Chromium 官方 Windows 环境搭建指导来 clone 代码。clone 之前需要确保你有稳定高速的代理服务,安装了 Git 及 Python。

clone 代码时推荐使用 CMD 进行,powershell 可能存在找不到相关工具依赖的问题,同时 powershell 下代理设置也比CMD麻烦。

CMD 下设置网络代理:

set http_proxy=http://127.0.0.1:7890
set https_proxy=http://127.0.0.1:7890

使用gclient sync同步代码时会报depot_tools不接受proxy的提示,可以配置boto环境变量来解决。

在任意位置新建.boto文件,内容为

[Boto]
proxy = 127.0.0.1
proxy_port = 7890

然后CMD中输入

set NO_AUTH_BOTO_CONFIG=/path/to/your/.boto

然后再运行gclient sync即可。

安装构建依赖

查看、调试、构建 Chromium 推荐使用 VisualStudio 进行,截止到目前 Chromium 官方支持的最新 VisualStudio 版本为2019,如果你安装了 vs2022 preview 那么 gn 生成 vs 工程文件时会提示找不到 vs。

vs 安装时记得勾选 Windows sdk,同时还需要 Debugging Tools for Windows,这个工具在 vs 安装后没有,你可以从Windows官方站点下载,Windows11 推荐使用第一项 As part of the WDK

build

在 src 目录下运行 gn gen --ide=vs --filters="//chrome;//third_party/blink/*;//cc;//v8" --no-deps out\Default,如果你的所有依赖都装好了,等待十几秒钟出现下面的提示就说明已经成功生成 vs 工程文件,可以打开它通过 vs 进行开发与调试了。

上面的命令会使 vs 加载 //chrome;//third_party/blink/*;//cc;//v8 这几个 project,如果你只是想调试 blink/v8 相关的代码,这些 project 就足够了,vs 中可以直接搜索到这几个 project 的代码。不加任何参数直接生成全量 project,vs 会直接卡死,即使是我的 5900X + 32GB RAM 也顶不住。

生成sln工程文件后用vs打开,点击vs顶部工具栏的生成-生成解决方案开始构建。这一步时间会非常久,具体视你机器配置而定,在我的机器上约 50分钟,建议直接睡一觉。因为这是第一次全量编译,没办法就得这么久,等这次构建好了以后如果不同步上游代码仅作本地修改的话那就只有增量编译了,速度会快得多。

update

使用下面两条命令同步上游代码

git rebase-update
gclient sync -D

debug

生成解决方案完毕后,就正式进入到debug阶段了。在开始debug前vs需要安装两个扩展: Child Process Debugging Power ToolVsChromium,由于 Chromium 多进程架构 ,每个renderer都是独立的子进程,手动attach子进程会比较麻烦,这两个扩展可以帮你自动attach到新创建的子进程上,调试会方便许多(visual studio无愧宇宙第一 C++ IDE)。

现在所有准备工作都做好了,点击顶部工具栏的本地Windows调试器开始运行刚刚编译好的debug版本Chromium,每次开始调试都会重新build,如果你没有修改源代码那么就会使用之前编译好的debug版本,debug版本启动后vs底部工具栏会变成橙色,说明此时正在调试过程中,稍等一下我们的debug版本Chromium就启动了。

等Chromium启动后点击vs顶部的调试 - Attach To Chromium- Choose可以看到目前debug版本的Chromium的所有子进程:

确保底下的Automatically attach to running child processes和Also attach to new child processes when they spawn两项勾选,这样vs就能正确attach到相关进程了。

现在我们要做的就是浏览Chromium的源代码,找到你想调试的源代码,为其某一行添加一个断点,然后在Chromium进行一些操作触发这个断点,之后就是常规的软件调试流程了。

例如我想看看Chromium新建Tab页的窗口初始化流程(也是renderer初始化的一部分),在vs中搜索符号WebLocalFrameImpl::createFrameView,在它里面加一个断点,然后返回Chromium新加一个Tab,可以看到vs此时已经断住了Chromium。

此时Chromium无法进行操作,放掉这个断点点击vs顶部的继续,Chromium就恢复运行了,想要debug其他部分的代码如法炮制即可。

Visual Studio YES!