"[Hinweis] untergeordnetes PID XXXX-Ausgangssignal Segmentierungsfehler (11)" in apache error.log [geschlossen]

100

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
mgPePe
quelle
Benötigen Sie weitere Informationen zur Konfiguration, z. B. wenn die Versionen von PHP und verwendeten Modulen auf dem neuesten Stand sind und wenn Sie eine Art Caching oder Beschleuniger verwenden.
CodeCaster
Kannst du mir sagen, welche Informationen du brauchst und wie du sie bekommst, damit ich sie posten kann?
mgPePe
Überprüfen Sie auch dies: stackoverflow.com/questions/15689765/…
trante
Ich hatte in letzter Zeit viele davon in meinen Apache-Protokollen, auch Segfault (11). Meine wurden durch APC verursacht und die Fehler wurden gestoppt, sobald ich APC in PHP wieder deaktivierte. Aber deine könnten viele andere Ursachen haben.
Meetai.com

Antworten:

66

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:

$ 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

...

Fügen Sie nun gdb einem der untergeordneten Prozesse hinzu, in diesem Fall PID 690 (Spalten sind 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.

Warten Sie auf den Absturz ... dann:

(gdb) backtrace

Oder

(gdb) backtrace full

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:

StartServers 1
MinSpareServers 1
MaxSpareServers 1
Mattias Wadman
quelle
1
Ich bin gerade darauf gestoßen und es scheint, dass ich, wenn ich GDB an einen untergeordneten Prozess angehängt habe, den Segfault nicht bekomme und Apache das Rendern der Seite nie beendet. (Wenn Sie den Segfault ansonsten reproduzieren, müssen Sie nur auf "Aktualisieren" klicken, da dies bei jedem erneuten Laden der Fall ist.) Es ist schon eine Weile her, dass ich in meinen C-Tagen näher an den Metallwerkzeugen gearbeitet habe. Ich frage mich, warum es dieses Verhalten zeigen könnte. Es wurden nicht viele Symbole aus meinem Build gefunden, aber das sollte nur eine weniger informative Rückverfolgung ergeben, nein?
Lucian303
Hmm das ist komisch. Können Sie sicherstellen, dass der Prozess, bei dem Segfaults tatsächlich auftritt, der ist, an den Sie GDB angehängt sind? Überprüfen Sie dmesgdie PID des fehlerhaften Prozesses.
Mattias Wadman
GDB funktioniert nicht. Gibt mirUnable to access task for process-id 70: (os/kern) failure.
mgPePe
Ist das OSX? Vielleicht überprüfen Sie stackoverflow.com/questions/11504377/…
Mattias Wadman
2
fand die Lösung: Rufen Sie an set follow-fork-mode childund hängen Sie dann an den übergeordneten Prozess an (den, der untergeordnete
maxgalbu
23

Ein 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 .

Phihag
quelle
Aber wie könnte ich wissen, welches es ist?
mgPePe
Für mich (auf Debian Stretch) war es das Apache-Modul mod-geoip- ich benutze jetzt stattdessen die PHP-Geoip-Erweiterung
Christopher K.
@mgPePe Um herauszufinden, um welches es sich handelt, deaktivieren Sie einfach alle nicht wesentlichen Module (beginnen Sie mit allen extern entwickelten Modulen wie mod-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.
Phihag
18

Haben Sie versucht, output_buffering in Ihrer php.ini zu erhöhen?

Was bedeutet "zend_mm_heap beschädigt" ?

Wayne
quelle
4
Ich hatte das gleiche Problem bei Debian Squeeze mit Apache / PHP / MySQL nach einigen Updates. Ich habe es eingestellt output_buffering = 4096und jetzt funktionieren die Seiten wieder. Thx
rubo77
3
Und bei mir output_buffering = 8192funktioniert nur . Vielen Dank!
Oleg
2
Und jetzt, auf einer anderen Seite, output_buffering = 8192verursacht Segfault, der durch Einstellung behoben wurde output_buffering = Off. Ich bin sehr verwirrt.
Oleg
1
Es ist Jahre später, aber für alle anderen, die wie ich darauf stoßen ... Ich fand, dass das Ausschalten der Ausgabepufferung für den Server und das anschließende verzeichnis- oder dateibasierte Bearbeiten mit einer htaccess-Datei der richtige Weg war. Die Ausgabepufferung bestimmt, wie viele Daten vor dem Posten an den Benutzer aufbewahrt werden sollen. Bei kleinen Einzeilern führt dies wahrscheinlich zu einem Fehler. Bei größeren Dateien besteht die Gefahr, dass der Prozess überlastet wird.
Verlassener Wagen