Как я могу установить рабочую точку останова на постоянное выражение? - PullRequest
0 голосов
/ 19 декабря 2018

У меня есть Perl-код, который использует константу с блоком инициализации, например так:

use constant C => map {
    ...;
} (0..255);

Когда я пытаюсь установить точку останова в строке ...;, она неработа, что означает: я могу установить точку останова, но отладчик не останавливает там.

Я пытался:

  1. Запуститьпрограмма с отладчиком (perl -d program.pl)
  2. Установите точку останова в отладчике (b 2)
  3. Перезагрузите с помощью R, затем запустите (r) программу

Но все равно отладчик не остановился на линии, как если бы у меня не была установлена ​​точка останова.

Мой Perl не самый последний;это 5.18.2, на тот случай, если это имеет значение ...

Ответы [ 2 ]

0 голосов
/ 20 декабря 2018

Вы можете избежать изменения своего кода, если создадите простой модуль, подобный этому (здесь возникла концепция ):

package StopBegin;

BEGIN {
    $DB::single=1;
}
1;

Затем запустите свой код как

perl -I./  -MStopBegin -d test.pl

Соответствующий ответ (предыдущий, не очень подходящий ответ ниже этого)

Если test.pl выглядит так:

use constant C => {
    map {;
        "C$_" => $_;
    } 0 .. 255
};

вот чтовзаимодействие отладки выглядит следующим образом:

% perl -I./  -MStopBegin -d test.pl

Loading DB routines from perl5db.pl version 1.53
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

StopBegin::CODE(0x55db6287dac0)(StopBegin.pm:8):
8:  1;
  DB<1> s
main::CODE(0x55db6287db38)(test.pl:5):
5:  };
  DB<1> -
1   use constant C => {
2:      map {;
3:          "C$_" => $_;
4       } 0 .. 255
5==>    };
  DB<2> b 3
  DB<3> c
main::CODE(0x55db6287db38)(test.pl:3):
3:          "C$_" => $_;
  DB<3> 

Обратите внимание на использование точки останова для остановки внутри map.

Предыдущий, не очень подходящий ответ

Если test.pl выглядит так:

my $foo;

BEGIN {
    $foo = 1;
};

, вот как выглядит отладочное взаимодействие:

% perl -I./  -MStopBegin -d test.pl

Loading DB routines from perl5db.pl version 1.53
Editor support available.

Enter h or 'h h' for help, or 'man perldebug' for more help.

StopBegin::CODE(0x5567e3d79a80)(StopBegin.pm:8):
8:  1;
  DB<1> s
main::CODE(0x5567e40f0db0)(test.pl:4):
4:      $foo = 1;
  DB<1> s
main::(test.pl:1):  my $foo;
  DB<1> s
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> 

Обратите внимание на использование команды s для продвиженияиначе он пропустит блок BEGIN в test.pl

0 голосов
/ 19 декабря 2018

Вы пытаетесь поставить точку останова в блоке use.Блок использования в действительности является блоком BEGIN с require в нем.Отладчик Perl по умолчанию не останавливается на этапе компиляции.Однако вы можете перевести отладчик Perl в одношаговый режим внутри блока BEGIN, установив для переменной $DB::single значение 1

См. Debugging Compile-Time Statements в perldoc perldebug

Если выизмените свой код на

use constant C => map {
    $DB::single = 1;
    ...;
} (0..255);

Отладчик Perl остановится в операторе использования.

...