Hatak::Techlog

Verba volant, scripta manent.

Perl で Segmentation Fault が起きたときの調べかた

サーバを構築した際に嵌まったのでメモしておきます。

CentOS6 系のサーバに perlbrew + Carton で環境を構築していたのですが、一通り構築が終わって plackup すると segmentation fault となってしまったのでした。 /var/log/messages を見てもこんなログばかり。

Jun 18 19:28:48 xx-xxxx kernel: app.psgi[2084] general protection ip:322fe17088 sp:49302b8e8cb3704b error:0 in ld-2.12.so[322fe00000+20000]

こんなとき、Perl に coredump を吐かせて gdb で見ることで当たりをつけることができます。

# core file size を設定(今回は仮に unlimited に)
limit -c unlimited
# segfault を起こすコマンドを実行
carton exec -- plackup app.psgi
# -> セグフォ
# gdb [実行ファイル] [コアダンプファイル]
gdb `which perl` core.2084

こうすることで、gdb のコンソールが表示されます。 あとは where コマンドで関数の呼び出し順序を調べたり、list を使って該当ソースを見たりして当たりをつけましょう。

ulimit で設定していないと core ファイルが生成されないかもしれない、というお話でした。 このような当たりの付け方は Perl に限らず他のプログラムでも同様にできると思います。

ちなみに今回は MySQL-shared のパッケージが足りず、DBD::mysql がうまく入っていなかったためでした。。 local を丸ごと削除して再度 carton install で解決しました。