Как я могу следить за изменениями выражения в отладчике Perl?

Я знаю, что с отладчиком Perl я могу устанавливать точки останова в определенных строках кода с помощью команды b. Могу ли я остановить отладчик сразу после изменения содержимого переменной?


person Flimm    schedule 24.01.2014    source источник


Ответы (2)


Вы можете создавать точки наблюдения, используя команду w в отладчике Perl.

Ускоренный курс по команде отладчика w:

Создайте контрольное выражение, набрав w, а затем выражение, которое будет отслеживаться на предмет изменений:

DB<1> w $variablename

Введите c, чтобы продолжить, пока наблюдаемое выражение не изменится. Как только вы это сделаете, вы получите примерно такой результат:

DB<2> c
Watchpoint 0:   $variablename changed:
    old value:  ''
    new value:  'hi'
main::(ex.pl:6):    $variablename = "";    

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

Также обратите внимание, что выражение преобразовано в строку. Так, например, изменение переменной на undef даст вам следующий результат:

  DB<2> c
Watchpoint 0:   $variablename changed:
    old value:  'hi'
    new value:  ''
main::(ex.pl:7):    $variablename = undef;

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

Если контрольное выражение является списком, отладчик сравнит строковые элементы списка:

  DB<1> w $variablename, "second"

  DB<2> c
Watchpoint 0:   $variablename, "second" changed:
    old value:  'one', 'second'
    new value:  'two', 'second'
main::(hi.pl:6):    $variablename = "three";

Вы можете использовать переменные массива или хеш-переменные в качестве контрольных выражений, и они будут обрабатываться как любой другой список.

Чтобы удалить контрольное выражение, используйте команду W, а для просмотра списка активных контрольных выражений используйте команду L.

Совет: используйте временные глобальные переменные

Поскольку выражение-наблюдение переоценивается с каждым оператором, вы не можете ожидать, что выражение-наблюдение, использующее лексическую переменную, выйдет за пределы области видимости. Быстрый совет - создать глобальную ссылку на лексическое слово и вместо этого отслеживать его:

DB<1> $main::my_debug_variable = $hashref_lexical_variable

DB<2> w $main::my_debug_variable->{key_im_watching}

Совет: используйте Data::Dumper

Используйте Data::Dumper для просмотра содержимого нескаляров:

DB<1> w Data::Dumper->Dump([$hashref])

Это предпочтительнее простого w $hashref, потому что он остановится, когда значения хеш-функции изменятся, а не просто адрес, на который указывает ссылка (поскольку hashref преобразуется в что-то вроде HASH(0x2a07a90)).

person Flimm    schedule 24.01.2014
comment
последние два совета великолепны! - person sferencik; 24.01.2014
comment
Еще один совет: w $$ разрывы при входе в разветвленных детей - person Björn Höhrmann; 05.03.2019
comment
В разделе Программирование на Perl (4-е издание, третье издание, 2013–2012 гг.) 13), w, как утверждается, перечисляет исходный код, так же, как и в первом издании 1991 г. (сейчас это похоже на «v» (Perl версии 5.30)). Это за месяц до того, как был написан этот ответ. Когда он изменился с «w» на «v»? С Perl 5 в 1994 году? - person Peter Mortensen; 05.11.2020
comment
Хорошо, я нашел это. Согласно документации, 'w' было переназначено для просмотра-выражений в Perl версии 5.7.3 (05.03.2002). В Perl версии 5.7.2 (2001 г. -07-13) 'w' по-прежнему используется в списке источников. Это книга, которая серьезно устарела по отношению к. в отладчик Perl (устарел почти на 10 лет на момент публикации (февраль 2012 г.) для выпуска, в котором он должен быть (4-е издание)). - person Peter Mortensen; 05.11.2020
comment
Спасибо @PeterMortensen. Не стесняйтесь редактировать мой ответ, чтобы обновить его. - person Flimm; 05.11.2020

Кроме того, вы можете использовать "ddd your_script.pl&" в Linux и наблюдать за переменными, такими как отладчик C / C ++, в графическом интерфейсе.

person alex    schedule 24.01.2014