"[Сповіщення] дочірній під XXXX сигнал виходу" Помилка сегментації (11) "в apache error.log [закрито]


100

Я використовую стек Apache / PHP / MySQL.
Використання як основи CakePHP.

Раз у раз я отримую порожню білу сторінку. Я не можу налагоджувати це через Cake, тому я заглядаю в apache error.log і ось що я отримую:

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

У чому полягає ця помилка сегментації та як я можу її виправити?

ОНОВЛЕННЯ:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10

Потрібна додаткова інформація про конфігурацію, наприклад, якщо версії php та використовувані модулі оновлені, і якщо ви використовуєте якийсь кеш або прискорювач.
CodeCaster

Чи можете ви сказати мені, яка інформація вам потрібна і як її отримати, щоб я міг її розмістити?
mgPePe

Також перевірте це: stackoverflow.com/questions/15689765 / ...
trante

Останнім часом у мене було багато таких у своїх журналах apache, також segfault (11). Мої були спричинені APC, і помилки припинились, як тільки я знову вимкнув APC у php. Але у ваших може бути багато інших причин.
Meetai.com

Відповіді:


66

Приєднайте gdb до одного з дочірніх процесів httpd і перезавантажте або продовжуйте роботу та чекайте аварії, а потім подивіться на відстань. Зробіть щось подібне:

$ 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

...

Тепер додайте gdb до одного з дочірніх процесів, у цьому випадку PID 690 (стовпці - 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.

Зачекайте аварії ... тоді:

(gdb) backtrace

Або

(gdb) backtrace full

Слід дати вам деяку підказку, що відбувається. Якщо ви подаєте звіт про помилку, вам слід включити зворотний слід.

Якщо збій важко відтворити, може бути гарною ідеєю налаштувати Apache на використання лише одного дочірнього процесу для обробки запитів. Конфігурація виглядає приблизно так:

StartServers 1
MinSpareServers 1
MaxSpareServers 1

1
Я щойно натрапив на це, і, здається, коли я приєднав gdb до дочірнього процесу, я не отримую segfault і apache ніколи не закінчує візуалізацію сторінки. (В іншому випадку відтворення segfault - це лише питання натискання кнопки оновлення, як це відбувається при кожному перезавантаженні). Минуло час, коли я працював з ближчими до металевих ланцюжків інструментів у свої C дні. Цікаво, чому це може проявляти таку поведінку. Він не знайшов багато символів з моєї збірки, але це мало би призвести до менш інформативного зворотного відстеження ні?
lucian303

Гм це дивно. Чи можете ви переконатися, що процес, який насправді segfaults, є тим, до якого ви приєднані gdb? перевірити наявність dmesgпилоподібного процесу.
Маттіас Вадман

GDB не працює. Дає меніUnable to access task for process-id 70: (os/kern) failure.
mgPePe

Це OSX? можливо перевірити stackoverflow.com/questions/11504377 / ...
Маттіас Wadman

2
знайшов рішення: виклик , set follow-fork-mode childа потім прикласти до батьківського процесу (той , який нереститься дочірні процеси) -> stackoverflow.com/questions/15126925 / ...
maxgalbu

24

Помилка сегментації - це внутрішня помилка php (або, що менш вірогідно, апаш). Часто несправність сегментації викликається одним з нових і менш тестованих модулів php, таких як imagemagick або subversion.

Спробуйте вимкнути всі неістотні модулі (в php.ini), а потім повторно ввімкніть їх по одному, поки не з’явиться помилка. Ви також можете оновити php та apache.

Якщо це не допомагає, ви повинні повідомити про помилку php .


Але як я міг знати, хто це?
mgPePe

Для мене (на Debian Stretch) це був модуль Apache mod-geoip- тепер я замість цього використовую php geoip-extension
Christopher K.

@mgPePe Щоб дізнатися, що це таке, просто відключіть усі неістотні модулі (почніть з усіх, таких як зовні mod-geoip). Продовжується проблема? Потім вимкніть більше. Більше не бачите segfault? Увімкніть більше модулів до цього часу. Якщо ви технічно схильні і маєте налагоджувач, дивіться відмінну відповідь @Mathias Wadmann. Будьте в курсі, що налагоджувач може вас ввести в оману - іноді збій може бути в іншому модулі.
фігаг

18

Ви намагалися збільшити випуск продукції в php.ini?

Що означає "пошкоджений zend_mm_heap" ?


4
У мене була така ж проблема і при видавленні Debian з apache / php / mysql після деякого оновлення. Я встановив це output_buffering = 4096і тепер сторінки знову працюють. Thx
rubo77

3
І для мене output_buffering = 8192працює тільки . Дуже дякую!
Олег

2
А тепер, на іншій сторінці, output_buffering = 8192викликає segfault, який було виправлено налаштуваннями output_buffering = Off. Я сильно плутаюсь.
Олег

1
Це минуло років, але для тих, хто натрапляє на це, як я ... Я виявив, що вимкнення буферизації виводу для сервера, а потім здійснення редагування на основі каталогу або файлів за допомогою файлу htaccess - це шлях. Буферування вихідних даних визначає, скільки даних потрібно зберегти перед публікацією для користувача. Що стосується невеликих одношарових, це, ймовірно, призведе до помилки. У великих файлах ви ризикуєте перевантажити процес.
Покинутий кошик
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.