Php &引用;[注意]子pid XXXX退出信号分段故障(11)“;在apacheerror.log中

Php &引用;[注意]子pid XXXX退出信号分段故障(11)“;在apacheerror.log中,php,apache,cakephp,error-logging,Php,Apache,Cakephp,Error Logging,我正在使用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

我正在使用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)中的内部错误。通常,分段错误是由较新且测试较少的php模块(如imagemagick或subversion)引起的

尝试禁用所有非必需模块(在
php.ini
中),然后逐个重新启用它们,直到出现错误。您可能还需要更新php和apache


如果没有帮助,您应该这样做。

您是否尝试过增加php.ini中的输出缓冲


将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
StartServers 1
MinSpareServers 1
MaxSpareServers 1

现在将gdb连接到一个子进程,在本例中为PID 690(列为UID、PID、PPID等)

等待崩溃。。。然后:

(gdb) backtrace

应该能给你一些线索。如果你提交一个bug报告,你应该包括回溯

如果崩溃很难重现,那么最好将Apache配置为只使用一个子进程来处理请求。配置如下所示:

$ 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
StartServers 1
MinSpareServers 1
MaxSpareServers 1

需要更多关于配置的信息,例如,如果php版本和使用的模块是最新的,如果你使用某种缓存或加速器。你能告诉我你需要什么信息以及如何获取它,这样我就可以发布它吗?还要检查一下:我最近在apache日志中有很多这样的信息,也是segfault(11)。我的错误是由APC引起的,当我再次在php中禁用APC时,错误就停止了。但是你的可能还有很多其他原因。可能听起来很愚蠢,但我通过简单地重新启动apache2解决了这个问题。我刚刚遇到了这个问题,似乎当我将gdb连接到子进程时,我没有得到SEGFULT,apache也没有完成页面的渲染。(以其他方式复制segfault只需在每次重新加载时点击刷新即可)。我已经有一段时间没有使用过更接近金属的工具链了。我想知道为什么它会表现出这种行为。它并没有从我的构建中找到太多的符号,但这应该会产生一个信息较少的回溯不?嗯,这很奇怪。您能否确保SEGFULTS实际上是您连接gdb的进程?检查segfaulted进程的pid的
dmesg
。GDB不工作。使我
无法访问进程id 70:(os/kern)的任务失败。
这是OSX吗?也许check找到了解决方案:调用
设置follow fork mode child
,然后附加到父进程(生成子进程的进程)->在一些更新之后,我在使用apache/php/mysql的debian挤压上遇到了同样的问题。我将其设置为
output\u buffering=4096
,现在页面又可以工作了。THX仅对我而言
输出缓冲=8192
有效。谢谢!现在,在另一页上,
output\u buffering=8192
导致segfault,通过设置
output\u buffering=Off
修复。我很困惑。很多年过去了,但是对于其他像我一样偶然发现这个的人来说。。。我发现关闭服务器的输出缓冲,然后使用htaccess文件进行基于目录或文件的编辑是一种方法。输出缓冲决定在向用户发布之前要保留多少数据。对于小的单行程序,这可能会导致错误。在较大的文件中,可能会导致进程过载。但我怎么知道它是哪一个呢?对我来说(在Debian Stretch上),它是Apache模块
mod geoip
——我现在使用php geoip扩展instead@mgPePe要找出它是哪一个,只需禁用所有非必需模块(从所有外部开发的产品开始,如
mod geoip
)。问题是否继续?然后禁用更多。不再看到任何SEGFULTS?启用更多模块,直到您看到。如果您有技术倾向,并且拥有调试器,请参阅@Mathias Wadmann的优秀答案。请注意,调试器可能会误导您-有时崩溃可能在另一个模块中。