2011-11-01 18 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內實際發生的錯誤。