我正在将一些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