Ich verwende den Apache / PHP / MySQL-Stack.
Verwendung als Framework CakePHP.
Hin und wieder bekomme ich eine leere weiße Seite. Ich kann es nicht über Cake debuggen, also schaue ich in das Apache error.log und hier ist was ich bekomme:
[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)
Was ist dieser Segmentierungsfehler und wie kann ich ihn beheben?
AKTUALISIEREN:
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
quelle
quelle
Antworten:
Hängen Sie gdb an einen der untergeordneten httpd-Prozesse an und laden Sie es neu oder arbeiten Sie weiter. Warten Sie auf einen Absturz und sehen Sie sich dann die Rückverfolgung an. Mach so etwas:
...
Fügen Sie nun gdb einem der untergeordneten Prozesse hinzu, in diesem Fall PID 690 (Spalten sind UID, PID, PPID, ...).
Warten Sie auf den Absturz ... dann:
Oder
Sollte Ihnen einen Hinweis geben, was los ist. Wenn Sie einen Fehlerbericht einreichen, sollten Sie die Rückverfolgung einschließen.
Wenn der Absturz schwer zu reproduzieren ist, ist es möglicherweise eine gute Idee, Apache so zu konfigurieren, dass nur ein untergeordneter Prozess für die Verarbeitung von Anforderungen verwendet wird. Die Konfiguration sieht ungefähr so aus:
quelle
dmesg
die PID des fehlerhaften Prozesses.Unable to access task for process-id 70: (os/kern) failure.
set follow-fork-mode child
und hängen Sie dann an den übergeordneten Prozess an (den, der untergeordneteEin Segmentierungsfehler ist ein interner Fehler in PHP (oder, weniger wahrscheinlich, Apache). Oft wird der Segmentierungsfehler durch eines der neueren und weniger getesteten PHP-Module wie Imagemagick oder Subversion verursacht.
Deaktivieren Sie alle nicht wesentlichen Module (in
php.ini
) und aktivieren Sie sie dann nacheinander erneut, bis der Fehler auftritt. Möglicherweise möchten Sie auch PHP und Apache aktualisieren.Wenn das nicht hilft, sollten Sie einen PHP-Fehler melden .
quelle
mod-geoip
- ich benutze jetzt stattdessen die PHP-Geoip-Erweiterungmod-geoip
). Geht das Problem weiter? Dann deaktivieren Sie mehr. Sie sehen keine Segfaults mehr? Aktivieren Sie weitere Module, bis Sie dies tun. Wenn Sie technisch veranlagt sind und einen Debugger haben, lesen Sie die ausgezeichnete Antwort von @Mathias Wadmann. Beachten Sie jedoch, dass ein Debugger Sie irreführen kann - manchmal kann der Absturz in einem anderen Modul auftreten.Haben Sie versucht, output_buffering in Ihrer php.ini zu erhöhen?
Was bedeutet "zend_mm_heap beschädigt" ?
quelle
output_buffering = 4096
und jetzt funktionieren die Seiten wieder. Thxoutput_buffering = 8192
funktioniert nur . Vielen Dank!output_buffering = 8192
verursacht Segfault, der durch Einstellung behoben wurdeoutput_buffering = Off
. Ich bin sehr verwirrt.