perldebug
СОДЕРЖАНИЕ
- НАЗВАНИЕ
- ОПИСАНИЕ
- Отладчик Perl
- Отладка регулярных выражений
- Отладка использования памяти
- СМОТРИТЕ ТАКЖЕ
- ОШИБКИ
НАЗВАНИЕ
perldebug - Отладка Perl
ОПИСАНИЕ
Прежде всего, вы пробовали использовать use strict; и use warnings;?
Если вы новичок в отладчике Perl, вам, возможно, будет полезнее ознакомиться с perldebtut, который представляет собой вводный учебник по отладчику.
Если вас интересуют подробные технические детали реализации отладчика, вам, возможно, будет полезнее прочитать perldebguts.
Для подробных технических сведений об использовании см. perl5db.pl, документацию самого отладчика.
Отладчик 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
-
Повторить number-ю предыдущую команду.
- ! pattern
-
Повторить последнюю команду, начинающуюся с шаблона. См. также
o recallCommand. - !! cmd
-
Запустить cmd в дочернем процессе (читает из DB::IN, записывает в DB::OUT). См. также
o shellBang. Обратите внимание, что будет использована текущая оболочка пользователя (то есть переменная$ENV{SHELL}), что может повлиять на правильную интерпретацию статуса выхода или сигналов и информации о coredump. - source file
-
Прочитать и выполнить команды отладчика из файла file. Сам файл file может содержать
sourceкоманды. - H -number
-
Отобразить последние n команд. Список содержит только команды длиной более одного символа. Если number опущено, отобразить все.
- q или ^D
-
Выход. ("quit" не работает для этого, если вы не создали alias) Это единственный поддерживаемый способ выйти из отладчика, хотя написание
exitдважды может сработать.Установите параметр
inhibit_exitв 0, если вы хотите иметь возможность выйти за пределы скрипта. Возможно, также потребуется установить $finished в 0, если вы хотите выполнить глобальное разрушение. - R
-
Перезапустить отладчик, создав новую сессию. Мы стараемся сохранить вашу историю при этом, но внутренние настройки и параметры командной строки могут быть потеряны.
В настоящее время сохраняются следующие настройки: история, точки останова, действия, параметры отладчика и параметры командной строки Perl -w, -I и -e.
- |dbcmd
-
Выполнить команду отладчика, перенаправив DB::OUT в текущий просмотрщик страниц.
- ||dbcmd
-
То же, что и
|dbcmd, но DB::OUT также временноselect. - = [alias value]
-
Определить alias команды, как
= quit qили вывести список текущих alias.
- 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 с /dev/tty, perldb.ini в противном случае.
-
recallCommand,ShellBang -
Символы, используемые для воспроизведения команды или запуска оболочки. По умолчанию оба установлены в
!, что неудобно. -
pager -
Программа для использования в качестве просмотрщика страниц для команд, перенаправленных в просмотрщик (те, которые начинаются с символа
|). По умолчанию используется$ENV{PAGER}. Поскольку отладчик использует характеристики вашего текущего терминала для выделения жирным шрифтом и подчеркивания, если выбранный просмотрщик не пропускает последовательности escape без изменений, вывод некоторых команд отладчика не будет читаемым при отправке через просмотрщик. -
tkRunning -
Запустить Tk при запросе (с ReadLine).
-
signalLevel,warnLevel,dieLevel -
Уровень подробности. По умолчанию отладчик оставляет ваши исключения и предупреждения без изменения, потому что изменение их может нарушить правильную работу программ. Он попытается вывести сообщение при получении необработанных сигналов INT, BUS или SEGV. (Но см. упоминание о сигналах в разделе "ОШИБКИ" ниже).
Чтобы отключить этот режим безопасного по умолчанию, установите эти значения на значение больше 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иtieаргументыFETCHвключены в вывод. Если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'a
.bash_history. -
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 для использования при отладке I/O.
-
noTTY -
Если установлено, отладчик переходит в режим
NonStopи не подключится к TTY. Если прерван (или если управление переходит к отладчику через явное задание $DB::signal или $DB::single из скрипта Perl), он подключается к TTY, указанному в опцииTTYпри запуске или к TTY, найденному во время выполнения с помощью модуляTerm::Rendezvousпо вашему выбору.Этот модуль должен реализовывать метод с именем
new, который возвращает объект с двумя методами:INиOUT. Они должны возвращать дескрипторы файлов для использования для ввода и вывода отладки соответственно. Методnewдолжен проверить аргумент, содержащий значение$ENV{PERLDB_NOTTY}при запуске или"$ENV{HOME}/.perldbtty$$"в противном случае. Этот файл не проверяется на правильное владение, поэтому теоретически возможны угрозы безопасности. -
ReadLine -
Если ложно, поддержка 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 Подробности см. в разделе "Debugger Internals" в 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 компилируются во внутренний автомат. Эти вопросы подробно изучаются в "Отладка регулярных выражений" в perldebguts.
Отладка использования памяти
Perl содержит встроенную поддержку для отчета об использовании памяти, но это довольно сложная концепция, которая требует понимания принципов работы выделения памяти. См. "Отладка использования памяти Perl" в perldebguts для подробностей.
См. также
У вас включены use strict и use warnings?
perldebtut, perldebguts, perl5db.pl, 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–2021 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.34.0/perldebug