我們有一些代碼捕獲異常,記錄消息,然後調用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