我们有一些代码捕获异常,记录消息,然后调用Carp::longmess
来获取堆栈跟踪。perl中的无限循环鲤鱼模块
所以我们在做什么的简化的观点是:
eval { <some SOAP::Lite stuff> };
if(my $err = [email protected])
{
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
模块的这一系列警告重复一遍又一遍地重复,b降低门。所以我们最终杀了它。这些警告看起来像是通过致电Carp::longmess
触发的。这里的另一件事是[email protected]
变量似乎只是at
。它作为at
由die添加,但没有实际的错误信息或行号。
有没有人见过这个或有任何想法什么是在与Carp
包裹?这很少见,但在过去一个月左右发生了很多次,我们每天都有数百个这样的工作。
我不知道如何在不知道你的调用堆栈是什么样的情况下重现你的错误。鲤鱼已经走出堆叠的顶端。它可能是鲤鱼的一个错误,或者是一个损坏的堆栈。鲤鱼可作为CPAN模块使用,请尝试升级? https://metacpan.org/release/Carp另一种选择是尝试Perl 5.8.9。 – Schwern
POSIX可以调用鲤鱼吗?你有没有在longmess上设置一个断点,然后逐步调试这个问题? – DVK
实际上,'$ @'不包含'at'。它包含一个空字符串,或者可能是undef。这并不罕见。鲤鱼无法拾取文件名或行号是非常奇怪的。 – ikegami