„[Uwaga] child pid XXXX sygnał wyjścia Błąd segmentacji (11)” w apache error.log [zamknięty]

100

Używam stosu Apache / PHP / MySQL.
Używanie jako ramy CakePHP.

Od czasu do czasu otrzymuję pustą białą stronę. Nie mogę go zdebugować za pomocą Cake, więc zaglądam do błędu apache.log i oto co otrzymuję:

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

Co to jest ten błąd segmentacji i jak go naprawić?

AKTUALIZACJA:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
mgPePe
źródło
Potrzebujesz więcej informacji na temat konfiguracji, na przykład czy wersje php i używanych modułów są aktualne i czy używasz jakiegoś rodzaju buforowania lub akceleratora.
CodeCaster
Czy możesz mi powiedzieć, jakich informacji potrzebujesz i jak je zdobyć, abym mógł je opublikować?
mgPePe
Miałem ich ostatnio dużo w moich logach Apache, także segfault (11). Moje były spowodowane przez APC i błędy zatrzymywały się, gdy tylko ponownie wyłączyłem APC w php. Ale twój może mieć wiele innych przyczyn.
Meetai.com

Odpowiedzi:

66

Dołącz gdb do jednego z procesów potomnych httpd i załaduj ponownie lub kontynuuj pracę i poczekaj na awarię, a następnie spójrz na ślad śledzenia. Zrób coś takiego:

$ 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

...

Teraz dołącz gdb do jednego z procesów potomnych, w tym przypadku PID 690 (kolumny to 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.

Poczekaj na awarię ... następnie:

(gdb) backtrace

Lub

(gdb) backtrace full

Powinienem dać ci wskazówkę, co się dzieje. Jeśli zgłaszasz błąd, powinieneś dołączyć ślad.

Jeśli awaria jest trudna do odtworzenia, dobrym pomysłem może być skonfigurowanie Apache do używania tylko jednego procesu potomnego do obsługi żądań. Konfiguracja wygląda mniej więcej tak:

StartServers 1
MinSpareServers 1
MaxSpareServers 1
Mattias Wadman
źródło
1
Właśnie wpadłem na to i wygląda na to, że kiedy mam gdb dołączony do procesu potomnego, nie dostaję błędu segfault, a apache nigdy nie kończy renderowania strony. (W przeciwnym razie odtworzenie błędu segfault jest tylko kwestią naciśnięcia przycisku odświeżania, jak to się dzieje przy każdym ponownym załadowaniu). Minęło trochę czasu, odkąd pracowałem z bliżej metalowymi łańcuchami narzędzi w moich czasach C. Zastanawiam się, dlaczego może przejawiać takie zachowanie. Nie znalazł wielu symboli z mojej kompilacji, ale powinno to po prostu wygenerować mniej informacyjny ślad wstecz, prawda?
lucian303
Hmm, to dziwne. Czy możesz upewnić się, że proces, który segfault faktycznie jest w tobie, jesteś podłączony do gdb? sprawdź dmesgpid uszkodzonego procesu.
Mattias Wadman,
GDB nie działa. Daje miUnable to access task for process-id 70: (os/kern) failure.
mgPePe
Czy to jest OSX? może sprawdź stackoverflow.com/questions/11504377/ ...
Mattias Wadman
2
znalazłem rozwiązanie: zadzwoń, set follow-fork-mode childa następnie dołącz do procesu nadrzędnego (tego, który uruchamia procesy potomne) -> stackoverflow.com/questions/15126925/ ...
maxgalbu
24

Błąd segmentacji to wewnętrzny błąd w php (lub, co mniej prawdopodobne, w Apache). Często błąd segmentacji jest spowodowany przez jeden z nowszych i mniej przetestowanych modułów php, takich jak imagemagick lub subversion.

Spróbuj wyłączyć wszystkie nieistotne moduły (in php.ini), a następnie włączaj je jeden po drugim, aż wystąpi błąd. Możesz także zaktualizować php i apache.

Jeśli to nie pomoże, zgłoś błąd php .

phihag
źródło
Ale skąd mogłem wiedzieć, który to jest?
mgPePe
Dla mnie (na Debian Stretch) był to moduł Apache mod-geoip- zamiast tego używam teraz rozszerzenia geoip php
Christopher K.
@mgPePe Aby dowiedzieć się, który to jest, po prostu wyłącz wszystkie nieistotne moduły (zacznij od wszystkich opracowanych zewnętrznie, takich jak mod-geoip). Czy problem nadal występuje? Następnie wyłącz więcej. Nie widzisz już żadnych segfaultów? Włącz więcej modułów, dopóki tego nie zrobisz. Jeśli masz zdolności techniczne i masz debugger, zobacz doskonałą odpowiedź @Mathias Wadmann. Pamiętaj jednak, że debugger może wprowadzić Cię w błąd - czasami awaria może być w innym module.
phihag
18

Czy próbowałeś zwiększyć output_buffering w swoim php.ini?

Co oznacza „zend_mm_heap uszkodzony” ?

Wayne
źródło
4
Miałem ten sam problem z debian squeeze z apache / php / mysql po jakiejś aktualizacji. Ustawiłem na output_buffering = 4096i teraz strony znów działają. Dzięki
rubo77
3
U mnie output_buffering = 8192działa tylko . Wielkie dzięki!
Oleg,
2
A teraz na innej stronie output_buffering = 8192powoduje segfault, który został naprawiony przez ustawienie output_buffering = Off. Jestem bardzo zdezorientowany.
Oleg
1
Minęło wiele lat, ale dla każdego, kto natknie się na to, tak jak ja ... Przekonałem się, że wyłączenie buforowania danych wyjściowych dla serwera, a następnie edycja w oparciu o katalog lub plik przy użyciu pliku htaccess była drogą do zrobienia. Buforowanie danych wyjściowych określa, ile danych należy zachować przed wysłaniem do użytkownika. W przypadku małych jednowierszowych prawdopodobnie spowoduje to błąd. W przypadku większych plików istnieje ryzyko przeciążenia procesu.
Opuszczony koszyk