Я использую стек 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
apache
cakephp
error-logging
мгПеПе
источник
источник
Ответы:
Присоедините gdb к одному из дочерних процессов httpd и перезагрузите или продолжите работу и дождитесь сбоя, а затем посмотрите на трассировку. Сделайте что-нибудь вроде этого:
...
Теперь присоедините gdb к одному из дочерних процессов, в данном случае PID 690 (столбцы - UID, PID, PPID, ...)
Подождите, пока произойдет сбой ... затем:
Или
Должен дать вам понять, что происходит. Если вы отправляете отчет об ошибке, вы должны включить обратную трассировку.
Если сбой трудно воспроизвести, может быть хорошей идеей настроить Apache на использование только одного дочернего процесса для обработки запросов. Конфигурация примерно такая:
источник
dmesg
pid процесса, с которым произошел сбой.Unable to access task for process-id 70: (os/kern) failure.
set follow-fork-mode child
а затем подключитесь к родительскому процессу (тот, который порождает дочерние процессы) -> stackoverflow.com/questions/15126925/…Ошибка сегментации - это внутренняя ошибка php (или, что менее вероятно, apache). Часто ошибка сегментации вызвана одним из новых и менее протестированных модулей php, таких как imagemagick или subversion.
Попробуйте отключить все несущественные модули (in
php.ini
), а затем повторно включать их один за другим, пока не возникнет ошибка. Вы также можете обновить php и apache.Если это не помогает, вы должны сообщить об ошибке php .
источник
mod-geoip
- теперь я использую вместо него расширение php geoipmod-geoip
). Проблема сохраняется? Тогда отключите еще. Больше не видите никаких ошибок? Включите больше модулей, пока не сделаете это. Если вы технически подкованы и у вас есть отладчик, см. Отличный ответ @Mathias Wadmann. Имейте в виду, что отладчик может ввести вас в заблуждение - иногда сбой может быть в другом модуле.Вы пытались увеличить output_buffering в своем php.ini?
Что означает "zend_mm_heap поврежден" ?
источник
output_buffering = 4096
и теперь страницы снова работают. Thxoutput_buffering = 8192
работает. Большое спасибо!output_buffering = 8192
вызывает segfault, который был исправлен установкойoutput_buffering = Off
. Я очень запутался.