Наконец-то освоил Perl’овый отладчик

19 ноября 2012

Не понимаю, почему я раньше так его боялся. Недавно попробовал запустить, почитал справку и «карманный справочник», все понял и начал пользоваться. Принципы абсолютно те же, что и в других отладчиках. Думаю, тут мне весьма помог опыт работы с 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?

Метки: , , .


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