金曜日と土曜日にマジでハマったので、記事にしておきます。
現象
構築しているWebアプリの特定のページにアクセスすると、このような状態に陥りました。
- ブラウザにはエラーページが表示される。が、5xx系のエラーページではなく、接続が絶たれた旨のエラーメッセージ。
- Apacheのアクセスログには、アクセスがあったことすら記録されない。
- Apacheのエラーログには、こんなメッセージが。 child pid xxxx exit signal Segmentation fault (11) (xxxxは数字。プロセス番号。)
※ここで言うエラーログとは、VirtualHostのエラーログではなくて、デフォルトのエラーログです。VirtualHostの時は要注意。
ネット上に転がっている情報
Apacheのエラーログをもとに検索していくと、メモリ関連のエラーであるということしか掴むことができませんでした。
これ以上の調査のためには、デバッガを使ってプロセスに接続してどーのこーの…しないといけない、という話も複数の場所で聞こえてきました。非常に面倒ですね。
原因
様々な調査を行った結果、原因がPHPコードの Stack Overflow エラーであることを突き止めました。
大いに単純化すると、こんな感じの処理をやってました。
function recursiveFunc() { // some operation recursiveFunc(); }
エラーになること自体は至極当然の話ですし、初歩的なプログラムの誤り(他の人のね。笑)なのですが、エラーメッセージがこれでは、なかなか見つけるのは難しいですね。
もちろん、このエラーメッセージを起こす原因は他にも存在する訳ですし。