Spec-Zone.ru › Perl 5.36

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

Если 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

См. "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.36.0/perldebug

Spec-Zone.ru

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