Как программно выйти из API отладки perl? - PullRequest
2 голосов
/ 21 июня 2019

У меня есть следующий скрипт:

#!/usr/bin/env perl
sub bar { foo() }
sub foo { }
sub hello { bar(); }
hello();

Я запустил его с неинтерактивным отладчиком и получил:

$ PERL5OPT=-d PERLDB_OPTS='N f=1' perl 2.pl
Package 2.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar
    entering main::foo

Теперь я хочу остановить печать трассировки стека, отключив отладчик после bar() вызов.Как это сделать?

Что я пробовал:

#!/usr/bin/env perl
sub bar {
# $^D;                                  # no effect
# DB::done();                           # Undefined subroutine &DB::done
# $DB::finished=1;                      # no effect
# delete $INC{'perl5db.pl'};            # no effect
# Class::Unload->unload('perl5db.pl');  # no effect
foo();
}
sub foo { }
sub hello { bar(); }
hello();

Но entering main::foo все еще напечатано.

Ожидаемый результат:

Package 2.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar

Ответы [ 2 ]

1 голос
/ 21 июня 2019

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

Например:

#!/usr/bin/env perl
sub bar {
    $DB::frame = 0;
    foo();
}
sub foo { }
sub hello { bar(); }
hello();

Выход:

Package try.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar

Если вы хотите использовать большой молоток и переопределить DB::sub, вам нужно сделать что-то вроде этого:

sub bar {
    {
        package DB;
        no warnings 'redefine';
        no strict;
        *sub = sub { &$sub };
    }
    foo();
}

Однако это также означает, что вы не можете повторно включить трассировку вызовов на более позднем этапе сценария.

0 голосов
/ 21 июня 2019

Понял! Похоже, мы можем просто очистить DB::sub: *DB::sub = sub {};

$ cat 2.pl
#!/usr/bin/env perl
sub bar {
*DB::sub = sub {};
foo();
}
sub foo { }
sub hello { bar(); }
hello();

$ PERL5OPT=-d PERLDB_OPTS='NonStop frame=1' perl 2.pl
Package 2.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar

Благодаря Enbugger perldoc .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...