Я работаю с большой, старой, грязной, раздутой платформой. Он регулярно проходит более 100 уровней в подпрограммах. Отладчик Perl считает нужным остановиться и сообщить мне об этом факте ... снова и снова.
Package::Stash::name(/usr/local/perl/5.10.1/lib/site_perl/5.10.1/Package/Stash.pm:21):
21: return $_[0]->{package};
100 levels deep in subroutine calls!
DB<1>
Как заставить отладчик Perl не заботиться о размере стека?
Спасибо.
Добавьте строку:
$DB::deep = 500; # or more if necessary
в начало вашей программы.
Следующая программа выполняется в отладчике до завершения:
use strict;
use warnings;
sub f($) {
my $x = shift;
print "$x\n";
if ($x < 200) {
f(1 + $x);
}
}
$DB::deep = 500;
f(1);
вывод:
198
199
200
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<1> _
Без строки $ DB :: deep = 500;
она останавливается на 100, как и ваша:
97
98
99
main::f(qq.pl:4): my $x = shift;
100 levels deep in subroutine calls!
DB<1> _
Это было успешно протестировано до глубины стека 50 000 (используйте 50000 в операторе if
и установите для $ DB :: deep
значение 50001). Если глубина вашего стека больше, чем , что , я подозреваю, что вам следует реконструировать, а не отлаживать: -)
Между прочим, если вы вообще не хотите трогать код, вы можете изменить это значение в отладчике перед запуском кода - просто введите $ Db :: deep = 500;
, прежде чем вводить c
, чтобы запустить код, или просто установите его в своем .perldb
файл:
BEGIN {$DB::deep = 500;}
Schwern: как отмечено в комментариях к "лучшему ответу", это определенно часть плохо документированной системы. Однако, если вы действительно хотите помочь, взгляните на DB::Pluggable и мой плагин DB::Pluggable::Dumper для него. Можно проделать массу отличной работы, чтобы сделать работу с отладчиком почти увлекательной.