簡體   English   中英

mod_perl 分段錯誤

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM