apache経由でC言語プログラムのコア(core)を吐く方法

2010年2月14日

webサービスで処理速度を考慮すると、一部C言語で実装していることがよくあると思います。
そんなとき、Cプログラムにバグがあったらどうやって原因を突き止めるでしょうか? 

まずは、apacheのエラーログをチェックしますよね? 

エラーログは、Debianなら/var/log/apache2/error.logに格納されていますので、

以下のようにして 最近のエラー情報を閲覧できます。

1
$ sudo tail /var/log/apache2/error.log

Cプログラムがセグフォ(Segmentation fault)やアボート(Abort)で停止していたとします。 

その原因を突き止めるために入力条件を再現して、Cプログラムだけ単体で実行して原因を突き止めるのは なかなか時間がかかるものです。


そんなとき最も効率的なのが、コア(Core)を吐かせる方法です。 

コアとはプログラムが異常終了したときに、OS側がそれを検知し、

そのときの実行プロセスのメモリ空間の情報すべてをファイルに吐き出したものです。 


これをGDBに入力すると、異常終了したのがソースの何行目で、

そのときのスタックトレースや 関数の引数情報などをデバッグすることができるので、 

原因を突き止めるための時間を大幅に短縮することが出来ます。

しかしデフォルトでは、プログラムが異常終了してもコアは吐かれません。

なので、以下のようにして apache経由でコアを吐くように設定する必要があります。

1
2
3
4
5
$ emacs /etc/init.d/apache2
# 最初の行あたりに、以下の記述を追加

ulimit -c unlimited
# これで、コアが吐かれるようになります。
これで、apache経由でコアが吐かれるようになるのですが、一点注意することがあります。 

それは、コアが吐かれるのは、C言語プログラムを実行しているときのカレントディレクトリであるということです。

しかも、コアを吐くのはapacheの実行ユーザとなります。


例えばDebianだと、apacheを実行するユーザは「www-data」です。

ですので、 www-dataがC言語を実行するディレクトリにデータを書き込む権限が必要です。 

一時的にデバッグのために書き込めるようにするだけなら、「chmod 666 hoge_dir」という 風に

パーミッションを操作すればよいですが、セキュリティー上コアを吐いたら直ぐに戻すように してくださいね。