2016-02-23 2 views
2

Поддерживает ли отладчик Perl разрыв на die?Ломать на `die` в отладчике Perl

Я обнаружил, что часто запускаю программу один раз, чтобы найти линию die, а затем запустить ее во второй раз, чтобы установить точку останова.

Было бы неплохо, если бы отладчик мог автоматически разбиться на die, держась за умирающий контекст.

+1

... или в более общем плане на любом выходе. 'Carp',' exit', 'die', неперехваченное исключение и т. Д. – ajwood

ответ

3

Вы можете установить обработчик __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>