apache error.log 中的“[notice] child pid XXXX exit signal Segmentation fault (11)” [关闭]

Posted

技术标签:

【中文标题】apache error.log 中的“[notice] child pid XXXX exit signal Segmentation fault (11)” [关闭]【英文标题】:"[notice] child pid XXXX exit signal Segmentation fault (11)" in apache error.log [closed] 【发布时间】:2011-12-06 10:20:56 【问题描述】:

我正在使用 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 和使用的模块的版本是否是最新的,以及是否使用了某种缓存或加速器。 您能告诉我您需要什么信息以及如何获取信息,以便我发布吗? 另请查看:***.com/questions/15689765/… 我最近在我的 apache 日志中有很多这些,还有段错误 (11)。我的是由 APC 引起的,一旦我再次在 php 中禁用 APC,错误就停止了。但你的可能还有许多其他原因。 可能听起来很愚蠢,但我通过简单地重新启动 apache2 解决了这个问题。 【参考方案1】:

将 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

【讨论】:

我刚刚遇到了这个问题,似乎当我将 gdb 附加到子进程时,我没有收到段错误,而且 apache 也没有完成页面渲染。 (否则,重现段错误只是在每次重新加载时点击刷新的问题)。自从我在 C 时代使用更接近金属工具链的工作以来已经有一段时间了。我想知道为什么它会表现出这种行为。它没有从我的构建中找到很多符号,但这应该只会产生信息量较少的回溯,不是吗? 嗯,这很奇怪。你能确保段错误的进程实际上是你连接 gdb 的那个进程吗?检查 dmesg 以获取 segfaulted 进程的 pid。 GDB 不起作用。给我Unable to access task for process-id 70: (os/kern) failure. 这是 OSX 吗?也许检查***.com/questions/11504377/… 找到解决方案:调用set follow-fork-mode child,然后附加到父进程(产生子进程的那个)-> ***.com/questions/15126925/…【参考方案2】:

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

What does "zend_mm_heap corrupted" mean?

【讨论】:

经过一些更新后,我在使用 apache/php/mysql 进行 debian 挤压时遇到了同样的问题。我将它设置为output_buffering = 4096,现在页面又可以工作了。谢谢 对我来说只有output_buffering = 8192 有效。非常感谢! 现在,在另一个页面上,output_buffering = 8192 导致 segfault,通过设置 output_buffering = Off 已修复。我很困惑。 多年以后,但对于像我一样偶然发现此问题的其他人...我发现关闭服务器的输出缓冲,然后使用 htaccess 进行基于目录或文件的编辑文件是要走的路。输出缓冲决定了在发布给用户之前要保留多少数据。对于小的单行,这可能会导致错误。在较大的文件中,您可能会面临流程超载的风险。【参考方案3】:

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

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

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

【讨论】:

但是我怎么知道是哪一个呢? 对我来说(在 Debian Stretch 上)是 Apache 模块 mod-geoip - 我现在改用 php geoip-extension @mgPePe 要找出它是哪一个,只需禁用所有非必要模块(从所有外部开发的模块开始,如mod-geoip)。问题是否继续存在?然后禁用更多。不再看到任何段错误?启用更多模块,直到你这样做。如果您在技术上倾向于并拥有调试器,请参阅@Mathias Wadmann 的出色答案。请注意,调试器可能会误导您 - 有时崩溃可能发生在另一个模块中。

以上是关于apache error.log 中的“[notice] child pid XXXX exit signal Segmentation fault (11)” [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

云平台apache2-error.log日志切割解决方案

apache日志:error_log,access_log

Apache日志详解

Apache error.log [warn](OS 64)指定的网络名不再可用。winnt_accept: Asynchronous AcceptEx failed.

PHP error_log 方法不会将错误写入我的错误日志文件

Apache问题处理