Chromiumをgdbでデバッグする

Chromiumの動作を追う

以前Chromiumソースコードを読み解くツールとしてChromium Code Searchを紹介しました。

glycelery.hatenablog.com

しかし、名前に全く見当がつかなくて検索できない!ということもあると思います。
そんなときはデバッグで実際の動きを追ってやりましょう。
今回はgdbChromiumデバッグする際に有用なコマンドを紹介します。

プロセスを選んでデバッグする

まずはChromiumを起動した状態で、別のコンソールからその実行プロセスIDを調べてみましょう。

$ ps axf

f:id:glycelery:20181024163241p:plain

すると現在実行されているプロセスがツリー状に表示されます。その中にさっき起動したChromiumもありましたね。
今回は新しいタブを開く動作を追うために、試しに赤枠で囲ったプロセスを追ってみましょう。

$ gdb -p 9089

このように"-p"オプションにプロセスIDを指定することで目的のプロセスをデバッグすることができる。
プロセスIDはps axfでいう一番左の列ですね。

子プロセスを追う

gdbでマルチプロセスのアプリケーションを追う場合、通常の設定では子プロセスが発生した場合でも、gdbはもとの親プロセスを追い続けてしまう。
子プロセスでの動作を追いたいときには

> set follow-fork-mode child

と指定することにより、プロセスが分かれた際に子プロセスに追従が移るようになります。

シングルプロセスでデバッグする

上のやり方ではプロセスIDを指定するためどのプロセスで目的の動作が行われているかわかっている必要があった。
しかしプロセスが大量でどのプロセスが何なのかわからない、ということもあると思います。
そんなとき有効なのがシングルプロセスモード。

Chromiumでは以下のオプションが公式でサポートされている...

> r --single-process

f:id:glycelery:20181024163302p:plain

サポートされている...

[7117:7117:1024/155349.170354:ERROR:CONSOLE(1096)] "Uncaught TypeError: Cannot read property 'newTabPage' of undefined", source: chrome-search://local-ntp/local-ntp.js (1096)

されているはず...なんですが...サポートされていないオプションとして複数のエラーが発生する。。
アップデートで消えてしまったのでしょうか。

代わりに

> r -X

上のようなコマンドでシングルプロセスモードを指定することができます。
こちらはエラーもなくデバッグすることが可能。
これにより指定したブレークポイントを逃さず実行することができちゃいます。

最適な方法を

ここまで様々な方法を紹介しましたが、ときにより有効な手立ては違うでしょう。
最適なデバッグ方法を選べると良いですね。