[英]mod_perl segmentation fault
你好,
我在 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”是我的评论。 您可以清楚地看到管道开口。 当它崩溃时,您将看到以下内容:
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,没有骰子。
有没有人对我应该去哪里有任何想法? 有什么想法吗?
我感谢帮助
我设法可能只治疗症状,而不是原因。 在包级别使用全局/包范围变量时,我碰巧遇到了这个问题,在 perl 对象实例中使用,一旦我将它们作为对象属性传递,而不是作为自动默认的 perl 变量范围,我就停下来体验 perl 分段故障突然。
我只是花了很长时间来追踪一个以相同症状开始的问题。 我最终发现 Test::More 不能很好地与 mod_perl 配合使用。 从我的代码中删除这个模块似乎已经解决了这个问题(到目前为止!)。 我没有更深入地遵循这一点,但我怀疑问题实际上出在 Test::Builder 中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.