サーバを構築した際に嵌まったのでメモしておきます。
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 で解決しました。