GDBでの組み込み関数のデバッグ
V8 v6.9から、GDB(およびおそらく他のデバッガ)でブレークポイントを作成して、CSA/ASM/Torque組み込み関数をデバッグできるようになりました。
(gdb) tb i::Isolate::Init
Temporary breakpoint 1 at 0x7ffff706742b: i::Isolate::Init. (2 locations)
(gdb) r
Thread 1 "d8" hit Temporary breakpoint 1, 0x00007ffff7c55bc0 in Isolate::Init
(gdb) br Builtins_RegExpPrototypeExec
Breakpoint 2 at 0x7ffff7ac8784
(gdb) c
Thread 1 "d8" hit Breakpoint 2, 0x00007ffff7ac8784 in Builtins_RegExpPrototypeExec ()
この場合、プロセス開始時にのみ必要となるため、通常のブレークポイント(GDBでのショートカット「br
」)の代わりに一時的なブレークポイント(GDBでのショートカット「tb
」)を使用すると効果的です。
組み込み関数はスタックトレースでも表示されます。
(gdb) bt
#0 0x00007ffff7ac8784 in Builtins_RegExpPrototypeExec ()
#1 0x00007ffff78f5066 in Builtins_ArgumentsAdaptorTrampoline ()
#2 0x000039751d2825b1 in ?? ()
#3 0x000037ef23a0fa59 in ?? ()
#4 0x0000000000000000 in ?? ()
注意点
組み込み関数にのみ機能します。
ブレークポイントは組み込み関数の開始の位置にのみ設定できます。
組み込み関数ブレークポイントを設定する前に、
Isolate::Init
の最初のブレークポイントは必要です。これは、GDBはバイナリーを変更し、起動時にバイナリーの組み込み関数セクションのハッシュを確認するためです。そうでなければ、V8はハッシュの不一致に関する文句を言います。# Fatal error in ../../src/isolate.cc, line 117 # Check failed: d.Hash() == d.CreateHash() (11095509419988753467 vs. 3539781814546519144).