我有以下脚本:
#!/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
答案 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