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
php
apache
cakephp
error-logging
mgPePe
la source
la source
Réponses:
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:
...
Maintenant, attachez gdb à l'un des processus enfants, dans ce cas PID 690 (les colonnes sont UID, PID, PPID, ...)
Attendez le crash ... puis:
Ou
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:
la source
dmesg
le pid du processus en panne de segment.Unable to access task for process-id 70: (os/kern) failure.
set follow-fork-mode child
puis attachez-le au processus parent (celui qui génère les processus enfants) -> stackoverflow.com/questions/15126925Un 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 .
la source
mod-geoip
- j'utilise maintenant l'extension php geoip à la placemod-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.Avez-vous essayé d'augmenter output_buffering dans votre php.ini?
Que signifie «zend_mm_heap corrompu» ?
la source
output_buffering = 4096
et maintenant les pages fonctionnent à nouveau. Thxoutput_buffering = 8192
fonctionne que. Merci beaucoup!output_buffering = 8192
provoque un segfault, qui a été corrigé par réglageoutput_buffering = Off
. Je suis très confus.