[примечание] дочерний pid XXXX сигнал выхода Ошибка сегментации (11) в apache error.log

Я использую стек 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

person mgPePe    schedule 12.10.2011    source источник
comment
Требуется дополнительная информация о конфигурации, например, актуальны ли версии php и используемых модулей, и если вы используете какое-то кеширование или ускоритель.   -  person CodeCaster    schedule 12.10.2011
comment
Можете ли вы сказать мне, какая информация вам нужна и как ее получить, чтобы я мог опубликовать ее?   -  person mgPePe    schedule 12.10.2011
comment
Также проверьте следующее: stackoverflow.com/questions/15689765/   -  person trante    schedule 23.01.2014
comment
В последнее время у меня было много таких в моих журналах apache, также segfault (11). Мои были вызваны APC, и ошибки прекратились, как только я снова отключил APC в php. Но у вас могло быть много других причин.   -  person Meetai.com    schedule 23.03.2014
comment
Может показаться глупым, но я исправил это, просто перезапустив apache2.   -  person x43    schedule 22.01.2021


Ответы (3)


Присоедините 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

Or

(gdb) backtrace full

Должен дать вам некоторое представление о том, что происходит. Если вы отправляете отчет об ошибке, вы должны включить обратную трассировку.

Если сбой трудно воспроизвести, может быть хорошей идеей настроить Apache на использование только одного дочернего процесса для обработки запросов. Конфиг выглядит примерно так:

StartServers 1
MinSpareServers 1
MaxSpareServers 1
person Mattias Wadman    schedule 13.10.2011
comment
Я только что столкнулся с этим, и кажется, что когда у меня есть gdb, прикрепленный к дочернему процессу, я не получаю segfault, и apache никогда не заканчивает рендеринг страницы. (В противном случае воспроизведение segfault - это просто вопрос обновления, как это происходит при каждой перезагрузке). Прошло некоторое время с тех пор, как я работал с металлическими цепочками инструментов в дни моего C. Интересно, почему он может проявлять такое поведение. Он не нашел много символов из моей сборки, но это должно дать менее информативную обратную трассировку, не так ли? - person lucian303; 19.08.2012
comment
Хм, это странно. Можете ли вы убедиться, что процесс, вызывающий ошибку segfaults, действительно связан с тем, к которому вы подключили gdb? проверьте dmesg на предмет pid процесса, с которым произошла ошибка. - person Mattias Wadman; 19.08.2012
comment
GDB не работает. Дает мне Unable to access task for process-id 70: (os/kern) failure. - person mgPePe; 12.09.2013
comment
Это OSX? возможно, проверьте stackoverflow.com/questions/11504377/ - person Mattias Wadman; 12.09.2013
comment
проблема в том .... какой дочерний процесс? у меня как минимум 10 на моей машине разработчика :) - person maxgalbu; 27.02.2014
comment
нашел решение: вызовите set follow-fork-mode child, а затем подключитесь к родительскому процессу (тому, который порождает дочерние процессы) - ›stackoverflow.com/questions/15126925/ - person maxgalbu; 27.02.2014
comment
Я также сталкиваюсь с аналогичной проблемой на моем сервере. Я попытался подключить gdb, но он завершился без создания трассировки стека. Сбой происходит непредсказуемо, без каких-либо закономерностей в журналах доступа. Я не могу отследить корень проблемы. Любые указатели были бы полезны. Мой сервер размещен на небольшом экземпляре EC2, и я использую AMI Bitnami Ubuntu Lampstack без каких-либо изменений в коде сервера Apache. - person Vishal; 10.04.2014
comment
Вы уверены, что GDB подключен к процессам, которые завершаются сбоем? если gdb просто существует, похоже, что присоединенные процессы существуют нормально. Вы видите, выходит ли он с каким-то кодом выхода? Кстати, если вы получаете бесполезную трассировку стека, попробуйте установить пакеты отладки, такие как apache2-dbg. - person Mattias Wadman; 10.04.2014
comment
На самом деле существует несколько дочерних процессов, и я попытался подключить gdb к разным процессам, но все они нормально завершились без какого-либо кода. Есть ли какой-то конкретный дочерний процесс, который нужно отслеживать? - person Vishal; 10.04.2014
comment
Вы пытались изменить конфигурацию apache, чтобы работал только один процесс? а вы уверены, что это вылетает? если да, то вы должны увидеть что-нибудь error.log о существующих процессах и т. д. - person Mattias Wadman; 11.04.2014
comment
Что такое ввп? команда не найдена: gdb - person Daniel Tate; 02.05.2016
comment
Вы имеете в виду gdb? это отладчик GNU, вам может потребоваться как-то его установить - person Mattias Wadman; 02.05.2016
comment
Моя проблема заключалась в том, что у меня был устаревший mod_http2! - person Geremia; 05.04.2017

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

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

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

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

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

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

person Wayne    schedule 13.10.2011
comment
У меня была такая же проблема с debian squeeze с apache / php / mysql после некоторого обновления. Я установил output_buffering = 4096, и теперь страницы снова работают. Спасибо - person rubo77; 16.08.2013
comment
А у меня работает только output_buffering = 8192. Большое спасибо! - person Oleg; 29.01.2014
comment
А теперь, на другой странице, output_buffering = 8192 вызывает segfault, который был исправлен установкой output_buffering = Off. Я очень запутался. - person Oleg; 02.04.2014
comment
Спустя годы, но для всех, кто наткнется на это, как это сделал я ... Я обнаружил, что отключение буферизации вывода для сервера и последующее редактирование на основе каталога или файла с использованием файла htaccess было правильным решением. Буферизация вывода определяет, сколько данных нужно сохранить перед отправкой пользователю. С небольшими однострочниками это скорее всего вызовет ошибку. В больших файлах вы рискуете перегрузить процесс. - person Abandoned Cart; 22.10.2018