Наконец-то освоил Perl’овый отладчик
Не понимаю, почему я раньше так его боялся. Недавно попробовал запустить, почитал справку и «карманный справочник», все понял и начал пользоваться. Принципы абсолютно те же, что и в других отладчиках. Думаю, тут мне весьма помог опыт работы с OllyDbg.
Запускается отладчик очень просто:
perl -d script.pl
Кроме того, вы можете получить REPL-среду, выполнив команду:
perl -d -e 0
Раньше для этих целей я использовал модуль Devel::REPL, который, в общем-то, всем хорош, если не считать зависимость от Moose и то, что некоторые другие его зависимости приходится подтягивать вручную.
Итак, отладчик мы запустили. Теперь рассмотрим доступные нам команды.
Прочитать код, начиная с определенной строчки, объявления процедуры или находящийся в диапазоне некоторых строк:
l <line|sub|123-150|11+5>
Посмотреть предыдущие относительно текущей позиции строки кода:
-
Посмотреть код в окрестностях текущей позиции или указанной строки, как перед, так и после нее:
v [line]
Выполнить некую команду и просмотреть результат в $PAGER:
|команда
Поиск по регулярному выражению re в прямом направлении (если re не указан, продолжить предыдущий поиск):
/re
По аналогии – поиск в обратном направлении:
?re
Загрузить для просмотра заданный файл:
f VK/MP3.pm
Вернуть просмотр кода на текущую позицию:
.
Показать все доступные методы класса:
m $obj
Показать список всех загруженных модулей:
M
Показать список всех доступных подпрограмм:
S
Вычислить некое Perl-выражение и вывести результат:
p expr
Также в отладчике можно модифицировать значения переменных отлаживаемого скрипта:
$a = $b + 123;
Рекурсивный вывод переменных:
x [макс глубина] \@arr
Список переменных:
[X|V] [Package] [str|~re]
Перечень лексических переменных:
y [уровень [переменные]]
Один шаг вперед, без захода внутрь процедур:
n
Один шаг вперед с заходами:
s
Показать стэк вызовов:
T
Включить/выключить трассировку:
t
Показать историю команд (команды n, l и x в историю не заносятся):
H [-n]
Повторить последнюю команду или заданную по номеру:
! [-n]
Запустить внешнюю команду в подчиненном процессе:
!!pwd
Выполнить команды отладчика из внешнего файла (можно сохранять действия, брейкпоинты и тп):
source <file>
Продолжить выполнение скрипта до указанной строчки, процедуры или просто продолжить:
c [ln|sub]
Продолжить выполнение скрипта до выхода из подпрограммы:
r
Вывести список действий (action), брейкпоинтов (breakpoints) или точек наблюдения (watchs):
L [a|b|w]
Повесить брейкпоинт на указанную строчку или подпрограмму, плюс можно указать условие, при котором брейкоинт срабатывает:
b <line|sub> [условие]
Удалить брейкпоинт или все брейкпоинты:
B <ln|*>
Создать новое действие:
a строка действие [условие]
Удалить действие или все действия:
A <line|*>
Создать точку наблюдения:
w $var
Удалить точку наблюдения или все точки наблюдения:
W $var|*
Начать отладку скрипта заново, сохранив точки останова и тп:
R
Создать действие, выполняемое перед каждым приглашением отладчика (pre-prompt action):
< expr
Список, удалить, добавить:
< ?
< *
<< expr
По аналогии > и >> – это команды для работы с post-prompt actions, а { и {{ – для работы с командами дебагера, выполняемыми перед каждым приглашением.
Справка и подробная справка:
h
h h
Читаем `perldoc perlre`:
man re
Выход из отладчика:
q
В действительности пользоваться отладчиком в Perl очень просто. Не стану грузить вас примерами – если вы просто попробуете или почитаете perldoc perldebtut, то сами во всем разберетесь за несколько минут.
Интересно, а отладчики для других языков (Python, Erlang, you name it) обладают всеми из названных возможностей? Или, быть может, имеют какие-то возможности, которых нет в отладчике для Perl?