【问题标题】:mod_perl segmentation faultmod_perl 分段错误
【发布时间】:2011-05-23 17:46:44
【问题描述】:

你好,

我在 Oracle64 位(Red Hat 克隆)上运行 apache 2.2.3,但遇到了问题。我有一个使用 MIME::Lite 通过 sendmail 发送邮件的程序(我很抱歉,不确定我正在运行什么版本的 sendmail 或 mod_perl,尽管我相信 sendmail 部分与您稍后会看到的无关)

有时,apache 会出现段错误 (11),然后深入研究 MIME::Lite 模块,我发现它位于以下行:

open SENDMAIL, "|$sendmailcmd" or Carp::croak "open |$sendmailcmd: $!\n";  (this is in MIME::Lite)

现在,人们会自动怀疑 sendmail,但如果我在同一行中使用 /bin/cat(如图所示):

open SENDMAIL, "|/bin/cat" 

apache 仍然有段错误。

我在 apache 进程中附加了一个 strace 并看到以下内容: (当它不崩溃时)

12907 write(2, "SENDMAIL send_by_sendmail 1\n", 28) = 28
12907 write(2, "SENDMAIL /usr/lib/sendmail -t -o"..., 40) = 40
12907 pipe([24, 26])                    = 0
12907 pipe([28, 29])                    = 0
12907 clone(child_stack=0, flags=CLONE_CHILD_CLEARTID|CLONE_CHILD_SETTID|SIGCHLD,     child_tidptr=0x2b4bcbbd75d0) = 13186

注意“SENDMAIL sent_by_sendmail”是我的 cmets。您可以清楚地看到管道打开。当它确实崩溃时,您会看到以下内容:

10805 write(2, "SENDMAIL send_by_sendmail (for y"..., 40) = 40
10805 --- SIGSEGV (Segmentation fault) @ 0 (0) ---

现在注意它从不管道。我已经尝试过 GDB,但它并没有真正向我展示任何东西。

最后,我写了一个简单的程序来运行 mod_perl 和常规 cgi:

 print header();
 print "test";

 open SENDMAIL, "|/bin/cat" or Carp::croak "open |sendmailcmd: $!\n";
 print SENDMAIL "foodaddy";
 close SENDMAIL;
 print "test done <br/>";

在 mod_perl 下它已经成功崩溃了。

我的分析告诉我,它与尝试打开文件句柄有关,管道函数返回 false 或损坏的文件句柄。

我还将文件描述符限制增加到 2048,没有骰子。

有人对我应该看哪里有任何想法吗?有什么想法吗?

感谢您的帮助

【问题讨论】:

    标签: apache mod-perl segmentation-fault


    【解决方案1】:

    我刚刚花了很长时间追踪一个以相同症状开始的问题。我最终发现 Test::More 不能很好地与 mod_perl 配合使用。从我的代码中删除这个模块似乎已经解决了这个问题(到目前为止!)。我没有更深入地了解这一点,但我怀疑问题实际上在于 Test::Builder。

    【讨论】:

      【解决方案2】:

      我设法只治疗症状,而不是病因。当在包级别使用全局/包范围变量时,我碰巧遇到了这个问题,在 perl 对象实例中使用,只要我将它们作为对象属性而不是作为自动默认 perl 变量范围传递,我就停止体验 perl 分段突然出现故障。

      【讨论】:

        猜你喜欢
        • 2013-09-03
        • 2012-03-08
        • 2015-01-17
        • 2010-11-13
        • 1970-01-01
        • 2015-02-24
        • 2010-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多