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 # これで、コアが吐かれるようになります。 |
それは、コアが吐かれるのは、C言語プログラムを実行しているときのカレントディレクトリであるということです。
しかも、コアを吐くのはapacheの実行ユーザとなります。
例えばDebianだと、apacheを実行するユーザは「www-data」です。
ですので、 www-dataがC言語を実行するディレクトリにデータを書き込む権限が必要です。
一時的にデバッグのために書き込めるようにするだけなら、「chmod 666 hoge_dir」という 風に
パーミッションを操作すればよいですが、セキュリティー上コアを吐いたら直ぐに戻すように してくださいね。