«[Уведомление] дочерний pid XXXX сигнал выхода Segmentation fault (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? проверьте dmesgpid процесса, с которым произошел сбой.
Маттиас Вадман,
GDB не работает. Дает мнеUnable to access task for process-id 70: (os/kern) failure.
mgPePe
Это OSX? возможно, проверьте stackoverflow.com/questions/11504377/…
Маттиас Вадман,
2
нашел решение: вызовите, set follow-fork-mode childа затем подключитесь к родительскому процессу (тот, который порождает дочерние процессы) -> stackoverflow.com/questions/15126925/…
maxgalbu
24

Ошибка сегментации - это внутренняя ошибка php (или, что менее вероятно, apache). Часто ошибка сегментации вызвана одним из новых и менее протестированных модулей php, таких как imagemagick или subversion.

Попробуйте отключить все несущественные модули (in php.ini), а затем повторно включать их один за другим, пока не возникнет ошибка. Вы также можете обновить php и apache.

Если это не помогает, вы должны сообщить об ошибке php .

Phihag
источник
Но как я мог узнать, что это?
mgPePe
Для меня (в Debian Stretch) это был модуль Apache mod-geoip- теперь я использую вместо него расширение php geoip
Christopher K.
@mgPePe Чтобы узнать, какой именно, просто отключите все несущественные модули (начните со всех, например, сторонних разработанных mod-geoip). Проблема сохраняется? Тогда отключите еще. Больше не видите никаких ошибок? Включите больше модулей, пока не сделаете это. Если вы технически подкованы и у вас есть отладчик, см. Отличный ответ @Mathias Wadmann. Имейте в виду, что отладчик может ввести вас в заблуждение - иногда сбой может быть в другом модуле.
phihag
18

Вы пытались увеличить output_buffering в своем php.ini?

Что означает "zend_mm_heap поврежден" ?

Уэйн
источник
4
У меня была такая же проблема с debian squeeze с apache / php / mysql после некоторого обновления. Я установил его, output_buffering = 4096и теперь страницы снова работают. Thx
rubo77
3
И у меня только output_buffering = 8192работает. Большое спасибо!
Олег
2
И теперь, на другой странице, output_buffering = 8192вызывает segfault, который был исправлен установкой output_buffering = Off. Я очень запутался.
Олег
1
Спустя годы, но для всех, кто наткнется на это, как я ... Я обнаружил, что отключение буферизации вывода для сервера и последующее редактирование на основе каталога или файла с использованием файла htaccess было правильным решением. Буферизация вывода определяет, сколько данных нужно сохранить перед отправкой пользователю. С небольшими однострочниками это скорее всего вызовет ошибку. В больших файлах вы рискуете перегрузить процесс.
Брошенная тележка