Perl调试器支持在
我经常运行程序一次以找到
如果调试器可以自动在
die
时中断吗?我经常运行程序一次以找到
die
的位置,然后再运行一次来设置断点。如果调试器可以自动在
die
时中断并保留上下文,那将是很好的。__DIE__
处理程序,并在其中设置断点。$SIG{__DIE__} = sub {
$DB::single = 1;
die @_;
};
__DIE__
处理程序中,您无法获得调用die
函数的上下文。但全局包变量是可访问的,如果您安装了PadWalker
,则可以使用调试器命令y 1
或y 1 <pattern>
查看调用die
时作用域内的词法变量。
概念证明:
# dying.pl
$SIG{__DIE__} = sub { $DB::single = 1; die @_; };
for my $i (1 .. 10000) {
my $j = sqrt($i * ($i+1)) - 0.49;
die "$i $j" if $j - int($j) < 0.1;
}
$ perl -d dying.pl
Loading DB routines from perl5db.pl version 1.37
Editor support available.
Enter h or 'h h' for help, or 'man perldebug' for more help.
main::(dying.pl:1): $SIG{__DIE__} = sub { $DB::single = 1; die @_; };
DB<1> c
main::CODE(0x1000c918)(dying.pl:1):
1: $SIG{__DIE__} = sub { $DB::single = 1; die @_; };
DB<1> y 1 j
$j = 13.000737563232
DB<2> y 1
$i = 13
$j = 13.000737563232
DB<3> c
13 13.000737563232 at dying.pl line 5.
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<3>
Carp
、exit
、die
、未捕获的异常等等。 - ajwood