web-dev-qa-db-ja.com

PHPセグメンテーション違反でApacheをデバッグするためのアドバイス

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
2
Kirrus