perl - perl Carp模块中的无限循环

标签 perl infinite-loop carp

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

因此,我们正在做的事情的简化 View 是:

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 模块的警告序列会无限期地重复一遍又一遍,导致逻辑文件失效。所以我们最终把它消灭掉。这些警告看起来像是由调用 Carp::longmess 触发的。这里另一个有趣的事情是 $@ 变量似乎只是 at。它是由 die 添加的 at,但没有实际的错误消息或行号。

有人以前见过这个或者知道 Carp 包是怎么回事吗?这种情况很少见,但在过去一个月左右的时间里发生过几次,而且我们每天都有数百个这样的作业在运行。

最佳答案

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

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

关于perl - perl Carp模块中的无限循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7961462/

相关文章:

perl - 在 perl 中查找没有其他子文件夹的文件夹

perl - 为什么不证明接受 -MCarp=verbose?

python - python 递归函数不停地转

perl - 如果每个人都使用的调试代码的机制覆盖它,你如何捕获一个有问题的 sig die 处理程序?

python - 为什么不可能创建一个实用的 Perl 到 Python 源代码转换器?

linux - 如何搜索特定前缀并为其每个数字添加新字符?

perl - 如何管理 Perl 应用程序开发、构建和部署?

c - 无限循环会导致系统崩溃吗?

javascript - 带重定向路由的 Vue-Router 无限循环