perldebug
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ОПИСАНИЕ
- Отладчик Perl
- Отладка регулярных выражений
- Отладка использования памяти
- СМОТРИТЕ ТАКЖЕ
- ОШИБКИ
НАЗВАНИЕ
perldebug - Отладка Perl
ОПИСАНИЕ
Прежде всего, вы пытались использовать use strict; и use warnings;?
Если вы новичок в отладчике Perl, вы можете предпочесть прочитать perldebtut, что является учебным введением в отладчик.
Если вы ищете подробные сведения о том, как реализован отладчик, вы можете предпочесть прочитать perldebguts.
Отладчик Perl
Если вы вызываете Perl с переключателем -d, ваш скрипт выполняется под отладчиком исходного кода Perl. Он работает как интерактивная среда Perl, запрашивая команды отладчика, которые позволяют вам изучить исходный код, установить точки останова, получить трассировки стека, изменить значения переменных и т. д. Это так удобно, что вы часто запускаете отладчик самостоятельно, чтобы интерактивно протестировать конструкции Perl и посмотреть, что они делают. Например:
$ perl -d -e 42 В Perl отладчик не является отдельной программой, как обычно в типичной среде компиляции. Вместо этого флаг -d сообщает компилятору вставить информацию о коде в синтаксические деревья, которые он собирается передать интерпретатору. Это означает, что ваш код должен быть скомпилирован без ошибок, чтобы отладчик мог с ним работать. Затем, когда интерпретатор запускается, он загружает специальный файл библиотеки Perl, содержащий отладчик.
Программа остановится непосредственно перед первым исполняемым оператором выполнения (но см. ниже раздел об операторах времени компиляции) и попросит вас ввести команду отладчика. В отличие от распространённого мнения, всякий раз, когда отладчик останавливается и показывает вам строку кода, он всегда отображает строку, которую он собирается выполнить, а не ту, которую он только что выполнил.
Любая команда, не распознанная отладчиком, непосредственно выполняется (eval) как код Perl в текущем пакете. (Отладчик использует пакет DB для хранения собственной информации о состоянии.)
Обратите внимание, что упомянутый eval ограничен неявным объявлением области видимости. В результате любые недавно введённые лексические переменные или изменённое содержимое буфера захвата теряются после eval. Отладчик – это хорошая среда для изучения Perl, но если вы интерактивно экспериментируете с материалами, которые должны находиться в одной области видимости, поместите их в одну строку.
Для любого текста, вводимого в командной строке отладчика, ведущие и хвостовые пробелы сначала удаляются перед дальнейшей обработкой. Если команда отладчика совпадает с какой-либо функцией в вашей собственной программе, просто добавьте перед функцией что-то, что не похоже на команду отладчика, например, ведущий ; или, возможно, +, или заключите её в скобки или фигурные скобки.
Вызов отладчика
Существует несколько способов вызвать отладчик:
- perl -d program_name
-
Для данной программы, идентифицированной по
program_name. - perl -d -e 0
-
Введите произвольную
expressionв интерактивном режиме с помощью-e. - perl -d:ptkdb program_name
-
Отладить данную программу с помощью
Devel::ptkdbграфического интерфейса. - perl -dt threaded_program_name
-
Отладить данную программу с использованием потоков (экспериментальная функция).
Команды отладчика
Интерактивный отладчик понимает следующие команды:
- h
-
Выводит сообщение справки по команде.
- h [command]
-
Выводит сообщение справки по заданной команде отладчика.
- h h
-
Специальный аргумент
h hсоздает всю страницу справки, которая довольно длинная.Если вывод команды
h h(или любой другой команды) выходит за пределы вашего экрана, добавьте перед командой символ '|' для перенаправления её в ваш просмотрщик страниц, как в этом примере:DB> |h hВы можете изменить просмотрщик, используемый по команде
o pager=.... - p expr
-
Аналогично команде
print {$DB::OUT} exprв текущем пакете. В частности, поскольку это просто функцияprintPerl, это означает, что вложенные структуры данных и объекты не выводятся, в отличие от командыx.Файл-дескриптор
DB::OUTоткрывается для /dev/tty, независимо от того, куда перенаправлен STDOUT. - x [maxdepth] expr
-
Вычисляет выражение в контексте списка и выводит результат в формате с красивым форматированием. Вложенные структуры данных выводятся рекурсивно, в отличие от реальной функции
printв Perl. При выводе хэшей, вероятно, лучше использовать 'x \%h', а не 'x %h'. Обратитесь к Dumpvalue, если хотите сделать это самостоятельно.Формат вывода управляется множеством параметров, описанных в разделе "Настраиваемые параметры".
Если включен
maxdepth, он должен быть числом N; значение выводится только на глубину N уровней, как будто параметрdumpDepthбыл временно установлен в значение N. - V [pkg [vars]]
-
Отобразить все (или некоторые) переменные в пакете (по умолчанию
main) с помощью красивого вывода данных (хэши показывают свои ключи и значения, управляющие символы отображаются как печатные и т. д.). Убедитесь, что вы не используете спецификатор типа (например,$), а только имена символов, как в этом примере:V DB filename lineИспользуйте
~patternи!patternдля положительных и отрицательных регулярных выражений.Это аналогично вызову команды
xдля каждой соответствующей переменной. - X [vars]
-
Аналогично
V currentpackage [vars]. - y [level [vars]]
-
Отобразить все (или некоторые) лексические переменные (мнемоническое обозначение:
mYпеременные) в текущей области видимости или на level уровней выше. Вы можете ограничить отображаемые переменные с помощью параметра vars, который работает точно так же, как и для командVиX. Требуется модульPadWalkerверсии 0.08 или выше; выводится предупреждение, если он не установлен. Вывод красиво отформатирован, так же, как для командыV, а формат управляется теми же опциями. - T
-
Создать трассировку стека. Подробности вывода см. ниже.
- s [expr]
-
Один шаг. Выполняет операцию до начала следующего оператора, спускается в подпрограммы. Если указано выражение, включающее вызовы функций, то они также будут выполняться пошагово.
- n [expr]
-
Далее. Выполняет операцию через подпрограммы, до начала следующего оператора. Если указано выражение, включающее вызовы функций, эти функции будут выполняться с остановками перед каждым оператором.
- r
-
Продолжить выполнение до возврата из текущей подпрограммы. Вывести возвращаемое значение, если установлен параметр
PrintRet(по умолчанию). - <CR>
-
Повторить последнюю команду
nилиs. - c [line|sub]
-
Продолжить выполнение, необязательно вставив одноразовый брейкпоинт в указанную строку или подпрограмму.
- l
-
Вывести следующий фрагмент строк.
- l min+incr
-
Вывести
incr+1строк, начиная сmin. - l min-max
-
Вывести строки от
minдоmax.l -эквивалентно-. - l line
-
Вывести одну строку.
- l subname
-
Вывести первый фрагмент строк из подпрограммы. subname может быть переменной, содержащей ссылку на код.
- -
-
Вывести предыдущий фрагмент строк.
- v [line]
-
Просмотреть несколько строк кода вокруг текущей строки.
- .
-
Возвращает внутренний указатель отладчика на последнюю выполненную строку и выводит эту строку.
- f filename
-
Переключиться на просмотр другого файла или
evalоператора. Если filename не является полным путем, найденным в значениях %INC, он рассматривается как регулярное выражение.evalстроки (если доступны) считаются именами файлов:f (eval 7)иf eval 7\bобращаются к телу 7-йevalстроки (в порядке выполнения). Тела текущего выполняемогоevalиevalстрок, определяющих подпрограммы, сохраняются и, следовательно, доступны. - /pattern/
-
Найти вперёд шаблон (Perl регулярное выражение); конечный / необязателен. Поиск по умолчанию нечувствителен к регистру.
- ?pattern?
-
Найти назад шаблон; конечный ? необязателен. Поиск по умолчанию нечувствителен к регистру.
- L [abw]
-
Вывести (по умолчанию все) действия, точки останова и выражения наблюдения.
- S [[!]regex]
-
Вывести имена подпрограмм [не] соответствующие регулярному выражению.
- t [n]
-
Переключить режим отслеживания (см. также параметр
AutoTrace). Необязательный аргумент — максимальное количество уровней отслеживания ниже текущего; всё глубже будет молчать. - t [n] expr
-
Отследить выполнение
expr. Необязательный первый аргумент — максимальное количество уровней отслеживания ниже текущего; всё глубже будет молчать. См. "Примеры вывода списка фреймов" в perldebguts для примеров. - b
-
Устанавливает точку останова на текущей строке.
- b [line] [condition]
-
Установить точку останова перед данной строкой. Если указано условие, оно вычисляется каждый раз, когда достигается оператор: точка останова выполняется только если условие истинно. Точки останова могут быть установлены только на строках, начинающихся с исполняемого оператора. Условия не используют
if.b 237 $x > 30 b 237 ++$count237 < 11 b 33 /pattern/iЕсли номер строки
., устанавливает точку останова на текущей строке:b . $n > 100 - b [file]:[line] [condition]
-
Установить точку останова перед данной строкой в (возможно, другом) файле. Если указано условие, оно вычисляется каждый раз, когда достигается оператор: точка останова выполняется только если условие истинно. Точки останова могут быть установлены только на строках, начинающихся с исполняемого оператора. Условия не используют
if.b lib/MyModule.pm:237 $x > 30 b /usr/lib/perl5/site_perl/CGI.pm:100 ++$count100 < 11 - b subname [condition]
-
Установить точку останова перед первой строкой указанной подпрограммы. subname может быть переменной, содержащей ссылку на код (в этом случае condition не поддерживается).
- b postpone subname [condition]
-
Установить точку останова в первой строке подпрограммы после её компиляции.
- b load filename
-
Установить точку останова перед первой выполненной строкой файла filename, который должен быть полным путем, найденным среди значений %INC.
- b compile subname
-
Устанавливает точку останова перед первым оператором, выполняемым после компиляции указанной подпрограммы.
- B line
-
Удалить точку останова из указанной строки line.
- B *
-
Удалить все установленные точки останова.
- disable [file]:[line]
-
Отключить точку останова, чтобы она не останавливала выполнение программы. Точки останова включены по умолчанию и могут быть снова включены с помощью команды
enable. - disable [line]
-
Отключить точку останова, чтобы она не останавливала выполнение программы. Точки останова включены по умолчанию и могут быть снова включены с помощью команды
enable.Это выполняется для точки останова в текущем файле.
- enable [file]:[line]
-
Включить точку останова, чтобы она останавливала выполнение программы.
- enable [line]
-
Включить точку останова, чтобы она останавливала выполнение программы.
Это выполняется для точки останова в текущем файле.
- a [line] command
-
Установить действие, которое должно быть выполнено перед выполнением строки. Если line опущено, установите действие на строку, которая будет выполнена. Последовательность действий отладчика:
1. check for a breakpoint at this line 2. print the line if necessary (tracing) 3. do any actions associated with that line 4. prompt user if at a breakpoint or in single-step 5. evaluate lineНапример, это выведет $foo каждый раз, когда будет пройдена строка 53:
a 53 print "DB FOUND $foo\n" - A line
-
Удалить действие из указанной строки.
- A *
-
Удалить все установленные действия.
- w expr
-
Добавить глобальное выражение наблюдения. Всякий раз, когда отслеживаемое глобальное значение меняется, отладчик остановится и отобразит старое и новое значения.
- W expr
-
Удалить выражение наблюдения.
- W *
-
Удалить все выражения наблюдения.
- o
-
Отобразить все параметры.
- o booloption ...
-
Установить каждое перечисленное булево значение параметра на значение
1. - o anyoption? ...
-
Вывести значение одного или нескольких параметров.
- o option=value ...
-
Установите значение одного или нескольких параметров. Если значение содержит внутренние пробелы, оно должно быть заключено в кавычки. Например, вы можете установить
o pager="less -MQeicsNfr"для вызова less с указанными параметрами. Вы можете использовать одинарные или двойные кавычки, но если вы это делаете, вы должны экранировать любые вложенные экземпляры того же вида кавычек, с которых вы начали, а также любые экранирования, которые непосредственно предшествуют этой кавычке, но которые не предназначены для экранирования самой кавычки. Другими словами, вы следуете правилам одинарных кавычек независимо от кавычек; например:o option='this isn\'t bad'илиo option="She said, \"Isn't it?\"".По историческим причинам
=valueявляется необязательным, но по умолчанию равен 1 только там, где это безопасно – то есть, в основном для логических параметров. Лучше всегда назначать конкретное значение с помощью=.optionможет быть сокращен, но для ясности, вероятно, не следует. Несколько параметров могут быть установлены вместе. Список этих параметров см. в разделе "Настраиваемые параметры". - < ?
-
Отобразить все действия команд Perl перед запросом.
- < [ command ]
-
Установить действие (команду Perl), которое должно выполняться перед каждым запросом отладчика. Многострочная команда может быть введена, экранируя новые строки.
- < *
-
Удалить все действия команд Perl перед запросом.
- << command
-
Добавить действие (команду Perl), которое должно выполняться перед каждым запросом отладчика. Многострочная команда может быть введена, экранируя новые строки.
- > ?
-
Отобразить все действия команд Perl после запроса.
- > command
-
Установить действие (команду Perl), которое должно выполняться после запроса, когда вы только что ввели команду для возврата к выполнению скрипта. Многострочная команда может быть введена, экранируя новые строки (мы надеемся, что вы к этому моменту догадались).
- > *
-
Удалить все действия команд Perl после запроса.
- >> command
-
Добавляет действие (команду Perl), которое должно выполняться после запроса, когда вы только что ввели команду для возврата к выполнению скрипта. Многострочная команда может быть введена, экранируя новые строки.
- { ?
-
Отобразить команды отладчика перед запросом.
- { [ command ]
-
Установить действие (команду отладчика), которое должно выполняться перед каждым запросом отладчика. Многострочная команда может быть введена стандартным способом.
Поскольку эта команда в некотором смысле новая, выводится предупреждение, если вы, похоже, случайно ввели блок. Если это то, что вы хотите сделать, запишите его так же, как и с
;{ ... }или дажеdo { ... }. - { *
-
Удалить все команды отладчика перед запросом.
- {{ command
-
Добавить действие (команду отладчика), которое должно выполняться перед каждым запросом отладчика. Многострочную команду можно ввести, если вы можете догадаться, как это сделать: см. выше.
- ! number
-
Повторить предыдущую команду (по умолчанию – предыдущую команду).
- ! -number
-
Повторить номер-ю предыдущую команду.
- ! pattern
-
Повторить последнюю команду, начинающуюся с pattern. См. также
o recallCommand. - !! cmd
-
Запустить cmd в дочернем процессе (считывает из DB::IN, записывает в DB::OUT). См. также
o shellBang. Обратите внимание, что будет использована текущая оболочка пользователя (ну, его переменная$ENV{SHELL}), что может повлиять на правильную интерпретацию статуса выхода или сигнала и информацию о дампе ядра. - source file
-
Прочитать и выполнить команды отладчика из файла file. Файл file может сам содержать команды
source. - H -number
-
Отобразить последние n команд. Отображаются только команды, длина которых больше одного символа. Если number опущено, отобразить все.
- q или ^D
-
Выйти. ("quit" не работает для этого, если вы не создали алиас) Это единственный поддерживаемый способ выхода из отладчика, хотя написание
exitдважды может сработать.Установите параметр
inhibit_exitв 0, если вы хотите иметь возможность перешагнуть через конец скрипта. Вам также может потребоваться установить $finished в 0, если вы хотите пройти через глобальное уничтожение. - R
-
Перезапустить отладчик, создав новую сессию. Мы пытаемся сохранить вашу историю, но внутренние настройки и параметры командной строки могут быть потеряны.
В настоящее время сохраняются следующие настройки: история, точки останова, действия, параметры отладчика и параметры командной строки Perl -w, -I и -e.
- |dbcmd
-
Запустить команду отладчика, перенаправив DB::OUT в текущий просмотрщик.
- ||dbcmd
-
То же, что и
|dbcmd, но DB::OUT также временноselect. - = [alias value]
-
Определить алиас команды, как
= quit qили отобразить текущие алиасы.
- command
-
Выполнить команду как оператор Perl. Будет добавлен заключительный символ «;». Если оператор Perl в противном случае будет спутано с Perl отладчиком, используйте также начальный символ «;».
- m expr
-
Отобразить, какие методы могут быть вызваны для результата вычисленного выражения. Выражение может возвращать ссылку на благословленный объект или имя пакета.
- M
-
Отобразить все загруженные модули и их версии.
- man [manpage]
-
Несмотря на свое название, это вызывает системный просмотрщик документации по заданной странице или сам просмотрщик, если manpage опущено. Если этот просмотрщик является man, текущая информация
Configиспользуется для вызова man с правильным параметром MANPATH или -M manpath. Неудачные поиски видаXXX, совпадающие с известными man-страницами вида perlXXX, будут повторены. Это позволяет вам ввестиman debugилиman opиз отладчика.В системах, традиционно лишенных работоспособной команды man, отладчик вызывает perldoc. Иногда это определение неверное из-за упрямых поставщиков или, скорее, благодаря предприимчивым пользователям. Если вы попадаете в одну из этих категорий, просто вручную установите переменную $DB::doccmd в просмотрщик для просмотра документации Perl в вашей системе. Это можно установить в файле rc или непосредственно путем присваивания. Мы все еще ждем работоспособного примера чего-то вроде:
$DB::doccmd = 'netscape -remote http://something.here/';
Настраиваемые параметры
В отладчике множество параметров, настраиваемых с помощью команды o, либо интерактивно, либо из среды или файла rc (./.perldb или ~/.perldb в Unix).
-
recallCommand,ShellBang -
Символы, используемые для вызова команды или запуска оболочки. По умолчанию оба установлены в
!, что неудобно. -
pager -
Программа, используемая для вывода команд, перенаправленных в просмотрщик (те, которые начинаются с символа
|). По умолчанию используется$ENV{PAGER}. Поскольку отладчик использует текущие характеристики вашего терминала для выделения полужирным шрифтом и подчеркивания, если выбранный просмотрщик не передает последовательности экранирования без изменений, вывод некоторых команд отладчика не будет читаемым при отправке через просмотрщик. -
tkRunning -
Запустить Tk во время запроса (с ReadLine).
-
signalLevel,warnLevel,dieLevel -
Уровень подробности. По умолчанию отладчик оставляет ваши исключения и предупреждения без изменений, потому что изменение их может сломать правильно работающие программы. Он попытается вывести сообщение при поступлении неперехваченных сигналов INT, BUS или SEGV. (Но см. упоминание о сигналах в разделе "BUGS" ниже).
Чтобы отключить этот режим безопасной работы по умолчанию, установите эти значения на значение больше 0. На уровне 1 вы получите трассировки стека при получении любого предупреждения (часто это раздражает) или исключения (часто это полезно). К сожалению, отладчик не может отличить фатальные исключения от нефатальных. Если
dieLevelдаже равно 1, то ваши нефатальные исключения также отслеживаются и бесцеремонно изменяются, если они произошли изeval'edстрок или из какого-либоevalвнутри модулей, которые вы пытаетесь загрузить. ЕслиdieLevelравно 2, отладчик не заботится о том, откуда они произошли: он присваивает себе обработчик исключений и выводит трассировку стека, затем изменяет все исключения своими дополнениями. Это, возможно, полезно для некоторых целей отслеживания, но имеет тенденцию разрушать любую программу, которая серьезно относится к обработке исключений. -
AutoTrace -
Режим трассировки (аналогичен команде
t, но может быть переведен в режимPERLDB_OPTS). -
LineInfo -
Файл или поток для вывода информации о строке номера. Если это поток (например,
|visual_perl_db), используется короткое сообщение. Это механизм взаимодействия с редактором-клиентом или визуальным отладчиком, например, специальными хукамиviилиemacs, или графическим отладчикомddd. -
inhibit_exit -
Если 0, разрешает переход за конец скрипта.
-
PrintRet -
Вывести значение возврата после команды
rпри установленном значении (по умолчанию). -
ornaments -
Влияет на отображение командной строки на экране (см. Term::ReadLine). В настоящее время нет способа отключить эти элементы, что может сделать некоторые выводы нечитаемыми на некоторых дисплеях или с некоторыми просмотрщиками. Это считается ошибкой.
-
frame -
Влияет на вывод сообщений при входе и выходе из подпрограмм. Если
frame & 2ложно, сообщения выводятся только при входе. (Вывод при выходе может быть полезен, если он чередуется с другими сообщениями.)Если
frame & 4, аргументы функций выводятся, плюс информация о контексте и вызывающей функции. Еслиframe & 8, перегруженныеstringifyиtieFETCHвключены в выводимых аргументах. Еслиframe & 16, выводится значение возврата подпрограммы.Длина, на которой обрезается список аргументов, определяется следующим параметром:
-
maxTraceLen -
Длина обрезки списка аргументов, когда бит 4 параметра
frameустановлен. -
windowSize -
Изменить размер окна списка кода (по умолчанию 10 строк).
Следующие параметры влияют на то, что происходит с V, X, и x командами:
-
arrayDepth,hashDepth -
Выводить только первые N элементов ('' — все).
-
dumpDepth -
Ограничить глубину рекурсии до N уровней при выводе структур. Отрицательные значения интерпретируются как бесконечность. По умолчанию: бесконечность.
-
compactDump,veryCompact -
Изменить стиль вывода массивов и хешей. Если
compactDump, короткий массив может быть напечатан в одну строку. -
globPrint -
Выводить содержимое глобов.
-
DumpDBFiles -
Выводить массивы, содержащие отлаживаемые файлы.
-
DumpPackages -
Выводить таблицы символов пакетов.
-
DumpReused -
Выводить содержимое «переиспользуемых» адресов.
-
quote,HighBit,undefPrint -
Изменить стиль вывода строк. Значение по умолчанию для
quote—auto; можно включить формат с двойными кавычками или одинарными кавычками, установив его соответственно на"или'. По умолчанию символы с установленным старшим битом печатаются буквально. -
UsageOnly -
Простой вывод использования памяти на пакет. Вычисляет общий размер строк, найденных в переменных в пакете. Это не включает лексические единицы в области видимости файла модуля или потерянные в замыканиях.
-
HistFile -
Путь к файлу, из которого будет читаться история (предполагается доступный интерфейс Term::ReadLine) при запуске отладчика, и в который она будет сохраняться при завершении (для сохранения между сессиями). Аналогично файлу
.bash_historyв Bash. -
HistSize -
Количество сохранённых строк в истории (предполагается
HistFileвыше).
После чтения файла rc отладчик считывает переменную среды $ENV{PERLDB_OPTS} и парсит её как остаток строки «O ...», как можно ввести в командной строке отладчика. Вы можете поместить параметры инициализации TTY, noTTY, ReadLine, и NonStop туда.
Если ваш файл rc содержит:
parse_options("NonStop=1 LineInfo=db.out AutoTrace"); то ваш скрипт будет выполняться без вмешательства пользователя, записывая отладочную информацию в файл db.out. (Если вы прервёте его, лучше сбросить LineInfo на /dev/tty, если вы ожидаете увидеть что-либо.)
-
TTY -
TTY для использования при отладке ввода/вывода.
-
noTTY -
При установке, отладчик переходит в режим
NonStopи не подключается к TTY. При прерывании (или если управление передаётся отладчику через явное задание $DB::signal или $DB::single из скрипта Perl) он подключается к TTY, указанному в параметреTTYпри запуске, или к tty, найденному во время выполнения с помощью модуляTerm::Rendezvousпо вашему выбору.Этот модуль должен реализовывать метод с именем
new, который возвращает объект с двумя методами:INиOUT. Они должны возвращать дескрипторы файлов для использования при отладке входных и выходных данных соответственно. Методnewдолжен проверить аргумент, содержащий значение$ENV{PERLDB_NOTTY}при запуске, или"$ENV{HOME}/.perldbtty$$"в противном случае. Этот файл не проверяется на правильное владение, поэтому теоретически возможны проблемы безопасности. -
ReadLine -
Если false, поддержка readline в отладчике отключена для отладки приложений, которые сами используют ReadLine.
-
NonStop -
Если установлено, отладчик переходит в неинтерактивный режим до прерывания или программного управления с помощью задания $DB::signal или $DB::single.
Вот пример использования переменной $ENV{PERLDB_OPTS}.
$ PERLDB_OPTS="NonStop frame=2" perl -d myprogram Это запустит скрипт myprogram без вмешательства пользователя, выведя дерево вызовов с точками входа и выхода. Обратите внимание, что NonStop=1 frame=2 эквивалентно N f=2, и что изначально параметры можно было сократить до первой буквы (кроме Dump* параметров). Тем не менее, рекомендуется всегда записывать их полностью для удобочитаемости и будущей совместимости.
Другие примеры включают
$ PERLDB_OPTS="NonStop LineInfo=listing frame=2" perl -d myprogram который запускает скрипт в неинтерактивном режиме, выводя информацию о каждом входе в подпрограмму и каждой выполненной строке в файл с именем listing. (Если вы прерываете его, лучше сбросить LineInfo на что-то «интерактивное»!)
Другие примеры включают (используя стандартную синтаксическую конструкцию оболочки для отображения настроек переменных среды):
$ ( PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out"
perl -d myprogram ) что может быть полезно для отладки программы, использующей Term::ReadLine . Не забудьте отсоединить оболочку от TTY в окне, соответствующем /dev/ttyXX, например, выполнив команду:
$ sleep 1000000 См. "Внутреннее устройство отладчика" в perldebguts для получения дополнительной информации.
Ввод/вывод отладчика
- Командная строка
-
Командная строка отладчика выглядит примерно так
DB<8>или даже
DB<<17>>где это число — номер команды, которую можно использовать для доступа к встроенному механизму истории в стиле csh. Например,
!17повторит команду номер 17. Глубина угловых скобок указывает глубину вложенности отладчика. Вы можете получить более одного набора скобок, например, если вы уже находитесь на точке останова и затем выводите результат вызова функции, которая сама имеет точку останова, или переходите внутрь выражения с помощью командыs/n/t expression. - Многострочные команды
-
Если вы хотите ввести многострочную команду, например, определение подпрограммы с несколькими операторами или формат, экранируйте новую строку, которая обычно заканчивает команду отладчика, с помощью обратного слэша. Вот пример:
DB<1> for (1..4) { \ cont: print "ok\n"; \ cont: } ok ok ok okОбратите внимание, что этот способ экранирования новой строки специфичен для интерактивных команд, введённых в отладчик.
- Обратная трассировка стека
-
Вот пример того, как может выглядеть обратная трассировка стека с помощью команды
T.$ = main::infested called from file 'Ambulation.pm' line 10 @ = Ambulation::legs(1, 2, 3, 4) called from file 'camel_flea' line 7 $ = main::pests('bactrian', 4) called from file 'camel_flea' line 4Левый символ там указывает контекст, в котором была вызвана функция, где
$и@означают скалярный или списочный контекст соответственно, а.означает пустой контекст (на самом деле это своего рода скалярный контекст). Выше отображается, что вы находились в функцииmain::infestedпри выполнении вывода трассировки стека, и что она была вызвана в скалярном контексте из строки 10 файла Ambulation.pm, но без каких-либо аргументов, что означает, что она была вызвана как&infested. Следующая запись стека показывает, что функцияAmbulation::legsбыла вызвана в списочном контексте из файла camel_flea с четырьмя аргументами. Последняя запись стека показывает, чтоmain::pestsбыла вызвана в скалярном контексте также из camel_flea, но со строки 4.Если вы выполните команду
Tиз внутри активногоuseоператора, обратная трассировка стека будет содержать какrequireкадр, так иevalкадр. - Формат списка строк
-
Это показывает типы вывода, которые может генерировать команда
l.DB<<13>> l 101: @i{@i} = (); 102:b @isa{@i,$pack} = () 103 if(exists $i{$prevpack} || exists $isa{$pack}); 104 } 105 106 next 107==> if(exists $isa{$pack}); 108 109:a if ($extra-- > 0) { 110: %isa = ($pack,1);Разрываемые строки помечены
:. Строки с точками останова помеченыb, а строки с действиями —a. Строка, которая должна быть выполнена, отмечена==>.Пожалуйста, имейте в виду, что код в списках отладчика может не совпадать с исходным исходным кодом. Директивы строк и внешние фильтры источников могут изменять код до того, как Perl его увидит, перемещая код из его исходных положений или принимая совершенно другие формы.
- Вывод фреймов
-
Если параметр
frameустановлен, отладчик будет выводить введенные (и необязательно вышедшие) подпрограммы в разных стилях. См. perldebguts для невероятно длинных примеров этих стилей.
Отладка операторов времени компиляции
Если у вас есть исполняемые операторы времени компиляции (например, код внутри блоков BEGIN, UNITCHECK и CHECK или use операторов), они не будут останавливаться отладчиком, хотя require и INIT блоки будут, и операторы времени компиляции можно отслеживать с параметром AutoTrace установленным в PERLDB_OPTS. Из вашего собственного кода Perl вы можете вернуть управление обратно в отладчик с помощью следующего оператора, который безопасен, если отладчик не запущен:
$DB::single = 1; Если вы установите $DB::single в 2, это эквивалентно простому вводу команды n, а значение 1 означает команду s. Переменная $DB::trace должна быть установлена в 1, чтобы смоделировать ввод команды t.
Другой способ отладить код времени компиляции — запустить отладчик, установить точку останова при загрузке модуля:
DB<7> b load f:/perllib/lib/Carp.pm
Will stop on load of 'f:/perllib/lib/Carp.pm'. а затем перезапустить отладчик с помощью команды R (если это возможно). Можно использовать b compile subname для той же цели.
Настройка отладчика
В отладчике, вероятно, достаточно точек настройки, чтобы вам никогда не пришлось их изменять самостоятельно. Вы можете изменить поведение отладчика изнутри отладчика с помощью его команды o, из командной строки с помощью переменной среды PERLDB_OPTS, и из файлов настройки.
Вы можете выполнить настройку, создав файл .perldb, содержащий код инициализации. Например, вы могли бы создать псевдонимы, такие как эти (последний — тот, который люди ожидают увидеть):
$DB::alias{'len'} = 's/^len(.*)/p length($1)/';
$DB::alias{'stop'} = 's/^stop (at|in)/b/';
$DB::alias{'ps'} = 's/^ps\b/p scalar /';
$DB::alias{'quit'} = 's/^quit(\s*)/exit/'; Вы можете изменить параметры из .perldb, используя вызовы, подобные этому:
parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2"); Код выполняется в пакете DB. Обратите внимание, что .perldb обрабатывается до обработки PERLDB_OPTS. Если .perldb определяет подпрограмму afterinit, эта функция вызывается после завершения инициализации отладчика. .perldb может находиться в текущем каталоге или в домашнем каталоге. Поскольку этот файл подключается Perl и может содержать произвольные команды, по соображениям безопасности он должен принадлежать суперпользователю или текущему пользователю и быть доступным для записи только владельцу.
Вы можете имитировать ввод TTY для отладчика, добавив произвольные команды в @DB::typeahead. Например, ваш файл .perldb может содержать:
sub afterinit { push @DB::typeahead, "b 4", "b 6"; } Это попытается установить точки останова на строках 4 и 6 сразу после инициализации отладчика. Обратите внимание, что @DB::typeahead — это не поддерживаемый интерфейс и может быть изменён в будущих выпусках.
Если вы хотите изменить отладчик, скопируйте perl5db.pl из библиотеки Perl в другое имя и измените его по своему усмотрению. Затем вам нужно будет установить переменную среды PERL5DB со значением, подобным этому:
BEGIN { require "myperl5db.pl" } В качестве последнего средства, вы также можете использовать PERL5DB для настройки отладчика путём прямого изменения внутренних переменных или вызова функций отладчика.
Обратите внимание, что любые переменные и функции, которые не задокументированы в данном документе (или в perldebguts), считаются предназначенными только для внутреннего использования и могут быть изменены без предварительного уведомления.
Поддержка Readline / История в отладчике
В стандартной поставке единственная история командной строки — это упрощенная, которая проверяет наличие ведущих восклицательных знаков. Однако, если вы установите модули Term::ReadKey и Term::ReadLine с CPAN (например, Term::ReadLine::Gnu, Term::ReadLine::Perl, ...), у вас появятся полные возможности редактирования, аналогичные тем, которые предоставляет GNU readline(3). Ищите их в каталоге modules/by-module/Term на CPAN. Однако эти модули не поддерживают обычное редактирование командной строки с помощью vi.
Также доступна элементарная автодополнение командной строки, включая лексические переменные в текущем объеме, если установлен модуль PadWalker.
Без поддержки Readline вы можете увидеть символы "^[[A", "^[[C", "^[[B", "^[[D"", "^H", ... при использовании клавиш со стрелками и/или клавиши Backspace.
Поддержка редакторов для отладки
Если у вас на системе установлена версия emacs от GNU, она может взаимодействовать с отладчиком Perl для предоставления интегрированной среды разработки, напоминающей её взаимодействие с отладчиками C.
Недавние версии Emacs поставляются с начальным файлом, который заставляет emacs работать как синтаксически направленный редактор, понимающий (некоторый) синтаксис Perl. См. perlfaq3.
Пользователи vi также должны ознакомиться с vim и gvim, версиями с поддержкой мыши и цветом, для выделения ключевых слов Perl.
Обратите внимание, что только perl может в полной мере анализировать Perl, поэтому все такие инструменты CASE в какой-то мере уступают по возможностям, особенно если вы не программируете Perl так, как это делает программист C.
Профилировщик Perl
Если вы хотите использовать альтернативный отладчик для Perl, вызовите скрипт со значением аргумента пакета, указанным после двоеточия и флага -d. Альтернативные отладчики Perl включают профилировщик Perl, Devel::NYTProf, который доступен отдельно как дистрибутив CPAN. Для профилирования программы Perl в файле mycode.pl просто введите:
$ perl -d:NYTProf mycode.pl По завершении скрипта профилировщик создаст базу данных информации о профиле, которую вы можете преобразовать в отчеты с помощью инструментов профилировщика. Подробности см. в <perlperf>.
Отладка регулярных выражений
use re 'debug' позволяет увидеть подробности работы движка регулярных выражений Perl. Для понимания обычно объёмного вывода необходимо не только иметь представление о работе сопоставления регулярных выражений в общем, но и знать, как регулярные выражения Perl компилируются во внутренний автомат. Эти вопросы подробно рассматриваются в "Debugging Regular Expressions" в perldebguts.
Отладка использования памяти
Perl содержит внутреннюю поддержку отчётов об использовании памяти, но это довольно продвинутая концепция, требующая понимания работы распределения памяти. Подробности см. в "Debugging Perl Memory Usage" в perldebguts.
См. также
У вас use strict и use warnings включены, не так ли?
perldebtut, perldebguts, re, DB, Devel::NYTProf, Dumpvalue и perlrun.
При отладке скрипта, использующего #! и обычно находящегося в $PATH, опция -S заставляет perl искать его в $PATH, так что вам не нужно вводить путь или which $scriptname.
$ perl -Sd foo.pl ОШИБКИ
Вы не можете получить информацию о стеке кадров или каким-либо образом отлаживать функции, которые не были скомпилированы Perl, такие как функции из расширений C или C++.
Если вы изменяете аргументы @_ в подпрограмме (например, с помощью shift или pop), трассировка стека не отобразит исходные значения.
Отладчик в настоящее время не работает совместно с флагом командной строки -W, поскольку сам он не свободен от предупреждений.
Если вы находитесь в медленном системном вызове (например, waiting, accepting или reading с клавиатуры или сокета) и не настроили свой собственный обработчик $SIG{INT}, то вы не сможете прервать его с помощью CTRL-C, так как собственный обработчик $SIG{INT} отладчика не понимает, что ему нужно вызвать исключение, чтобы перейти на longjmp(3) из медленных системных вызовов.
© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.30.3/perldebug