perl Carp模块中的无限循环

时间:2011-11-01 01:00:38

标签: perl infinite-loop carp

我们有一些代码可以捕获异常,记录消息然后调用Carp::longmess来获取堆栈跟踪。

所以我们正在做的简化视图是:

eval { <some SOAP::Lite stuff> };
if( my $err = $@ )
{
    logwrite( "Caught Error: $err" );
}

logwrite函数基本上是:

sub logwrite($)
{
    my $msg = $_[0];
    my($pkg,$fil,$lin)=caller;
    my $timestamp = POSIX::strftime(...);
    print STDERR "$timestamp $fil/$lin $msg\n";
    print STDERR "$timestamp $fil/$lin Stack trace:\n" . Carp::longmess . "\n";
}

但是在我看到的日志中:

20111030 Module.pm/42 Caught Error: at  line
Use of uninitialized value in caller at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 22.
Use of uninitialized value in string eq at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 91.
Use of uninitialized value in numeric lt (<) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 200.
Use of uninitialized value in pattern match (m//) at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 55.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
Use of uninitialized value in concatenation (.) or string at /usr/lib/perl5/5.8.8/Carp/Heavy.pm line 142.
...

来自Carp/Heavy.pm模块的那一系列警告一再重复地重复,吹灭了logifle。所以我们最终将其杀掉了。这些警告似乎是由Carp::longmess的呼叫触发的。另一个有趣的事情是$@变量似乎只是at。它是由die添加的at,但没有实际的错误消息或行号。

之前有没有人见过这个或者知道Carp包的内容是什么?这种情况很少见,但在过去一个月左右发生了几次,我们每天都有数百个这样的工作。

2 个答案:

答案 0 :(得分:1)

您的代码适用于perl v5.10.1,Carp.pm版本1.11。

但是,请注意它的作用可能不是您所期望的:longmess生成的回溯将显示调用logwrite函数的位置,而不是eval内部发生的实际错误。 1}}。

答案 1 :(得分:0)

我意识到这并不能回答你的实际问题,但是。 。 。因为在这种情况下显然是$msg eq 'at line ',也许你应该通过将unless $msg eq 'at line '添加到print ... Carp::longmess ...语句的末尾来绕过这个问题? (我的意思是,除非有人提出真正的解决方案。)