mod_perl分段错误

时间:2010-12-10 21:18:51

标签: apache mod-perl segmentation-fault

HI,

我在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仍然是段错误。

我将一个strace附加到apache进程并看到以下内容: (当它没有崩溃时)

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”是我的评论。你可以清楚地看到管道打开。当它崩溃时,你会看到以下内容:

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,没有骰子。

有没有人想过我应该在哪里看?有什么想法吗?

我很感激帮助

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

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