Я знаю, что с отладчиком Perl я могу устанавливать точки останова в определенных строках кода с помощью команды b
. Могу ли я остановить отладчик сразу после изменения содержимого переменной?
Как я могу следить за изменениями выражения в отладчике Perl?
Ответы (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)
).
w $$
разрывы при входе в разветвленных детей
- person Björn Höhrmann; 05.03.2019
Кроме того, вы можете использовать "ddd your_script.pl&"
в Linux и наблюдать за переменными, такими как отладчик C / C ++, в графическом интерфейсе.