如何以编程方式离开perl调试API?

时间:2019-06-21 17:08:55

标签: perl debugging

我有以下脚本:

#!/usr/bin/env perl
sub bar { foo() }
sub foo { }
sub hello { bar(); }
hello();

我使用非交互式调试器运行它并得到:

$ PERL5OPT=-d PERLDB_OPTS='N f=1' perl 2.pl
Package 2.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar
    entering main::foo

现在,我想通过在bar()调用后禁用调试器来停止打印stacktrace。该怎么做?

我尝试过的事情:

#!/usr/bin/env perl
sub bar {
# $^D;                                  # no effect
# DB::done();                           # Undefined subroutine &DB::done
# $DB::finished=1;                      # no effect
# delete $INC{'perl5db.pl'};            # no effect
# Class::Unload->unload('perl5db.pl');  # no effect
foo();
}
sub foo { }
sub hello { bar(); }
hello();

但是entering main::foo仍在打印。

预期输出:

Package 2.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar

2 个答案:

答案 0 :(得分:1)

启动调试器后,您不能真正禁用它。但是,您可以停止打印子例程调用。

例如:

#!/usr/bin/env perl
sub bar {
    $DB::frame = 0;
    foo();
}
sub foo { }
sub hello { bar(); }
hello();

输出:

Package try.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar

如果您想使用大铁锤重新定义DB::sub,则需要执行以下操作:

sub bar {
    {
        package DB;
        no warnings 'redefine';
        no strict;
        *sub = sub { &$sub };
    }
    foo();
}

但是,这也意味着您无法在脚本的稍后位置重新启用呼叫跟踪。

答案 1 :(得分:0)

知道了!似乎我们只需清除DB::sub*DB::sub = sub {};

$ cat 2.pl
#!/usr/bin/env perl
sub bar {
*DB::sub = sub {};
foo();
}
sub foo { }
sub hello { bar(); }
hello();

$ PERL5OPT=-d PERLDB_OPTS='NonStop frame=1' perl 2.pl
Package 2.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar

感谢Enbugger perldoc