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


仮想通貨全般
ZCash、Ethereumでも使われているゼロ知識証明とは?

最近話題沸騰の「ゼロ知識証明」、またの名を「Zk-Snark」を簡単にですが調べてみました。 参考ペ …

Dapps
Plasma Porker をとりあえず動かす

最近、Plasma界隈で賑わしている Plasma Prime。 Plasma Prime desi …

EOS
EOSを学べるサイト 〜 Elemental Battles

最近何かと注目を浴び始めているEOS。 イオス(EOS)最初のステーブルコインCarbonUSDが誕 …