我正在將一些cgi腳本轉換爲mod_perl。在CGI下,我使用sig DIE來捕獲堆棧跟蹤,並在每次發生未捕獲的異常時對其進行記錄。這很有效:每當腳本中有東西死掉,我就會在應用程序日誌中獲得一個很好的堆棧跟蹤。代碼是:捕獲與mod_perl異常的堆棧跟蹤
BEGIN {
$SIG{__DIE__} = \&sigDie;
}
sub sigDie {
return 1 if $^S; # we are in an eval block
my ($error) = @_;
cluck("Caught fatal error: $error"); # put a stack trace in the logs via warn
local $Log::Log4perl::caller_depth = $Log::Log4perl::caller_depth + 1;
FATAL @_; # call log4perl's fatal
return 1;
}
在Apache2 :: Registry,然而,我的代碼不再調用,它只是停止,當它死亡記錄。我認爲這是因爲我的代碼正在被mod_perl評估,但我把上面的例程取消了eval check,而且我還沒有被調用。
有什麼辦法可以在mod_perl下得到我想要的嗎?我發現這些堆棧痕跡的自動記錄非常有用,如果我不得不放棄它們,會錯過它們。到目前爲止,我已經對如何得到它空了。
FWIW信號處理程序的返回值無效。不妨''回來;'以避免讀者認爲它確實如此。 – Schwern
謝謝,會更新它。不記得我爲什麼這麼做了。 – mvsjes2