Spec-Zone.ru › Perl 5.38

perldebug

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
  • Отладчик Perl
    • Вызов отладчика
    • Команды отладчика
    • Настраиваемые параметры
    • Ввод/вывод отладчика
    • Отладка инструкций времени компиляции
    • Настройка отладчика
    • Поддержка Readline/История в отладчике
    • Поддержка редакторов для отладки
    • Профилировщик 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

Отладить заданную программу с использованием потоков (экспериментально).

Если Perl вызывается со флагом -d , переменная $^P будет содержать истинное значение. Это полезно, если вам нужно узнать, выполняется ли ваш код под отладчиком:

if ( $^P ) {
    # running under the debugger
}

См. "$^P" в perlvar для получения дополнительной информации о переменной.

Команды отладчика

Интерактивный отладчик понимает следующие команды:

h

Выводит сводку сообщений справки

h [command]

Выводит сообщение справки для заданной команды отладчика.

h h

Специальный аргумент h h создаёт всю страницу справки, которая довольно длинная.

Если вывод команды h h (или любой другой команды) выходит за пределы экрана, добавьте перед командой символ «|», чтобы запустить её через программу просмотра страниц, как в

DB> |h h

Вы можете изменить программу просмотра, используя команду o pager=....

p expr

То же самое, что и print {$DB::OUT} expr в текущем пакете. В частности, так как это просто собственная функция Perl print, это означает, что вложенные структуры данных и объекты не выводятся, в отличие от команды 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, он рассматривается как регулярное выражение.

Форматированные строки (если доступны) рассматриваются как имена файлов: 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

Удалить точку останова из указанной строки.

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

Повторить последнюю команду, начинающуюся с pattern. См. также o recallCommand.

!! cmd

Запустить cmd в дочернем процессе (считывает из DB::IN, записывает в DB::OUT) См. также o shellBang. Обратите внимание, что будет использована текущая оболочка пользователя (а именно переменная $ENV{SHELL}), что может повлиять на правильную интерпретацию состояния выхода или сигнала и информации о coredump.

source file

Считать и выполнить команды отладчика из файла file. Файл file сам может содержать source команды.

H -number

Отобразить последние n команд. Отображаются только команды, длина которых больше одного символа. Если number опущено, отображаются все.

q or ^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 , которые соответствуют известным страницам справки в формате 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. (Но см. упоминание о сигналах в "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 и 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_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

Если ложно, поддержка 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, потому что сам он не свободен от предупреждений.

Если вы находитесь в медленном системном вызове (например, waitя, acceptя или readя с клавиатуры или сокета) и не настроите собственный обработчик $SIG{INT}, то вы не сможете использовать CTRL-C для возврата в отладчик, так как собственный обработчик $SIG{INT} отладчика не понимает, что нужно поднимать исключение для выхода из медленных системных вызовов с помощью longjmp(3).

© 1993–2023 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.38.0/perldebug

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API