読者です 読者をやめる 読者になる 読者になる

職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

Segmentation Fault

金曜日と土曜日にマジでハマったので、記事にしておきます。

現象

構築しているWebアプリの特定のページにアクセスすると、このような状態に陥りました。

  • ブラウザにはエラーページが表示される。が、5xx系のエラーページではなく、接続が絶たれた旨のエラーメッセージ。
  • Apacheのアクセスログには、アクセスがあったことすら記録されない。
  • Apacheのエラーログには、こんなメッセージが。 child pid xxxx exit signal Segmentation fault (11) (xxxxは数字。プロセス番号。)

※ここで言うエラーログとは、VirtualHostのエラーログではなくて、デフォルトのエラーログです。VirtualHostの時は要注意。

ネット上に転がっている情報

Apacheのエラーログをもとに検索していくと、メモリ関連のエラーであるということしか掴むことができませんでした。
これ以上の調査のためには、デバッガを使ってプロセスに接続してどーのこーの…しないといけない、という話も複数の場所で聞こえてきました。非常に面倒ですね。

原因

様々な調査を行った結果、原因がPHPコードの Stack Overflow エラーであることを突き止めました。
大いに単純化すると、こんな感じの処理をやってました。

function recursiveFunc() {
    // some operation

    recursiveFunc();
}

エラーになること自体は至極当然の話ですし、初歩的なプログラムの誤り(他の人のね。笑)なのですが、エラーメッセージがこれでは、なかなか見つけるのは難しいですね。
もちろん、このエラーメッセージを起こす原因は他にも存在する訳ですし。

検証環境