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

79

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

Что это за ошибка сегментации, как я могу это исправить, я понятия не имею, и было бы замечательно.

UPDATE:

PHP Version 5.3.4, OSX local development
Server version: Apache/2.2.17 (Unix)
CakePhp: 1.3.10
  • 0
    Нужна дополнительная информация о конфигурации, например, если версии php и используемых модулей обновлены, и если вы используете какой-то вид кэширования или ускоритель.
  • 0
    Можете ли вы сказать мне, какая информация вам нужна и как ее получить, чтобы я мог опубликовать ее?
Показать ещё 2 комментария
Теги:
cakephp
error-logging

3 ответа

56
Лучший ответ

Прикрепите 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-дни. Интересно, почему это может демонстрировать такое поведение? Он не нашел много символов из моего билда, но это должно дать менее информативный след, нет?
  • 0
    Хм, это странно. Можете ли вы убедиться, что процесс, к которому на самом деле относится segfaults, подключен к gdb? проверьте dmesg для pid процесса segfaults.
Показать ещё 11 комментариев
17

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

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

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

  • 0
    Но как я мог узнать, какой это?
  • 0
    Для меня (на Debian Stretch) это был модуль Apache mod-geoip - теперь я использую расширение php geoip-extension
Показать ещё 1 комментарий
15

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

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

  • 2
    У меня была такая же проблема при сжатии Debian с apache / php / mysql после некоторого обновления. Я установил его на output_buffering = 4096 и теперь страницы снова работают. Спасибо
  • 2
    И у меня работает только output_buffering = 8192 . Большое спасибо!
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню