2011-11-01 17 views
4

我们有一些代码捕获异常,记录消息,然后调用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包裹?这很少见,但在过去一个月左右发生了很多次,我们每天都有数百个这样的工作。

+3

我不知道如何在不知道你的调用堆栈是什么样的情况下重现你的错误。鲤鱼已经走出堆叠的顶端。它可能是鲤鱼的一个错误,或者是一个损坏的堆栈。鲤鱼可作为CPAN模块使用,请尝试升级? https://metacpan.org/release/Carp另一种选择是尝试Perl 5.8.9。 – Schwern

+0

POSIX可以调用鲤鱼吗?你有没有在longmess上设置一个断点,然后逐步调试这个问题? – DVK

+0

实际上,'$ @'不包含'at'。它包含一个空字符串,或者可能是undef。这并不罕见。鲤鱼无法拾取文件名或行号是非常奇怪的。 – ikegami

回答

0

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

1

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

但是请注意,它做什么,也许不是你所期望的:由longmess产生将显示在logwrite功能是从所谓的回溯,不要在那里eval内实际发生的错误。