Как запустить отладчик perl во время выполнения с PERLDB_OPTS? - PullRequest
1 голос
/ 20 июня 2019

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

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

, который выдает следующий вывод

$ PERLDB_OPTS="NonStop frame=1" perl -d 1.pl > /dev/null
Package 1.pl.
  entering DB::Obj::_init
  entering main::hello
   entering main::bar
    entering main::foo

Мне нужно включить отладчик только перед вызовом функции bar().Как это сделать?

То, что я пробовал:

1) Enbugger + DB::parse_options

$ cat 1.pl 
#!/usr/bin/env perl
sub bar { foo() }
sub foo { }
sub hello { 
    require Enbugger;
    Enbugger->load_debugger();
    DB::parse_options("NonStop frame=1");
    bar();
    Enbugger->stop;
}
hello();
$ perl 1.pl > /dev/null
  entering CODE(0x1c551d0)
   entering CODE(0x1d23018)
    entering strict::import
   entering CODE(0x1d23ac8)
 Package /usr/lib/x86_64-linux-gnu/perl/5.22/Errno.pm.
   entering Errno::TIEHASH
  entering CODE(0x1c551b8)
   entering CODE(0x1d72b40)
    entering strict::import
 Package /usr/lib/x86_64-linux-gnu/perl/5.22/Tie/Hash/NamedCapture.pm.
   entering XSLoader::load
             NonStop = '1'
               frame = '1'
  entering CODE(0x1bdeca8)
   entering warnings::unimport

похоже, работает причинаесли я изменю на frame=2, будет больше выходных данных.Но вывод неправильный, ожидается:

Package 1.pl.
    entering DB::Obj::_init
       entering main::bar
        entering main::foo

2) Глобальные переменные БД :

$ cat 1.pl 
#!/usr/bin/env perl
sub bar { foo() }
sub foo { }
sub hello { 
    require "perl5db.pl";
    $DB::signal = 1;
    bar();
    $DB::single = 1;
}
hello();
$ PERLDB_OPTS="NonStop frame=1" perl 1.pl > /dev/null 

нет вывода: (

1 Ответ

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

На данный момент я использовал следующий скрипт взлома с -d NonStop frame=0 и установил $DB::frame=1 в том месте, откуда я хочу получить трассировку стека.

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

$ PERL5OPT=-d PERLDB_OPTS=NonStop perl 1.pl
   entering main::bar
    entering main::foo

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