macでchromiumをビルドしてxcodeでデバッグ

新しいmacbook proを買ってchromiumをビルドしたので作業を記録

chromiumの開発者はubuntuでビルドすることが多いみたいです

環境

2.2 GHz core i7, メモリ 16GB

デバッグビルドするとソース・バイナリ合わせて100GBくらいになるので空き容量が必要

ソースコードの取得

公式ドキュメント通りにやればOK

Checking out and building Chromium for Mac

ソースコードの取得。数時間かかる

$ git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
$ export PATH="$PATH:/path/to/depot_tools"
$ mkdir chromium && cd chromium
$ git config --global core.precomposeUnicode true
$ fetch chromium
$ cd src

ビルド

chromiumはninjaというビルドツールが使われている

ここではビルドはninjaで行い、デバッグxcodeで行う

gnはgoogleで使われているmakeみたいなツールらしい

$ gn gen out/gn --ide=xcode

設定ファイルを書く。

$ vim out/gn/args.gn
$ cat out/gn/args.gn
# Build arguments go here.
# See "gn args <out_dir> --list" for available build arguments.

dcheck_always_on = true
is_component_build = true

ビルド。数時間かかる

$ autoninja -C out/gn chrome

エラー1

...
../../third_party/blink/renderer/platform/shared_buffer.h:38:10: fatal error: 'third_party/blink/renderer/platform/wtf/std_lib_extras.h' file not found
#include "third_party/blink/renderer/platform/wtf/std_lib_extras.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
[27541/36317] CXX obj/third_party/blink/renderer/bindings/core/v8/bindings_core_impl/v8_custom_element_value_setter.o
ninja: build stopped: subcommand failed.

対処

$ gclient sync

エラー2

...
fatal error: cannot open file '/Users/knagashi/work/chromium/src/out/gn/../../third_party/skia/include/core/SkPostConfig.h': Too many open files
1 error generated.

対処

$ ulimit -n 10000

ビルドに成功すると実行ファイルができる

$ out/gn/Chromium.app/Contents/MacOS/Chromium

(aliasをchromiumに設定)

デバッグ

以下のブログを参考にxcodeデバッグする

https://zhuanlan.zhihu.com/p/24911872

(この人のブログはすごく面白い。わざわざmacでビルドしようと思ったのはこの人に影響されたせい)

chromiumのファイル数はとても多いので、インデックスをしないように設定する

ちなみにインデックスすると2時間くらいかかる。

$ defaults write com.apple.dt.XCode IDEIndexDisable 1

xcodeを開く。このとき、"Automatically Create Schemes"を選択する

$ open out/gn/all.xcworkspace

ブレークポイントを設定する。

なんでもいいけど、DocumentLoader::DataReceivedとゆうメソッドに設定する。

このメソッドはHTTPレスポンスを処理し、HTMLのパーサーに渡す

https://chromium.googlesource.com/chromium/src/+/4bbb3621b0854a3a3792f87c24e2c9283e9c7a88/third_party/blink/renderer/core/loader/document_loader.cc#830

f:id:nagashimashi:20190108230426p:plain

chromiumをターミナルから起動する。

このとき、プロセスのPIDが表示される(以下の39954)ので、あとでxcodeからアタッチする

$ chromium --renderer-startup-dialog
...
[39954:775:0108/232111.152967:ERROR:content_switches_internal.cc(110)] Renderer (39954) paused waiting for debugger to attach. Send SIGUSR1 to unpause.
...

xcodeの上のメニューから Debug > Attach to Processを選択し、さっき起動したプロセスを選ぶ

起動したchromiumで何かしらのサイトを開く。

twitter.comを開いた結果

f:id:nagashimashi:20190108232548p:plain

dataとゆう引数にtwitterのHTMLが入っていることがわかる