Отладка в Perl

в 9:48, , рубрики: debugger, perl, отладка, метки: , ,

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

Вот основные команды, которые будут полезны при отладке ваших программ. Теперь несколько слов о работе самого отладчика:

Последовательность этапа выполнения

  1. Инициализация
  2. .perldb
  3. PERLDB_OPTS
  4. DB::afterinit(); во время исполнения DB::afterinit(), команды могут быть помещены в стек массива DB::typehead до запуска сеанса отладчика.
  5. 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

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js