«[Notice] child pid XXXX exit signal Segmentation fault (11)» dans apache error.log [fermé]

100

J'utilise la pile Apache / PHP / MySQL.
Utilisation comme framework CakePHP.

De temps en temps, j'obtiens une page blanche vierge. Je ne peux pas le déboguer via Cake, alors je regarde dans le fichier d'erreur apache.log et voici ce que j'obtiens:

[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'est-ce que cette erreur de segmentation et comment puis-je la corriger?

METTRE À JOUR:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
mgPePe
la source
Besoin de plus d'informations sur la configuration, par exemple si les versions de php et des modules utilisés sont à jour et si vous utilisez une sorte de cache ou d'accélérateur.
CodeCaster
Pouvez-vous me dire de quelles informations vous avez besoin et comment les obtenir pour que je puisse les publier?
mgPePe
Vérifiez également ceci: stackoverflow.com/questions/15689765/…
trante
J'en avais beaucoup dans mes journaux apache ces derniers temps, ainsi que segfault (11). Les miens ont été causés par APC et les erreurs se sont arrêtées dès que j'ai à nouveau désactivé APC en php. Mais la vôtre pourrait avoir de nombreuses autres causes.
Meetai.com

Réponses:

66

Attachez gdb à l'un des processus enfants httpd et rechargez ou continuez à travailler et attendez une panne, puis examinez la trace. Faites quelque chose comme ceci:

$ 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

...

Maintenant, attachez gdb à l'un des processus enfants, dans ce cas PID 690 (les colonnes sont 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.

Attendez le crash ... puis:

(gdb) backtrace

Ou

(gdb) backtrace full

Devrait vous donner une idée de ce qui se passe. Si vous déposez un rapport de bogue, vous devez inclure le backtrace.

Si le plantage est difficile à reproduire, il peut être judicieux de configurer Apache pour n'utiliser qu'un seul processus enfant pour gérer les requêtes. La configuration est quelque chose comme ça:

StartServers 1
MinSpareServers 1
MaxSpareServers 1
Mattias Wadman
la source
1
Je viens de rencontrer cela et il semble que lorsque gdb est attaché à un processus enfant, je n'obtiens pas le segfault et qu'apache ne termine jamais le rendu de la page. (Sinon, reproduire le segfault est juste une question d'actualisation comme cela se produit à chaque rechargement). Cela faisait un moment que je n'avais pas travaillé avec des chaînes à outils métalliques plus proches de mes jours C. Je me demande pourquoi il pourrait présenter ce comportement. Il n'a pas trouvé beaucoup de symboles de ma construction, mais cela devrait simplement produire une trace arrière moins informative, non?
lucian303
Hmm c'est bizarre. Pouvez-vous vous assurer que le processus auquel segfaults est réellement celui auquel vous êtes attaché gdb? vérifiez dmesgle pid du processus en panne de segment.
Mattias Wadman
GDB ne fonctionne pas. Gives meUnable to access task for process-id 70: (os/kern) failure.
mgPePe
Est-ce OSX? peut-être vérifier stackoverflow.com/questions/11504377/…
Mattias Wadman
2
trouvé la solution: appelez set follow-fork-mode childpuis attachez-le au processus parent (celui qui génère les processus enfants) -> stackoverflow.com/questions/15126925
...
24

Un défaut de segmentation est une erreur interne dans php (ou, moins probable, apache). Souvent, l'erreur de segmentation est causée par l'un des modules php les plus récents et les moins testés tels que imagemagick ou subversion.

Essayez de désactiver tous les modules non essentiels (in php.ini), puis de les réactiver un par un jusqu'à ce que l'erreur se produise. Vous pouvez également mettre à jour php et apache.

Si cela ne résout pas le problème , vous devriez signaler un bogue php .

Phihag
la source
Mais comment pourrais-je savoir de qui il s'agit?
mgPePe
Pour moi (sur Debian Stretch) c'était le module Apache mod-geoip- j'utilise maintenant l'extension php geoip à la place
Christopher K.
@mgPePe Pour savoir de quel module il s'agit, désactivez simplement tous les modules non essentiels (commencez par tous les modules développés en externe comme mod-geoip). Le problème persiste-t-il? Ensuite, désactivez plus. Vous ne voyez plus de défauts de segmentation? Activez plus de modules jusqu'à ce que vous le fassiez. Si vous êtes techniquement enclin et avez un débogueur, consultez l'excellente réponse de @Mathias Wadmann. Sachez cependant qu'un débogueur peut vous induire en erreur - parfois, le plantage peut être dans un autre module.
phihag
18

Avez-vous essayé d'augmenter output_buffering dans votre php.ini?

Que signifie «zend_mm_heap corrompu» ?

Wayne
la source
4
J'ai eu le même problème sur debian squeeze avec apache / php / mysql après une mise à jour. Je l'ai réglé sur output_buffering = 4096et maintenant les pages fonctionnent à nouveau. Thx
rubo77
3
Et pour moi ne output_buffering = 8192fonctionne que. Merci beaucoup!
Oleg
2
Et maintenant, sur une autre page, output_buffering = 8192provoque un segfault, qui a été corrigé par réglage output_buffering = Off. Je suis très confus.
Oleg
1
C'est des années plus tard, mais pour quiconque tombe sur cela comme moi ... J'ai trouvé que désactiver la mise en mémoire tampon de sortie pour le serveur, puis faire une édition basée sur un répertoire ou un fichier à l'aide d'un fichier htaccess était la voie à suivre. La mise en mémoire tampon de sortie détermine la quantité de données à conserver avant de publier à l'utilisateur. Avec de petits one-liners, cela provoquera probablement une erreur. Dans les fichiers plus volumineux, vous risquez de surcharger le processus.
Panier abandonné