Bitcoinをカスタマイズする際にエラーで落ちて出力されたCoreファイルをトレースする

Bitcoin(ビットコイン)

bitcoinの開発を行なっているとどうしてもセグメンテーションエラーなどでプログラムがとまってCoreファイル吐いて落ちたりします。

そんなときはCoreファイルを解析するとデバッグがしやすいです。

Sponsored Link


エラーの詳細を調べる

やり方は簡単で、Bitcoinがセグメンテーションエラーで落ちると core.bitcoind.XXXXX のようなエラーファイルが作成されます。
(そもそも、Bitcoinのソースをカスタマイズしてコンパイルしないとこんな状況には落ちいらないのですが、、、)

そのあと、gdbというコマンドで解析をします。

gdb 実行可能ファイル名 Coreファイル

がフォーマットでbitcoindをいじっていた場合は

gdb bitcoind core.bitcoind.XXXXX

のようなコマンドを入力することになるかと思います。

スタックトレース

gdbを起動したあとのプロンプト上で”bt”と打つと、以下のような出力がされます
(以下出力は参考サイトのものを流用させてもらってます)

(gdb) bt
#0 0x0073c470 in strcpy () from /lib/libc.so.6
#1 0x08048c25 in Splitf (dest=0xbf9c5ce4 “”, sz=20, src=0x8048d34 “a,b,,sd,,,,as,sds,”, delmit=0x8048d48 “,”, field=0) at ./strutl.c:300
#2 0x080485c5 in main () at ./main.c:13

ここからさらにエラー発生時の変数が何が入ってるいるかは frame と p コマンドを使います。

たとえば、#1のSplitfを呼び出した際の状態を再現するには”frame”を使います

(gdb) frame 1
#1 0x08048c25 in Splitf (dest=0xbf9c5ce4 “”, sz=20, src=0x8048d34 “a,b,,sd,,,,as,sds,”, delmit=0x8048d48 “,”, field=0) at ./strutl.c:300
300 strcpy(dest,tp);

上記の結果からstrcpyの時におちていることがわかるので、変数の dest, tp があやしいので”p”コマンドを使ってこれらを調べてみると

(gdb) p dest
$1 = 0xbf9c5ce4 “”
(gdb) p tp
$2 = 0x0

tp が nullpointerになってますね。これが原因のようです。

というように、bitcoindに関しても同じ感じで原因を調査することができます。

みなさん、bitcoindがCoreファイルを出力したらこれをためしてみましょう。デバッグ早くなりますよー。
(bitcoindカスタマイズするような人はすでにしっている方が多そうですが、備忘録です)

参考

Sponsored Link
コメントはまだありません

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

CAPTCHA


仮想通貨全般
TendermintをDocker使って起動してみる

以前、勉強会に行ってきた際にTendermintの事を聞いて ブロックチェーンプロトコルが実装できる …

仮想通貨全般
Bitcoinのdifficultyを決めるnBitsを理解する

マイニングする際の理解を深めようと思い、マイニング難易度(difficulty)を決めるnBitsに …

仮想通貨全般
EOS Night Meetupにいってきた

今回は、以前からEOSに興味があったので EOS Night Meetupにいってきました。 暗号通 …