1時間ごとにApacheの子プロセスセグメント。 Webサーバーの障害。スレッド化されていないPHP 5.2.17 ApacheモジュールとApacheプリフォークMPMを実行しています。いくつかのコアダンプ、gdb、および phpのgithubからのこの.gdbinitファイル)を使用してhttpdを実行しました。 repo 、それぞれのgdbにこのコマンドを入力します。
dump_bt executor_globals.current_execute_data
Gdbやphpインタープリターの内部動作の経験がないため、結果から何も作成できません。
core.22762
[0x53896ef0] () :-2118682552
[0x538977a0] () /Statement/Interface.php:113
[0x538978a0] /Zend/Db/Statement/Interface.php()
core.22791
[0x538977a0] () @:0
[0x538978a0] ()
core.5568
[0x53896ef0] () :2061035360
[0x538977a0] () :1767992432
[0x538978a0] ()
core.30384
[0x538977a0] () :0
[0x538978a0] ()
core.3091
[0x53896ef0] mysql_query():992424253
[0x538977a0] () ~:17
[0x538978a0] ()
(core.3091もProgram terminated with signal 11, Segmentation fault.
の後にこれを示しています)
#0 0x00002b6e7ad8d67d in zend_do_fcall_common_helper_SPEC (execute_data=0x7fff53896ef0) at /usr/src/debug/php-5.2.17/Zend/zend_vm_execute.h:217
217 EX_T(opline->result.u.var).var.fcall_returned_reference = return_reference;
より良いスタックトレースを取得するためにgdbに入力できるものは他にありますか? Apacheセグメンテーションフォールトをデバッグするときに他に何かすることはありますか?
どんな助けでも大歓迎です、ありがとう。
これは以前にも見たことがあります。PHPアプリの開発者にコードをチェックしてもらい、PHPとApacheの(ディストリビューションからの)最新バージョンがあることを確認する以外に、あなたができることはあまりありません。
Op-Codeキャッシャー(アクセラレータ、APC、またはXCache)を実行している場合は、それらをオフにしてみることができます。これらは、奇妙なセグメンテーション違反を引き起こすことが知られています。
もちろん、これまでは、短期的な修正のために、いくつかの印象的なハッキングソリューションをセグフォールティングシステムに展開する必要がありました。たとえば、このcronジョブはうまく機能しました。
# Restart Apache when a segfault is found in the most recent line of errorlog
#*/5 * * * * tail -n1 /var/log/Apache2/error.log | grep 'Segmentation fault' && /etc/init.d/Apache2 restart
または、もう少し賢い方法を試すこともできます:#*/5 * * * * /usr/bin/wget http://www.my-site.com/ -T10 -O 2> /dev/null - | grep "Hosted by" > /dev/null || /usr/local/bin/brutally_restart_Apache.sh
Brutally_restartは次のとおりです。
#!/bin/sh
/usr/sbin/Apache2ctl stop
sleep 6
killall -9 Apache2
sleep 4
/usr/sbin/Apache2ctl start