如何使Perl调试器不停在“子程序调用中的100级深度”

时间:2010-08-25 02:56:27

标签: perl debugging

我正在使用一个庞大,陈旧,凌乱,臃肿的框架。它经常在子程序调用中超过100级。 Perl调试器认为适合停止并一遍又一遍地通知我这个事实。

Package::Stash::name(/usr/local/perl/5.10.1/lib/site_perl/5.10.1/Package/Stash.pm:21):
21:     return $_[0]->{package};
100 levels deep in subroutine calls!
  DB<1> 

如何让Perl调试器不关心堆栈有多大?

感谢。

2 个答案:

答案 0 :(得分:46)

添加以下行:

$DB::deep = 500; # or more if necessary

到程序的开头。

以下程序在调试器中运行完成:

use strict;
use warnings;
sub f($) {
        my $x = shift;
        print "$x\n";
        if ($x < 200) {
                f(1 + $x);
        }
}
$DB::deep = 500;
f(1);

输出:

198
199
200
Debugged program terminated.  Use q to quit or R to restart,
  use o inhibit_exit to avoid stopping after program termination,
  h q, h R or h o to get additional info.
  DB<1> _

如果没有$DB::deep = 500;行,则会停在100,与您的相同:

97
98
99
main::f(qq.pl:4):               my $x = shift;
100 levels deep in subroutine calls!
  DB<1> _

已成功测试,堆栈深度为50,000(在if语句中使用50000并将$DB::deep设置为50001)。如果您的堆栈深度大于 ,我怀疑您应该重新设计而不是调试: - )

顺便说一句,如果您根本不想触摸代码,可以在运行代码之前在调试器中更改该值 - 只需在输入$Db::deep=500;之前输入c即可运行代码,或者只是在.perldb文件中设置:

BEGIN {$DB::deep = 500;}

答案 1 :(得分:4)

Schwern:正如对“最佳答案”的评论中所指出的那样,它绝对是一个记录不完整的系统的一部分。但是,如果您真的想在这里提供帮助,请查看DB::Pluggable和我的DB::Pluggable::Dumper插件。有很多伟大的工作可以使调试器使用起来非常有趣。