В данной статье я опишу основные возможности Perl отладчика, которые позволят вам ускорить поиск ошибок в ваших программах.
Прежде чем я начну описывать работу с отладчиком, приведу несколько советов, которые помогут выявить некоторые типичные ошибки, еще до запуска debugger:
- Проверьте ваш синтаксис с помощью ключа -c: perl -c yourprog
- Используйте use strict, который предотвратит многие ошибки, связанные с названиями переменных и их объявлением.
- Включайте предупреждения с помощью ключа -w (если вы хотите получать все предупреждения, то можете использовать ключ -W).
- Более расширенную информацию о неполадках можно получить используя use diagnostics (или -Mdiagnostics из коммандной строки) все сообщения генерируются с помощью perldiag (man).
- Проверьте вашу программу в режим Taint. При запуске вашей программы с данным ключом -T (легкий вариант -t), каждая переменная вне вашей программы считается инфицированной (tained) и отказывается запускать внешние команды из незнакомых мест.
- Программа splain. Действует как и use diagnostics, принимает предупреждающие сообщения и преобразует их в детализированные сообщения, но с тем преимуществом, что ничего не включается постоянно в ваш код (perl -w your.pl | splain ).
Теперь непосредственно перейдем к возможностям, которые предоставляет Perl Debugger.
Запуск отладчика происходит с помощью ключа -d, из командой строки без программы, его можно вызвать следующей командой: perl -d -e 0
Вот список сновных команд разбитых по категориям.
Помощь и выход
Команды h и h h предоставляют справку и расширенную справку (если использовать команду |h h, то запустится пейджер просмотра страниц, вроде more или less)
man perlvar (просмотр man документации из отладчика)
q
выход из отладчика
Просмотр данных
p [выражение]
печатает содержимое выражения (сокращенное название команды print)
m (выражение | класс)
выдает список методов, которые могут вызываться данным выражением или классом (не применим, когда методы создаются на лету)
M
перечисляет все загруженные модули (в %INC)
S [ [! ] ~шаблон ]
перечисляет подпрограммы, которые могут быть вызваны из данного места (шаблон — регулярное выражение,! — отрицание)
V [ пакет [ переменные ] ]
перечисляет все переменные в определенном пакете. По умолчанию данный пакет, и переменные my не перечисляются
x [максимальная глубина] выражение, X
выдает дамп переменных
Поиск и листинги
В отладчике каждая строка нумеруется в виде DB, и напротив каждой строки может быть установлена :a или :b, что говорит нам, что здесь установлены действия или контрольные точки.
v [строка]
просматривает окно кода
.
восстанавливает просмотр кода в текущее место
-
перечисляет предыдущие строки кода, не увеличивая счетчик команд.
/ регулярное выражение [/]
поиск в коде в прямом направлении (команда ?, делает то же самое, но в обратном направлении)
f имя файла
просмотр файла загруженного в настоящий момент в %INC (если он не загружен, загрузите его: use A::B;)
Перемещение
c [ строка | подпрограмма ]
продвижает выполнение до данной строки или подпрограммы
n [выражение]
осуществляет пошаговое продвижение на следующий исполнимый оператор
если n встречает вызов подпрограммы, то она просто перешагивает через него (в отличие от s, которая входит в вызов)
r
возвращает из текущей подпрограммы
s [выражение]
осуществляет пошаговое перемещение в заданном выражении
T
печатает трассировку стека
t [выражение]
включает и выключает трассировку
Контрольные точки и действия
a [строка] команда [условие]
устанавливает действие(любая перл команда)
A (строка| *)
удаляет некоторые или все действия
b [compile имя подпрограммы] | [postpone] имя подпрограммы [условие] |
[строка [условие] ] | [load имя файла]
устанавливает контрольные точки
B (строка | * )
удаляет некоторые или все контрольные точки
удалять контольные точки можно, только по номерам строк.
w [выражение]
устанавливает переменную наблюдения
выражение наблюдения, или точка наблюдения, наблюдает за переменной от вашего имени. При каждом изменении переменной отладчик останавливает испольнение
W ( * | выражение )
удаляет выражение наблюдения
L [ a | b | w ]
выводит листинг действий, контрольных точек и переменных наблюдения.
Вот основные команды, которые будут полезны при отладке ваших программ. Теперь несколько слов о работе самого отладчика:
Последовательность этапа выполнения
- Инициализация
- .perldb
- PERLDB_OPTS
- DB::afterinit(); во время исполнения DB::afterinit(), команды могут быть помещены в стек массива DB::typehead до запуска сеанса отладчика.
- DB::postponed после компиляции каждого файла, но перед его исполнением DB::postponed( * { " _<$filename" } )
Примечание: файл .perldb, содержащий дополнительные инструкци должен находится либо в текущем каталоге, либо в домашней папке пользователя; PERLDB_OPTS, опции которые можно установить с помощью команды «о»;
подпрограмма DB::parse_options() может быть вызвана из файла .perldb или .perldb строкой, состоящей из любой допустимой опции -o PERLDB_OPTS; DB::afterinit() может быть определена в .perldb и она вызывается после инициализации отладчика.
В ваш рабочий код можно безболезненно вставлять некоторые из переменных отладчика (это переменные открытого интерфейса для использования с отладчико), которые никак не будут влиять на работу программы до его вызова.
Все переменные находятся в пространстве имен $DB::*, вот некоторые из них:
$DB::single=[ 1 | 2 ]
указывает отладчику выполнить пошаговое продвижение на следующую строку
$DB::signal=1
указывает отладчику на пошаговое исполнение
$DB::trace=[ 0 | 1 ]
переключает трассировку
$DB::fork_TTY=путь
указывает отладчику заниматься развлетвленным процессом
Отладчик перл позволяет упростить работу по поиску ошибок, и на самом деле его возможности конечно же не ограничиваются, описанными в статье, так что для дополнительной информации обращайтесь к man perldebug и собственно к файлу perl5db.pl, который содержит код отладчика.
Автор: edem