我使用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
将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
应该能给你一些线索。如果你提交一个bug报告,你应该包括回溯。
如果崩溃很难重现,那么配置Apache只使用一个子进程来处理请求可能是一个好主意。配置是这样的:
StartServers 1
MinSpareServers 1
MaxSpareServers 1
分段错误是php(或者不太可能是apache)的内部错误。通常,分段错误是由较新的和较少测试的php模块(如imagemagick或subversion)引起的。
尝试禁用所有非必需模块(在php.ini
中),然后逐个重新启用它们,直到错误发生。您可能还需要更新php和apache。
如果没有帮助,你应该报告一个php错误
您是否尝试在php.ini中增加output_buffering ?
"zend_mm_heap corrupted"的意思吗?