Conselhos para Depurar o Apache com Falhas de Segmentação do PHP

5

A cada hora ou mais um processo filho do Apache seg. falhas no nosso servidor web. Estamos executando um módulo PHP 5.2.17 Apache não-encadeado com o Apache prefork MPM. Eu executei o httpd com alguns core dumps, gdb e este arquivo .gdbinit do repositório github do php , digitando este comando no gdb para cada um:

dump_bt executor_globals.current_execute_data

Sem experiência com o gdb ou com o funcionamento interno do interpretador do php, não consigo fazer nada com os resultados.

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 também mostra isso depois de 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;

Existe algo mais que eu possa digitar no gdb para obter um melhor rastreamento de pilha? Há mais alguma coisa que você faz ao depurar falhas de segmentação do Apache?

Qualquer ajuda seria muito apreciada, obrigado.

    
por getWeberForStackExchange 04.08.2011 / 20:14

1 resposta

2

Eu já vi isso antes .. além de fazer com que os desenvolvedores de aplicativos PHP verifiquem o código deles e certifiquem-se de ter versões atualizadas (da sua distribuição) do PHP e do apache, não há muito o que você pode fazer.

Se você estiver executando um cacher Op-Code (eaccelerator, APC ou XCache), você pode tentar desligá-los, eles são conhecidos por causar o segfault estranho.

No passado, tivemos que implantar algumas soluções impressionantemente agressivas em um sistema de segmentação, para correções de curto prazo, é claro. Por exemplo, este cronjob funcionou bem:

# 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

Ou você pode tentar algo um pouco mais inteligente: #*/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

Onde brutally_restart é:

    #!/bin/sh
    /usr/sbin/apache2ctl stop
    sleep 6
    killall -9 apache2
    sleep 4
    /usr/sbin/apache2ctl start
    
por 10.08.2011 / 12:26