CentOS6 + Apache + PHP で Segmentation fault

突然システムが動かなくなった。
現時点で解決してませんが作業ログを残します。

--- 2014/05/06 追記 ---
解決しました。
CakePHPの $this->loadModel() で
モデルでもないクラスを指定していました。
これにより大量のメモリが消費されてエラーになっていたみたいです。
Apache とか PHP とか関係なかった・・・。
----------------------


【環境】
CentOS6 + Apache + PHP

Apacheのエラーログを見ると ....

child pid 3669 exit signal Segmentation fault (11)

なんだこのエラーは・・・。

Segmentation fault はLinuxのメモリアクセスが問題で発生するエラーらしい。
ここらへんの説明は省略。

OS再起動、Apache再起動でも直らない・・・。

解決方法をググるとcoreファイルを出力する必要があるらしい。
coreファイルとはLinuxが異常終了したときに出力されるエラーログみたいなファイルのこと・・・らしい。

出力方法は以下になる。

以下のように core file size を確認する。

[root@localhost ~]# ulimit -a
core file size          (blocks, -c) 0
 ... 省略 ...

サイズが0なので変更する。

# vim /etc/security/limits.conf

以下を追記

                      • -

root soft core 65536
apache soft core 65536

                      • -

Apacheのconfファイルにcoreファイルの出力先を設定する。

# vim /etc/httpd/conf/httpd.conf

以下を追記。
別に出力先はどこでもいい。

                        • -

CoreDumpDirectory /var/www/html/DirForVm/GachaSample/app/tmp/logs

                        • -

ここでOSを再起動しておく。

# reboot


再起動が完了したら、
再度 Segmentation fault のエラーを発生させてみる。

先ほど設定した出力先に、core.5324 のようなファイルができる。
はずだが、なんかできなかった・・・。
でも出力されているはずなので、find してみたら見つかった。


このcoreファイルをgdbコマンドで確認してみる。
gdbコマンドはC, C++のデバッガーらしい。
以下のように apacheの実行コマンド と ファイルを指定する。

# gdb /usr/sbin/httpd -c ./core.3523

すると、ファイルの中身が表示されていく。
表示が止まるとgdb用のコマンドラインになるので、
whereと打ってエラー箇所を表示させる。

(gdb) where

で、表示されたのが以下の内容。

#0  0xb7569e9d in ?? () from /etc/httpd/modules/libphp5.so
#1  0xb756a489 in _safe_emalloc () from /etc/httpd/modules/libphp5.so
#2  0xb7599f0c in ?? () from /etc/httpd/modules/libphp5.so
#3  0xb759b261 in zend_parse_parameters () from /etc/httpd/modules/libphp5.so
#4  0xb74b701e in ?? () from /etc/httpd/modules/libphp5.so
#5  0xb76119e4 in ?? () from /etc/httpd/modules/libphp5.so
#6  0xb75fe3e6 in execute () from /etc/httpd/modules/libphp5.so
#7  0xb75847b6 in zend_call_function () from /etc/httpd/modules/libphp5.so
#8  0xb746283b in ?? () from /etc/httpd/modules/libphp5.so
#9  0xb76119e4 in ?? () from /etc/httpd/modules/libphp5.so
#10 0xb75fe3e6 in execute () from /etc/httpd/modules/libphp5.so
#11 0xb75847b6 in zend_call_function () from /etc/httpd/modules/libphp5.so
#12 0xb746283b in ?? () from /etc/httpd/modules/libphp5.so
#13 0xb76119e4 in ?? () from /etc/httpd/modules/libphp5.so
#14 0xb75fe3e6 in execute () from /etc/httpd/modules/libphp5.so
#15 0xb75847b6 in zend_call_function () from /etc/httpd/modules/libphp5.so
... 省略 ...

何か libphp5.so が悪いみたい・・・。
ググるPHPのバグみたい。
でも詳しくは分からん・・・。

とりあえず、Apache + PHP を再インストールしてみるけどダメ。

なんなんだこれ・・・。
開発環境を再構築した方が早いのでは・・・。