在Perl调试器中使用`die`命令停止程序

3
Perl调试器支持在die时中断吗?
我经常运行程序一次以找到die的位置,然后再运行一次来设置断点。
如果调试器可以自动在die时中断并保留上下文,那将是很好的。

1
...或者更一般地说,任何退出时都可以使用。Carpexitdie、未捕获的异常等等。 - ajwood
1个回答

3
你可以设置一个__DIE__处理程序,并在其中设置断点。
$SIG{__DIE__} = sub {
    $DB::single = 1;
    die @_;
};

这不是一个很好的答案,因为在__DIE__处理程序中,您无法获得调用die函数的上下文。但全局包变量是可访问的,如果您安装了PadWalker,则可以使用调试器命令y 1y 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> 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接