"[Aviso] error de segmentación de la señal de salida XXXX del pid secundario (11)" en Apache error.log [cerrado]

100

Estoy usando la pila Apache / PHP / MySQL.
Usando como marco CakePHP.

De vez en cuando me sale una página en blanco. No puedo depurarlo a través de Cake, así que eché un vistazo al apache error.log y esto es lo que obtengo:

[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)

¿Qué es este error de segmentación y cómo puedo solucionarlo?

ACTUALIZAR:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
mgPePe
fuente
Necesita más información sobre la configuración, por ejemplo, si las versiones de php y los módulos usados ​​están actualizadas y si usa algún tipo de caché o acelerador.
CodeCaster
¿Puede decirme qué información necesita y cómo obtenerla para que pueda publicarla?
mgPePe
También verifique esto: stackoverflow.com/questions/15689765/…
trante
Últimamente tuve muchos de esos en mis registros de apache, también segfault (11). Los míos fueron causados ​​por APC y los errores se detuvieron tan pronto como deshabilité APC en php nuevamente. Pero el tuyo podría tener muchas otras causas.
Meetai.com

Respuestas:

66

Adjunte gdb a uno de los procesos secundarios httpd y vuelva a cargar o continúe trabajando y espere a que se bloquee y luego mire el backtrace. Haz algo como esto:

$ 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

...

Ahora adjunte gdb a uno de los procesos secundarios, en este caso PID 690 (las columnas son 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.

Espere el choque ... luego:

(gdb) backtrace

O

(gdb) backtrace full

Debería darte una pista de lo que está pasando. Si presenta un informe de error, debe incluir el rastreo.

Si la falla es difícil de reproducir, puede ser una buena idea configurar Apache para que solo use un proceso secundario para manejar las solicitudes. La configuración es algo como esto:

StartServers 1
MinSpareServers 1
MaxSpareServers 1
Mattias Wadman
fuente
1
Me acabo de encontrar con esto y parece que cuando tengo gdb adjunto a un proceso secundario no obtengo el segfault y apache nunca termina de representar la página. (Reproducir la falla de segmento de otra manera es solo una cuestión de presionar actualizar, como sucede en cada recarga). Ha pasado un tiempo desde que trabajé con personas más cercanas a las cadenas de herramientas de metal en mis días de C. Me pregunto por qué podría exhibir este comportamiento. No encontró muchos de los símbolos de mi compilación, pero eso debería producir un rastreo de retroceso menos informativo, ¿no?
lucian303
Hmm eso es raro. ¿Puede asegurarse de que el proceso al que segfaults es el que está adjunto a gdb? compruebe dmesgel pid del proceso segmentado.
Mattias Wadman
GDB no funciona. Gives meUnable to access task for process-id 70: (os/kern) failure.
mgPePe
¿Es esto OSX? tal vez revise stackoverflow.com/questions/11504377/…
Mattias Wadman
2
encontró la solución: llame set follow-fork-mode childy luego adjunte al proceso principal (el que genera procesos secundarios) -> stackoverflow.com/questions/15126925/…
maxgalbu
24

Una falla de segmentación es un error interno en php (o, menos probablemente, apache). A menudo, la falla de segmentación es causada por uno de los módulos php más nuevos y menos probados, como imagemagick o subversion.

Intente deshabilitar todos los módulos no esenciales (en php.ini) y luego vuelva a habilitarlos uno por uno hasta que se produzca el error. Es posible que también desee actualizar php y apache.

Si eso no ayuda, debe informar un error de php .

Phihag
fuente
Pero, ¿cómo podría saber cuál es?
mgPePe
Para mí (en Debian Stretch) fue el módulo Apache mod-geoip- ahora uso la extensión php geoip en su lugar
Christopher K.
@mgPePe Para saber cuál es, simplemente deshabilite todos los módulos no esenciales (comience con todos los desarrollados externamente como mod-geoip). ¿Continúa el problema? Luego deshabilite más. ¿No ve más segfaults? Habilite más módulos hasta que lo haga. Si tiene inclinaciones técnicas y tiene un depurador, consulte la excelente respuesta de @Mathias Wadmann. Sin embargo, tenga en cuenta que un depurador puede engañarlo; a veces, el bloqueo puede estar en otro módulo.
phihag
18

¿Ha intentado aumentar el output_buffering en su php.ini?

¿Qué significa "zend_mm_heap corrupto" ?

Wayne
fuente
4
Tuve el mismo problema en debian squeeze con apache / php / mysql después de alguna actualización. Lo configuré output_buffering = 4096y ahora las páginas funcionan nuevamente. Thx
rubo77
3
Y para mí solo output_buffering = 8192funciona. ¡Muchas gracias!
Oleg
2
Y ahora, en otra página, output_buffering = 8192causa segfault, que se corrigió con la configuración output_buffering = Off. Estoy muy confundido.
Oleg
1
Han pasado años, pero para cualquier otra persona que se tropiece con esto como lo hice yo ... Descubrí que desactivar el búfer de salida para el servidor y luego hacer una edición basada en directorio o archivo usando un archivo htaccess era el camino a seguir. El almacenamiento en búfer de salida determina cuántos datos conservar antes de publicarlos para el usuario. Con frases breves, esto probablemente provocará un error. En archivos más grandes, corre el riesgo de sobrecargar el proceso.
Carro abandonado