“[Aviso] filho pid XXXX saída sinal falha de segmentação (11)” em apache error.log [fechado]

100

Estou usando a pilha Apache / PHP / MySQL.
Usando como framework o CakePHP.

De vez em quando, recebo uma página em branco. Não consigo depurar por meio do Cake, então dou uma olhada no apache error.log e aqui está o que eu obtenho:

[Wed Oct 12 15:27:23 2011] [notice] child pid 3580 exit signal Segmentation fault (11)
[Wed Oct 12 15:27:34 2011] [notice] child pid 3581 exit signal Segmentation fault (11)
[Wed Oct 12 15:30:52 2011] [notice] child pid 3549 exit signal Segmentation fault (11)
[Wed Oct 12 16:04:27 2011] [notice] child pid 3579 exit signal Segmentation fault (11)
zend_mm_heap corrupted
[Wed Oct 12 16:26:24 2011] [notice] child pid 3625 exit signal Segmentation fault (11)
[Wed Oct 12 17:57:24 2011] [notice] child pid 3577 exit signal Segmentation fault (11)
[Wed Oct 12 17:58:54 2011] [notice] child pid 3550 exit signal Segmentation fault (11)
[Wed Oct 12 17:59:52 2011] [notice] child pid 3578 exit signal Segmentation fault (11)
[Wed Oct 12 18:01:38 2011] [notice] child pid 3683 exit signal Segmentation fault (11)
[Wed Oct 12 22:20:53 2011] [notice] child pid 3778 exit signal Segmentation fault (11)
[Wed Oct 12 22:29:51 2011] [notice] child pid 3777 exit signal Segmentation fault (11)
[Wed Oct 12 22:33:42 2011] [notice] child pid 3774 exit signal Segmentation fault (11)

O que é essa falha de segmentação e como posso corrigi-la?

ATUALIZAR:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
mgPePe
fonte
Precisa de mais informações sobre configuração, por exemplo, se as versões do php e módulos usados ​​estão atualizados e se você usa algum tipo de cache ou acelerador.
CodeCaster de
Você pode me dizer quais informações você precisa e como obtê-las, para que eu possa publicá-las?
mgPePe
Verifique também: stackoverflow.com/questions/15689765/…
trante
Eu tive muitos deles em meus logs do apache recentemente, também segfault (11). Os meus foram causados ​​pelo APC e os erros pararam assim que desativei o APC no php novamente. Mas o seu pode ter muitas outras causas.
Meetai.com

Respostas:

66

Anexe o gdb a um dos processos filho httpd e recarregue ou continue trabalhando e espere por um travamento e então olhe o backtrace. Faça algo assim:

$ ps -ef|grep httpd
0     681     1   0 10:38pm ??         0:00.45 /Applications/MAMP/Library/bin/httpd -k start
501   690   681   0 10:38pm ??         0:00.02 /Applications/MAMP/Library/bin/httpd -k start

...

Agora anexe gdb a um dos processos filhos, neste caso PID 690 (as colunas são UID, PID, PPID, ...)

$ sudo gdb
(gdb) attach 690
Attaching to process 690.
Reading symbols for shared libraries . done
Reading symbols for shared libraries ....................... done
0x9568ce29 in accept$NOCANCEL$UNIX2003 ()
(gdb) c
Continuing.

Aguarde o travamento ... então:

(gdb) backtrace

Ou

(gdb) backtrace full

Deve lhe dar alguma pista do que está acontecendo. Se você enviar um relatório de bug, deverá incluir o backtrace.

Se a falha for difícil de reproduzir, pode ser uma boa ideia configurar o Apache para usar apenas um processo filho para lidar com as solicitações. A configuração é mais ou menos assim:

StartServers 1
MinSpareServers 1
MaxSpareServers 1
Mattias Wadman
fonte
1
Acabei de encontrar isso e parece que, quando tenho gdb anexado a um processo filho, não recebo o segfault e o apache nunca termina de renderizar a página. (Reproduzir o segfault de outra forma é apenas uma questão de apertar o botão de atualização, uma vez que acontece a cada recarga). Já faz algum tempo que não trabalhei com correntes de ferramentas de metal nos meus dias de C. Eu me pergunto por que ele pode exibir esse comportamento. Não encontrou muitos símbolos da minha construção, mas isso deve apenas produzir um backtrace menos informativo, não?
lucian303 de
Hmm isso é estranho. Você pode ter certeza de que o processo que segfaults realmente está em que você está anexado gdb? verifique dmesgo pid do processo com falha de segmento.
Mattias Wadman
GDB não funciona. Gives meUnable to access task for process-id 70: (os/kern) failure.
mgPePe
Este é o OSX? talvez verifique stackoverflow.com/questions/11504377/…
Mattias Wadman
2
encontrou a solução: chame set follow-fork-mode childe anexe ao processo pai (aquele que gera processos filho) -> stackoverflow.com/questions/15126925/…
maxgalbu
24

Uma falha de segmentação é um erro interno no php (ou, menos provável, no apache). Freqüentemente, a falha de segmentação é causada por um dos módulos php mais novos e menos testados, como imagemagick ou subversion.

Tente desativar todos os módulos não essenciais (in php.ini) e, em seguida, reative-os um a um até que ocorra o erro. Você também pode querer atualizar o php e o apache.

Se isso não ajudar, você deve relatar um bug de php .

phihag
fonte
Mas como posso saber qual é?
mgPePe
Para mim (no Debian Stretch) era o módulo Apache mod-geoip- eu agora uso a extensão geoip php
Christopher K.
@mgPePe Para descobrir qual é, simplesmente desabilite todos os módulos não essenciais (comece com todos os desenvolvidos externamente, como mod-geoip). O problema continua? Em seguida, desative mais. Não vê mais nenhum segfaults? Ative mais módulos até que você faça. Se você tem inclinação técnica e tem um depurador, veja a excelente resposta de @Mathias Wadmann. Esteja ciente de que um depurador pode enganá-lo - às vezes, a falha pode ser em outro módulo.
phihag
18

Você já tentou aumentar o output_buffering no seu php.ini?

O que significa "zend_mm_heap corrompido" ?

Wayne
fonte
4
Eu tive o mesmo problema no debian squeeze com apache / php / mysql após alguma atualização. Eu configurei para output_buffering = 4096e agora as páginas funcionam novamente. Thx
rubo77
3
E para mim só output_buffering = 8192funciona. Muito obrigado!
Oleg
2
E agora, em outra página, output_buffering = 8192provoca segfault, que foi corrigido pela configuração output_buffering = Off. Estou muito confuso.
Oleg,
1
Passaram-se anos, mas para qualquer pessoa que se deparar com isso como eu ... descobri que desligar o buffer de saída para o servidor e, em seguida, fazer uma edição baseada em diretório ou arquivo usando um arquivo htaccess era o caminho a percorrer. O buffer de saída determina quantos dados manter antes de postar para o usuário. Com pequenas linhas, isso provavelmente causará um erro. Em arquivos maiores, você corre o risco de sobrecarregar o processo.
Carrinho abandonado em