2011-10-12 148 views
82

我正在使用Apache/PHP/MySQL堆栈。
使用CakePHP作为框架。“[notice] child pid XXXX exit signal Segmentation fault(11)”in apache error.log

我偶尔会看到一个空白的白页。我无法通过调试蛋糕,所以我偷看在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和使用的模块的版本是最新的,如果您使用某种缓存或加速器。 – CodeCaster

+0

你能告诉我你需要什么信息和如何得到它,所以我可以发布它? – mgPePe

+0

另外检查:http://stackoverflow.com/questions/15689765/apc-and-child-pid-xxxxx-exit-signal-segmentation-fault/15724464#15724464 – trante

回答

54

将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

+0

嗯,这很奇怪。你能确定segfaults实际上是你连接gdb的进程吗?检查'dmesg'是否为segfaulted进程的pid。 –

+0

GDB不起作用。给我'无法访问进程ID为70的任务:(os/kern)失败。“ – mgPePe

18

甲segementation故障是在PHP内部错误(或可能性较小,阿帕奇)。通常情况下,分段错误是由较新和较少测试的php模块之一引起的,例如imagemagick或subversion。

尝试禁用所有非必要模块(在php.ini中),然后逐个重新启用它们直到发生错误。你可能也想更新php和apache。

如果这没有帮助,你应该report a php bug

+0

但我怎么知道它是哪一个? – mgPePe

16

您是否尝试过在您的php.ini中增加output_buffering?

What does "zend_mm_heap corrupted" mean

+2

我有一些更新后的debian与apache/php/mysql挤压相同的问题。我将它设置为'output_buffering = 4096',现在页面再次工作。 Thx – rubo77

+2

而对于我而言,只有'output_buffering = 8192'起作用。非常感谢! – Oleg

+1

现在,在另一页上,'output_buffering = 8192'会导致段错误,通过设置'output_buffering = Off'来修复。我很困惑。 – Oleg

相关问题