apache error.log中的“ [notice]子pid XXXX退出信号分段错误(11)”


100

我正在使用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和使用的模块的版本是最新的,以及您是否使用某种缓存或加速器。
CodeCaster

您能告诉我您需要什么信息以及如何获取它,以便我可以发布吗?
mgPePe 2011年


最近在我的apache日志中有很多,也有segfault(11)。我的是APC引起的,一旦我再次在php中禁用了APC,该错误就停止了。但是您的原因可能还有很多。
Meetai.com 2014年

Answers:


66

将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永远无法完成页面渲染。(否则,复制段错误只是在每次重新加载时进行刷新就可以了)。自从我在C时代接触金属工具链以来已经有一段时间了。我不知道为什么它可能会表现出这种行为。它没有从我的构建中找到很多符号,但是那只会产生较少信息的回溯,不是吗?
lucian303

嗯,那很奇怪。您是否可以确定segfaults的过程实际上是您附加到gdb的进程?检查dmesg段隔离进程的pid。
Mattias Wadman'8

GDB不起作用。给我Unable to access task for process-id 70: (os/kern) failure.
mgPePe 2013年


2
找到了解决办法:电话set follow-fork-mode child,然后附加到父进程(一个派生子流程) - > stackoverflow.com/questions/15126925/...
maxgalbu

23

分段错误是php中的内部错误(或者不太可能是apache)。通常,分段错误是由更新和测试较少的php模块之一(例如imagemagick或subversion)引起的。

尝试禁用所有非必需模块(中的php.ini),然后一个一个地重新启用它们,直到发生错误。您可能还想更新php和apache。

如果这样做没有帮助,则应报告php bug


但是我怎么知道是哪一个呢?
mgPePe 2013年

对我来说(在Debian Stretch上)是Apache模块mod-geoip-我现在改用php geoip-extension
Christopher K.

@mgPePe要找出它是哪一个,只需禁用所有非必需的模块(从所有外部开发的模块开始,如mod-geoip)。问题继续存在吗?然后禁用更多。看不到任何段错误了吗?启用更多模块,直到您这样做。如果您在技术上有偏见并拥有调试器,请参阅@Mathias Wadmann的出色答案。请注意,调试器可能会误导您-有时崩溃可能在另一个模块中。
phihag

18

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

“ zend_mm_heap损坏”是什么意思


4
经过一些更新后,我在使用apache / php / mysql进行debian压缩时遇到了同样的问题。我将其设置为output_buffering = 4096,现在页面又可以工作了。Thx
rubo77

3
而对我来说只有output_buffering = 8192作品。非常感谢!
Oleg 2014年

2
现在,在另一页上,将output_buffering = 8192导致段错误,该错误已通过设置进行了修复output_buffering = Off。我很困惑。
Oleg 2014年

1
几年后,但是对于像我一样偶然发现此问题的任何人……我发现关闭服务器的输出缓冲,然后使用htaccess文件进行基于目录或文件的编辑是可行的方法。输出缓冲确定在发布给用户之前要保留多少数据。如果衬里较小,则可能会导致错误。在较大的文件中,您有可能使过程过载。
被遗弃的购物车
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.