C++ デバッガ gdb の導入
bitcoin core のプログラムをステップ実行したり、変数の中身を見たりしたい。本記事では mac os 10.13 High Sierra に gdb をインストールし、bitcoind をステップ実行する手順をまとめる。
gdb インストール
まず、 brew を使って gdb をインストールする。ただし gdb の 8.2 と 8.1 は、mac でエラーを起こすため 8.0 をインストールする。具体的には下記のコマンドを実行する。(URLが長すぎて、見かけ上改行されているが、実際は改行しないこと)
code: bash
インストール後に echo "set startup-with-shell off" >> ~/.gdbinit を実行する。
コードサイン
インストールしたばかりの gdb はコードサインが無いためデバッグができない。コードサインを追加するためには mac にデフォルトでインストールされたキーチェーンアクセスを起動する。ターミナルから open -a "Keychain Access.app" で起動できる。起動できたら、メニューの「キーチェーンアクセス」「証明書アシスタント」「証明書を作成」を選択する。記入欄が表示される。
名前はなんでも良いが仮に gdb-sign にする。
証明書のタイプは「コード署名」にする。
以降は設定を変えず「続ける」を連打。
最後に「作成」を押すと「証明書が作成されました」と出る。ウィンドウの左上にある「キーチェーン」ペインの「ログイン」を選択する。そして、右上の検索欄で gdb と入力するとさっき作成した gdb-sign 証明書があることがわかる。それを「キーチェーン」ペインの「システム」にドラッグドロップする。このとき、画面左上の南京錠マークがロック状態だとできないのでロックを外しておく。すべて済ませたら codesign -s gdb-sign /usr/local/bin/gdb を実行し gdb にコードサインをする。コードサイン後は taskgated プロセスを再起動しなければならない。taskgated プロセスは監視されており、停止すると再起動するため、停止だけさせればよい。そのためには sudo pkill -KILL taskgated コマンドを実行する。少し待ってから pgrep taskgated を実行すると、プロセスが再び起動していることを確かめられる。
動作確認
確認用の小さなプログラム test.c を作る。
code: test.c
int main(void) {
printf("hello\n");
return 0;
}
コマンド gcc -g test.c -o test のようにして gcc でコンパイルする。その後 、単に実行するだけならばターミナルに ./test と入力すれば実行できるが gdb を通して実行する場合は gdb ./test と入力して実行する。gdb は入力待ち状態になるため、break main と入力する。これは main 関数に対してブレークポイントを貼る。そして run と入力しプログラムを実行させる。正しく設定できていれば下記のように出力され、さらに入力待ち状態となる。
Thread 2 hit Breakpoint 1, main () at test.c:4
4 printf("hello\n");
動作確認が済んだら quit と入力し gdb を終了させる。
bitcoin core のデバッグ
bitcoin のコードを gdb でデバッグするには最適化オプションを無効化して configure, make をしないといけない。一度普通にビルドしてしまっているなら、それを消してから再ビルドする。具体的には下記のコマンド列を入力する。
code: rebuild.sh
make clean
./configure --enable-debug
make -j 8
以降は make -j 8 だけでよい。make が終わったら普通のプログラムと同じように gdb を実行できる。たとえば gdb bitcoind とする。プログラム引数を与えたい場合は gdb --args bitcoind -regtest のように書く。ユニットテスト test_bitcoin に対しても同じようなやり方で gdb から起動することができる。ただし、gdb の起動時に警告が出てしまう。また、ブレークポイントを設定すると行がずれてしまう。(何かわかったら追記する)
参考サイト