Bitcoin Core を GDB でデバッグする(ユニットテスト編)
シリーズになるかは未定ですw
Bitcoin Core のテストの実行
$ make check
ユニットテスト、エンドツーエンドテストをまとめて実行するには make check が便利です。CIなどでテストを回すときも、このコマンドを実行すればよいかと思います。
$ src/test/test_bitcoin
ユニットテストのみを実行するときにはこのバイナリを実行するのが便利です。オプションを指定して、テストファイル単位で実行することもできます。
↓のオプションをつけてよく実行しています。
--log_level=all
--run_test=[test file name]
他にもメモリリークを調べたり、エラー時に gdb を起動したりなどあります。まだまだ使いこなせていないので、使いこなしていきたい。
GDB を使う
さて、本題です。GDB 慣れているわけではないので、必ずしも効率的な使い方にはなっていないかもですが、一応使えています;
$ gdb src/test/test_bitcoin
すると GDB が起動し、以下のようなプロンプトがでます。
(gdb)
実行
(gdb) run --log_level=all --run_test="block_tests"
run コマンドで実行します。この時オプションも渡せます。
ブレイクポイント
(gdb) break CBlockHeader::GetHash() const
のように関数を指定してブレイクポイントを設定できます。TABで補完が効くので、適当に打ってTABで保管しながら入力するよ問と思います。
ブレイクしたあとの操作は step, next, continue などでできます。
また、clear ですべてのブレイクポイントを削除できます。他にもたくさんコマンドありますので、 help breakpoints でヘルプを見てみてください。
所感
こんな感じでコマンドラインからもデバッグできますが、IDE出やりたいですね。CLion は GDB をサポートしているので、ちゃんと設定してそっちでやりたい。。