Подтвердить что ты не робот

Как заставить отладчик Perl не останавливаться на уровне "100 уровней в подпрограммах"?

Я работаю с большой, старой, грязной, раздутой структурой. Он регулярно проходит более 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 не заботиться о том, насколько большой стек?

Спасибо.

4b9b3361

Ответ 1

Добавьте строку:

$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;}

Ответ 2

Шверн: как отмечается в комментариях к "наилучшему ответу", он определенно является частью плохо документированной системы. Однако, если вы действительно хотите помочь здесь, посмотрите DB:: Pluggable и DB:: Pluggable:: Dumper для него. Там очень много работы, которая может быть сделана, чтобы отладчик почти с удовольствием работал.