Spec-Zone.ru › Perl 5.32

perldebug

СОДЕРЖАНИЕ

  • НАЗВАНИЕ
  • ОПИСАНИЕ
  • Отладчик Perl
    • Вызов отладчика
    • Команды отладчика
    • Настраиваемые параметры
    • Ввод/вывод отладчика
    • Отладка операторов времени компиляции
    • Настройка отладчика
    • Поддержка Readline/История в отладчике
    • Поддержка отладки в редакторе
    • Профилировщик Perl
  • Отладка регулярных выражений
  • Отладка использования памяти
  • СМОТРИТЕ ТАКЖЕ
  • ОШИБКИ

НАЗВАНИЕ

perldebug - Отладка Perl

ОПИСАНИЕ

Прежде всего, вы пытались использовать use strict; и use warnings;?

Если вы новичок в отладчике Perl, вы можете предпочесть прочитать perldebtut, что является учебным введением в отладчик.

Если вы ищете подробные сведения о том, как реализован отладчик, вы можете предпочесть прочитать perldebguts.

Отладчик Perl

Если вы вызываете Perl с переключателем -d, ваш скрипт выполняется под отладчиком исходного кода Perl. Он работает как интерактивная среда Perl, запрашивая команды отладчика, которые позволяют вам изучить исходный код, установить точки останова, получить трассировки стека, изменить значения переменных и т. д. Это так удобно, что вы часто запускаете отладчик самостоятельно, чтобы интерактивно протестировать конструкции Perl и посмотреть, что они делают. Например:

$ perl -d -e 42

В Perl отладчик не является отдельной программой, как обычно в типичной среде компиляции. Вместо этого флаг -d сообщает компилятору вставить информацию о коде в синтаксические деревья, которые он собирается передать интерпретатору. Это означает, что ваш код должен быть скомпилирован без ошибок, чтобы отладчик мог с ним работать. Затем, когда интерпретатор запускается, он загружает специальный файл библиотеки Perl, содержащий отладчик.

Программа остановится непосредственно перед первым исполняемым оператором выполнения (но см. ниже раздел об операторах времени компиляции) и попросит вас ввести команду отладчика. В отличие от распространённого мнения, всякий раз, когда отладчик останавливается и показывает вам строку кода, он всегда отображает строку, которую он собирается выполнить, а не ту, которую он только что выполнил.

Любая команда, не распознанная отладчиком, непосредственно выполняется (eval) как код Perl в текущем пакете. (Отладчик использует пакет DB для хранения собственной информации о состоянии.)

Обратите внимание, что упомянутый eval ограничен неявным объявлением области видимости. В результате любые недавно введённые лексические переменные или изменённое содержимое буфера захвата теряются после eval. Отладчик – это хорошая среда для изучения Perl, но если вы интерактивно экспериментируете с материалами, которые должны находиться в одной области видимости, поместите их в одну строку.

Для любого текста, вводимого в командной строке отладчика, ведущие и хвостовые пробелы сначала удаляются перед дальнейшей обработкой. Если команда отладчика совпадает с какой-либо функцией в вашей собственной программе, просто добавьте перед функцией что-то, что не похоже на команду отладчика, например, ведущий ; или, возможно, +, или заключите её в скобки или фигурные скобки.

Вызов отладчика

Существует несколько способов вызвать отладчик:

perl -d program_name

Для данной программы, идентифицированной по program_name.

perl -d -e 0

Введите произвольную expression в интерактивном режиме с помощью -e.

perl -d:ptkdb program_name

Отладить данную программу с помощью Devel::ptkdb графического интерфейса.

perl -dt threaded_program_name

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

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

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

h

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

h [command]

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

h h

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

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

DB> |h h

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

p expr

Аналогично команде print {$DB::OUT} expr в текущем пакете. В частности, поскольку это просто функция print Perl, это означает, что вложенные структуры данных и объекты не выводятся, в отличие от команды x.

Файл-дескриптор DB::OUT открывается для /dev/tty, независимо от того, куда перенаправлен STDOUT.

x [maxdepth] expr

Вычисляет выражение в контексте списка и выводит результат в формате с красивым форматированием. Вложенные структуры данных выводятся рекурсивно, в отличие от реальной функции print в Perl. При выводе хэшей, вероятно, лучше использовать 'x \%h', а не 'x %h'. Обратитесь к Dumpvalue, если хотите сделать это самостоятельно.

Формат вывода управляется множеством параметров, описанных в разделе "Настраиваемые параметры".

Если включен maxdepth, он должен быть числом N; значение выводится только на глубину N уровней, как будто параметр dumpDepth был временно установлен в значение N.

V [pkg [vars]]

Отобразить все (или некоторые) переменные в пакете (по умолчанию main) с помощью красивого вывода данных (хэши показывают свои ключи и значения, управляющие символы отображаются как печатные и т. д.). Убедитесь, что вы не используете спецификатор типа (например, $), а только имена символов, как в этом примере:

V DB filename line

Используйте ~pattern и !pattern для положительных и отрицательных регулярных выражений.

Это аналогично вызову команды x для каждой соответствующей переменной.

X [vars]

Аналогично V currentpackage [vars].

y [level [vars]]

Отобразить все (или некоторые) лексические переменные (мнемоническое обозначение: mY переменные) в текущей области видимости или на level уровней выше. Вы можете ограничить отображаемые переменные с помощью параметра vars, который работает точно так же, как и для команд V и X. Требуется модуль PadWalker версии 0.08 или выше; выводится предупреждение, если он не установлен. Вывод красиво отформатирован, так же, как для команды V, а формат управляется теми же опциями.

T

Создать трассировку стека. Подробности вывода см. ниже.

s [expr]

Один шаг. Выполняет операцию до начала следующего оператора, спускается в подпрограммы. Если указано выражение, включающее вызовы функций, то они также будут выполняться пошагово.

n [expr]

Далее. Выполняет операцию через подпрограммы, до начала следующего оператора. Если указано выражение, включающее вызовы функций, эти функции будут выполняться с остановками перед каждым оператором.

r

Продолжить выполнение до возврата из текущей подпрограммы. Вывести возвращаемое значение, если установлен параметр PrintRet (по умолчанию).

<CR>

Повторить последнюю команду n или s.

c [line|sub]

Продолжить выполнение, необязательно вставив одноразовый брейкпоинт в указанную строку или подпрограмму.

l

Вывести следующий фрагмент строк.

l min+incr

Вывести incr+1 строк, начиная с min.

l min-max

Вывести строки от min до max. l - эквивалентно -.

l line

Вывести одну строку.

l subname

Вывести первый фрагмент строк из подпрограммы. subname может быть переменной, содержащей ссылку на код.

-

Вывести предыдущий фрагмент строк.

v [line]

Просмотреть несколько строк кода вокруг текущей строки.

.

Возвращает внутренний указатель отладчика на последнюю выполненную строку и выводит эту строку.

f filename

Переключиться на просмотр другого файла или eval оператора. Если filename не является полным путем, найденным в значениях %INC, он рассматривается как регулярное выражение.

eval строки (если доступны) считаются именами файлов: f (eval 7) и f eval 7\b обращаются к телу 7-й eval строки (в порядке выполнения). Тела текущего выполняемого eval и eval строк, определяющих подпрограммы, сохраняются и, следовательно, доступны.

/pattern/

Найти вперёд шаблон (Perl регулярное выражение); конечный / необязателен. Поиск по умолчанию нечувствителен к регистру.

?pattern?

Найти назад шаблон; конечный ? необязателен. Поиск по умолчанию нечувствителен к регистру.

L [abw]

Вывести (по умолчанию все) действия, точки останова и выражения наблюдения.

S [[!]regex]

Вывести имена подпрограмм [не] соответствующие регулярному выражению.

t [n]

Переключить режим отслеживания (см. также параметр AutoTrace). Необязательный аргумент — максимальное количество уровней отслеживания ниже текущего; всё глубже будет молчать.

t [n] expr

Отследить выполнение expr. Необязательный первый аргумент — максимальное количество уровней отслеживания ниже текущего; всё глубже будет молчать. См. "Примеры вывода списка фреймов" в perldebguts для примеров.

b

Устанавливает точку останова на текущей строке.

b [line] [condition]

Установить точку останова перед данной строкой. Если указано условие, оно вычисляется каждый раз, когда достигается оператор: точка останова выполняется только если условие истинно. Точки останова могут быть установлены только на строках, начинающихся с исполняемого оператора. Условия не используют if.

b 237 $x > 30
b 237 ++$count237 < 11
b 33 /pattern/i

Если номер строки ., устанавливает точку останова на текущей строке:

b . $n > 100
b [file]:[line] [condition]

Установить точку останова перед данной строкой в (возможно, другом) файле. Если указано условие, оно вычисляется каждый раз, когда достигается оператор: точка останова выполняется только если условие истинно. Точки останова могут быть установлены только на строках, начинающихся с исполняемого оператора. Условия не используют if.

b lib/MyModule.pm:237 $x > 30
b /usr/lib/perl5/site_perl/CGI.pm:100 ++$count100 < 11
b subname [condition]

Установить точку останова перед первой строкой указанной подпрограммы. subname может быть переменной, содержащей ссылку на код (в этом случае condition не поддерживается).

b postpone subname [condition]

Установить точку останова в первой строке подпрограммы после её компиляции.

b load filename

Установить точку останова перед первой выполненной строкой файла filename, который должен быть полным путем, найденным среди значений %INC.

b compile subname

Устанавливает точку останова перед первым оператором, выполняемым после компиляции указанной подпрограммы.

B line

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

B *

Удалить все установленные точки останова.

disable [file]:[line]

Отключить точку останова, чтобы она не останавливала выполнение программы. Точки останова включены по умолчанию и могут быть снова включены с помощью команды enable.

disable [line]

Отключить точку останова, чтобы она не останавливала выполнение программы. Точки останова включены по умолчанию и могут быть снова включены с помощью команды enable.

Это выполняется для точки останова в текущем файле.

enable [file]:[line]

Включить точку останова, чтобы она останавливала выполнение программы.

enable [line]

Включить точку останова, чтобы она останавливала выполнение программы.

Это выполняется для точки останова в текущем файле.

a [line] command

Установить действие, которое должно быть выполнено перед выполнением строки. Если line опущено, установите действие на строку, которая будет выполнена. Последовательность действий отладчика:

1. check for a breakpoint at this line
2. print the line if necessary (tracing)
3. do any actions associated with that line
4. prompt user if at a breakpoint or in single-step
5. evaluate line

Например, это выведет $foo каждый раз, когда будет пройдена строка 53:

a 53 print "DB FOUND $foo\n"
A line

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

A *

Удалить все установленные действия.

w expr

Добавить глобальное выражение наблюдения. Всякий раз, когда отслеживаемое глобальное значение меняется, отладчик остановится и отобразит старое и новое значения.

W expr

Удалить выражение наблюдения.

W *

Удалить все выражения наблюдения.

o

Отобразить все параметры.

o booloption ...

Установить каждое перечисленное булево значение параметра на значение 1.

o anyoption? ...

Вывести значение одного или нескольких параметров.

o option=value ...

Установите значение одного или нескольких параметров. Если значение содержит внутренние пробелы, оно должно быть заключено в кавычки. Например, вы можете установить o pager="less -MQeicsNfr" для вызова less с указанными параметрами. Вы можете использовать одинарные или двойные кавычки, но если вы это делаете, вы должны экранировать любые вложенные экземпляры того же вида кавычек, с которых вы начали, а также любые экранирования, которые непосредственно предшествуют этой кавычке, но которые не предназначены для экранирования самой кавычки. Другими словами, вы следуете правилам одинарных кавычек независимо от кавычек; например: o option='this isn\'t bad' или o option="She said, \"Isn't it?\"".

По историческим причинам =value является необязательным, но по умолчанию равен 1 только там, где это безопасно – то есть, в основном для логических параметров. Лучше всегда назначать конкретное значение с помощью =. option может быть сокращен, но для ясности, вероятно, не следует. Несколько параметров могут быть установлены вместе. Список этих параметров см. в разделе "Настраиваемые параметры".

< ?

Отобразить все действия команд Perl перед запросом.

< [ command ]

Установить действие (команду Perl), которое должно выполняться перед каждым запросом отладчика. Многострочная команда может быть введена, экранируя новые строки.

< *

Удалить все действия команд Perl перед запросом.

<< command

Добавить действие (команду Perl), которое должно выполняться перед каждым запросом отладчика. Многострочная команда может быть введена, экранируя новые строки.

> ?

Отобразить все действия команд Perl после запроса.

> command

Установить действие (команду Perl), которое должно выполняться после запроса, когда вы только что ввели команду для возврата к выполнению скрипта. Многострочная команда может быть введена, экранируя новые строки (мы надеемся, что вы к этому моменту догадались).

> *

Удалить все действия команд Perl после запроса.

>> command

Добавляет действие (команду Perl), которое должно выполняться после запроса, когда вы только что ввели команду для возврата к выполнению скрипта. Многострочная команда может быть введена, экранируя новые строки.

{ ?

Отобразить команды отладчика перед запросом.

{ [ command ]

Установить действие (команду отладчика), которое должно выполняться перед каждым запросом отладчика. Многострочная команда может быть введена стандартным способом.

Поскольку эта команда в некотором смысле новая, выводится предупреждение, если вы, похоже, случайно ввели блок. Если это то, что вы хотите сделать, запишите его так же, как и с ;{ ... } или даже do { ... }.

{ *

Удалить все команды отладчика перед запросом.

{{ command

Добавить действие (команду отладчика), которое должно выполняться перед каждым запросом отладчика. Многострочную команду можно ввести, если вы можете догадаться, как это сделать: см. выше.

! number

Повторить предыдущую команду (по умолчанию – предыдущую команду).

! -number

Повторить номер-ю предыдущую команду.

! pattern

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

!! cmd

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

source file

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

H -number

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

q или ^D

Выйти. ("quit" не работает для этого, если вы не создали алиас) Это единственный поддерживаемый способ выхода из отладчика, хотя написание exit дважды может сработать.

Установите параметр inhibit_exit в 0, если вы хотите иметь возможность перешагнуть через конец скрипта. Вам также может потребоваться установить $finished в 0, если вы хотите пройти через глобальное уничтожение.

R

Перезапустить отладчик, создав новую сессию. Мы пытаемся сохранить вашу историю, но внутренние настройки и параметры командной строки могут быть потеряны.

В настоящее время сохраняются следующие настройки: история, точки останова, действия, параметры отладчика и параметры командной строки Perl -w, -I и -e.

|dbcmd

Запустить команду отладчика, перенаправив DB::OUT в текущий просмотрщик.

||dbcmd

То же, что и |dbcmd, но DB::OUT также временно select.

= [alias value]

Определить алиас команды, как

= quit q

или отобразить текущие алиасы.

command

Выполнить команду как оператор Perl. Будет добавлен заключительный символ «;». Если оператор Perl в противном случае будет спутано с Perl отладчиком, используйте также начальный символ «;».

m expr

Отобразить, какие методы могут быть вызваны для результата вычисленного выражения. Выражение может возвращать ссылку на благословленный объект или имя пакета.

M

Отобразить все загруженные модули и их версии.

man [manpage]

Несмотря на свое название, это вызывает системный просмотрщик документации по заданной странице или сам просмотрщик, если manpage опущено. Если этот просмотрщик является man, текущая информация Config используется для вызова man с правильным параметром MANPATH или -M manpath. Неудачные поиски вида XXX, совпадающие с известными man-страницами вида perlXXX, будут повторены. Это позволяет вам ввести man debug или man op из отладчика.

В системах, традиционно лишенных работоспособной команды man, отладчик вызывает perldoc. Иногда это определение неверное из-за упрямых поставщиков или, скорее, благодаря предприимчивым пользователям. Если вы попадаете в одну из этих категорий, просто вручную установите переменную $DB::doccmd в просмотрщик для просмотра документации Perl в вашей системе. Это можно установить в файле rc или непосредственно путем присваивания. Мы все еще ждем работоспособного примера чего-то вроде:

$DB::doccmd = 'netscape -remote http://something.here/';

Настраиваемые параметры

В отладчике множество параметров, настраиваемых с помощью команды o, либо интерактивно, либо из среды или файла rc (./.perldb или ~/.perldb в Unix).

recallCommand, ShellBang

Символы, используемые для вызова команды или запуска оболочки. По умолчанию оба установлены в !, что неудобно.

pager

Программа, используемая для вывода команд, перенаправленных в просмотрщик (те, которые начинаются с символа |). По умолчанию используется $ENV{PAGER}. Поскольку отладчик использует текущие характеристики вашего терминала для выделения полужирным шрифтом и подчеркивания, если выбранный просмотрщик не передает последовательности экранирования без изменений, вывод некоторых команд отладчика не будет читаемым при отправке через просмотрщик.

tkRunning

Запустить Tk во время запроса (с ReadLine).

signalLevel, warnLevel, dieLevel

Уровень подробности. По умолчанию отладчик оставляет ваши исключения и предупреждения без изменений, потому что изменение их может сломать правильно работающие программы. Он попытается вывести сообщение при поступлении неперехваченных сигналов INT, BUS или SEGV. (Но см. упоминание о сигналах в разделе "BUGS" ниже).

Чтобы отключить этот режим безопасной работы по умолчанию, установите эти значения на значение больше 0. На уровне 1 вы получите трассировки стека при получении любого предупреждения (часто это раздражает) или исключения (часто это полезно). К сожалению, отладчик не может отличить фатальные исключения от нефатальных. Если dieLevel даже равно 1, то ваши нефатальные исключения также отслеживаются и бесцеремонно изменяются, если они произошли из eval'ed строк или из какого-либо eval внутри модулей, которые вы пытаетесь загрузить. Если dieLevel равно 2, отладчик не заботится о том, откуда они произошли: он присваивает себе обработчик исключений и выводит трассировку стека, затем изменяет все исключения своими дополнениями. Это, возможно, полезно для некоторых целей отслеживания, но имеет тенденцию разрушать любую программу, которая серьезно относится к обработке исключений.

AutoTrace

Режим трассировки (аналогичен команде t, но может быть переведен в режим PERLDB_OPTS).

LineInfo

Файл или поток для вывода информации о строке номера. Если это поток (например, |visual_perl_db), используется короткое сообщение. Это механизм взаимодействия с редактором-клиентом или визуальным отладчиком, например, специальными хуками vi или emacs, или графическим отладчиком ddd.

inhibit_exit

Если 0, разрешает переход за конец скрипта.

PrintRet

Вывести значение возврата после команды r при установленном значении (по умолчанию).

ornaments

Влияет на отображение командной строки на экране (см. Term::ReadLine). В настоящее время нет способа отключить эти элементы, что может сделать некоторые выводы нечитаемыми на некоторых дисплеях или с некоторыми просмотрщиками. Это считается ошибкой.

frame

Влияет на вывод сообщений при входе и выходе из подпрограмм. Если frame & 2 ложно, сообщения выводятся только при входе. (Вывод при выходе может быть полезен, если он чередуется с другими сообщениями.)

Если frame & 4, аргументы функций выводятся, плюс информация о контексте и вызывающей функции. Если frame & 8, перегруженные stringify и 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

Если false, поддержка readline в отладчике отключена для отладки приложений, которые сами используют ReadLine.

NonStop

Если установлено, отладчик переходит в неинтерактивный режим до прерывания или программного управления с помощью задания $DB::signal или $DB::single.

Вот пример использования переменной $ENV{PERLDB_OPTS}.

$ PERLDB_OPTS="NonStop frame=2" perl -d myprogram

Это запустит скрипт myprogram без вмешательства пользователя, выведя дерево вызовов с точками входа и выхода. Обратите внимание, что NonStop=1 frame=2 эквивалентно N f=2, и что изначально параметры можно было сократить до первой буквы (кроме Dump* параметров). Тем не менее, рекомендуется всегда записывать их полностью для удобочитаемости и будущей совместимости.

Другие примеры включают

$ PERLDB_OPTS="NonStop LineInfo=listing frame=2" perl -d myprogram

который запускает скрипт в неинтерактивном режиме, выводя информацию о каждом входе в подпрограмму и каждой выполненной строке в файл с именем listing. (Если вы прерываете его, лучше сбросить LineInfo на что-то «интерактивное»!)

Другие примеры включают (используя стандартную синтаксическую конструкцию оболочки для отображения настроек переменных среды):

$ ( PERLDB_OPTS="NonStop frame=1 AutoTrace LineInfo=tperl.out"
    perl -d myprogram )

что может быть полезно для отладки программы, использующей Term::ReadLine . Не забудьте отсоединить оболочку от TTY в окне, соответствующем /dev/ttyXX, например, выполнив команду:

$ sleep 1000000

См. "Внутреннее устройство отладчика" в perldebguts для получения дополнительной информации.

Ввод/вывод отладчика

Командная строка

Командная строка отладчика выглядит примерно так

DB<8>

или даже

DB<<17>>

где это число — номер команды, которую можно использовать для доступа к встроенному механизму истории в стиле csh. Например, !17 повторит команду номер 17. Глубина угловых скобок указывает глубину вложенности отладчика. Вы можете получить более одного набора скобок, например, если вы уже находитесь на точке останова и затем выводите результат вызова функции, которая сама имеет точку останова, или переходите внутрь выражения с помощью команды s/n/t expression.

Многострочные команды

Если вы хотите ввести многострочную команду, например, определение подпрограммы с несколькими операторами или формат, экранируйте новую строку, которая обычно заканчивает команду отладчика, с помощью обратного слэша. Вот пример:

DB<1> for (1..4) {         \
cont:     print "ok\n";   \
cont: }
ok
ok
ok
ok

Обратите внимание, что этот способ экранирования новой строки специфичен для интерактивных команд, введённых в отладчик.

Обратная трассировка стека

Вот пример того, как может выглядеть обратная трассировка стека с помощью команды T.

$ = main::infested called from file 'Ambulation.pm' line 10
@ = Ambulation::legs(1, 2, 3, 4) called from file 'camel_flea'
                                                         line 7
$ = main::pests('bactrian', 4) called from file 'camel_flea'
                                                         line 4

Левый символ там указывает контекст, в котором была вызвана функция, где $ и @ означают скалярный или списочный контекст соответственно, а . означает пустой контекст (на самом деле это своего рода скалярный контекст). Выше отображается, что вы находились в функции main::infested при выполнении вывода трассировки стека, и что она была вызвана в скалярном контексте из строки 10 файла Ambulation.pm, но без каких-либо аргументов, что означает, что она была вызвана как &infested. Следующая запись стека показывает, что функция Ambulation::legs была вызвана в списочном контексте из файла camel_flea с четырьмя аргументами. Последняя запись стека показывает, что main::pests была вызвана в скалярном контексте также из camel_flea, но со строки 4.

Если вы выполните команду T из внутри активного use оператора, обратная трассировка стека будет содержать как require кадр, так и eval кадр.

Формат списка строк

Это показывает типы вывода, которые может генерировать команда l.

  DB<<13>> l
101:        @i{@i} = ();
102:b       @isa{@i,$pack} = ()
103             if(exists $i{$prevpack} || exists $isa{$pack});
104     }
105
106     next
107==>      if(exists $isa{$pack});
108
109:a   if ($extra-- > 0) {
110:        %isa = ($pack,1);

Разрываемые строки помечены :. Строки с точками останова помечены b, а строки с действиями — a. Строка, которая должна быть выполнена, отмечена ==>.

Пожалуйста, имейте в виду, что код в списках отладчика может не совпадать с исходным исходным кодом. Директивы строк и внешние фильтры источников могут изменять код до того, как Perl его увидит, перемещая код из его исходных положений или принимая совершенно другие формы.

Вывод фреймов

Если параметр frame установлен, отладчик будет выводить введенные (и необязательно вышедшие) подпрограммы в разных стилях. См. perldebguts для невероятно длинных примеров этих стилей.

Отладка операторов времени компиляции

Если у вас есть исполняемые операторы времени компиляции (например, код внутри блоков BEGIN, UNITCHECK и CHECK или use операторов), они не будут останавливаться отладчиком, хотя require и INIT блоки будут, и операторы времени компиляции можно отслеживать с параметром AutoTrace установленным в PERLDB_OPTS. Из вашего собственного кода Perl вы можете вернуть управление обратно в отладчик с помощью следующего оператора, который безопасен, если отладчик не запущен:

$DB::single = 1;

Если вы установите $DB::single в 2, это эквивалентно простому вводу команды n, а значение 1 означает команду s. Переменная $DB::trace должна быть установлена в 1, чтобы смоделировать ввод команды t.

Другой способ отладить код времени компиляции — запустить отладчик, установить точку останова при загрузке модуля:

  DB<7> b load f:/perllib/lib/Carp.pm
Will stop on load of 'f:/perllib/lib/Carp.pm'.

а затем перезапустить отладчик с помощью команды R (если это возможно). Можно использовать b compile subname для той же цели.

Настройка отладчика

В отладчике, вероятно, достаточно точек настройки, чтобы вам никогда не пришлось их изменять самостоятельно. Вы можете изменить поведение отладчика изнутри отладчика с помощью его команды o, из командной строки с помощью переменной среды PERLDB_OPTS, и из файлов настройки.

Вы можете выполнить настройку, создав файл .perldb, содержащий код инициализации. Например, вы могли бы создать псевдонимы, такие как эти (последний — тот, который люди ожидают увидеть):

$DB::alias{'len'}  = 's/^len(.*)/p length($1)/';
$DB::alias{'stop'} = 's/^stop (at|in)/b/';
$DB::alias{'ps'}   = 's/^ps\b/p scalar /';
$DB::alias{'quit'} = 's/^quit(\s*)/exit/';

Вы можете изменить параметры из .perldb, используя вызовы, подобные этому:

parse_options("NonStop=1 LineInfo=db.out AutoTrace=1 frame=2");

Код выполняется в пакете DB. Обратите внимание, что .perldb обрабатывается до обработки PERLDB_OPTS. Если .perldb определяет подпрограмму afterinit, эта функция вызывается после завершения инициализации отладчика. .perldb может находиться в текущем каталоге или в домашнем каталоге. Поскольку этот файл подключается Perl и может содержать произвольные команды, по соображениям безопасности он должен принадлежать суперпользователю или текущему пользователю и быть доступным для записи только владельцу.

Вы можете имитировать ввод TTY для отладчика, добавив произвольные команды в @DB::typeahead. Например, ваш файл .perldb может содержать:

sub afterinit { push @DB::typeahead, "b 4", "b 6"; }

Это попытается установить точки останова на строках 4 и 6 сразу после инициализации отладчика. Обратите внимание, что @DB::typeahead — это не поддерживаемый интерфейс и может быть изменён в будущих выпусках.

Если вы хотите изменить отладчик, скопируйте perl5db.pl из библиотеки Perl в другое имя и измените его по своему усмотрению. Затем вам нужно будет установить переменную среды PERL5DB со значением, подобным этому:

BEGIN { require "myperl5db.pl" }

В качестве последнего средства, вы также можете использовать PERL5DB для настройки отладчика путём прямого изменения внутренних переменных или вызова функций отладчика.

Обратите внимание, что любые переменные и функции, которые не задокументированы в данном документе (или в perldebguts), считаются предназначенными только для внутреннего использования и могут быть изменены без предварительного уведомления.

Поддержка Readline / История в отладчике

В стандартной поставке единственная история командной строки — это упрощенная, которая проверяет наличие ведущих восклицательных знаков. Однако, если вы установите модули Term::ReadKey и Term::ReadLine с CPAN (например, Term::ReadLine::Gnu, Term::ReadLine::Perl, ...), у вас появятся полные возможности редактирования, аналогичные тем, которые предоставляет GNU readline(3). Ищите их в каталоге modules/by-module/Term на CPAN. Однако эти модули не поддерживают обычное редактирование командной строки с помощью vi.

Также доступна элементарная автодополнение командной строки, включая лексические переменные в текущем объеме, если установлен модуль PadWalker.

Без поддержки Readline вы можете увидеть символы "^[[A", "^[[C", "^[[B", "^[[D"", "^H", ... при использовании клавиш со стрелками и/или клавиши Backspace.

Поддержка редакторов для отладки

Если у вас на системе установлена версия emacs от GNU, она может взаимодействовать с отладчиком Perl для предоставления интегрированной среды разработки, напоминающей её взаимодействие с отладчиками C.

Недавние версии Emacs поставляются с начальным файлом, который заставляет emacs работать как синтаксически направленный редактор, понимающий (некоторый) синтаксис Perl. См. perlfaq3.

Пользователи vi также должны ознакомиться с vim и gvim, версиями с поддержкой мыши и цветом, для выделения ключевых слов Perl.

Обратите внимание, что только perl может в полной мере анализировать Perl, поэтому все такие инструменты CASE в какой-то мере уступают по возможностям, особенно если вы не программируете Perl так, как это делает программист C.

Профилировщик Perl

Если вы хотите использовать альтернативный отладчик для Perl, вызовите скрипт со значением аргумента пакета, указанным после двоеточия и флага -d. Альтернативные отладчики Perl включают профилировщик Perl, Devel::NYTProf, который доступен отдельно как дистрибутив CPAN. Для профилирования программы Perl в файле mycode.pl просто введите:

$ perl -d:NYTProf mycode.pl

По завершении скрипта профилировщик создаст базу данных информации о профиле, которую вы можете преобразовать в отчеты с помощью инструментов профилировщика. Подробности см. в <perlperf>.

Отладка регулярных выражений

use re 'debug' позволяет увидеть подробности работы движка регулярных выражений Perl. Для понимания обычно объёмного вывода необходимо не только иметь представление о работе сопоставления регулярных выражений в общем, но и знать, как регулярные выражения Perl компилируются во внутренний автомат. Эти вопросы подробно рассматриваются в "Debugging Regular Expressions" в perldebguts.

Отладка использования памяти

Perl содержит внутреннюю поддержку отчётов об использовании памяти, но это довольно продвинутая концепция, требующая понимания работы распределения памяти. Подробности см. в "Debugging Perl Memory Usage" в perldebguts.

См. также

У вас use strict и use warnings включены, не так ли?

perldebtut, perldebguts, re, DB, Devel::NYTProf, Dumpvalue и perlrun.

При отладке скрипта, использующего #! и обычно находящегося в $PATH, опция -S заставляет perl искать его в $PATH, так что вам не нужно вводить путь или which $scriptname.

$ perl -Sd foo.pl

ОШИБКИ

Вы не можете получить информацию о стеке кадров или каким-либо образом отлаживать функции, которые не были скомпилированы Perl, такие как функции из расширений C или C++.

Если вы изменяете аргументы @_ в подпрограмме (например, с помощью shift или pop), трассировка стека не отобразит исходные значения.

Отладчик в настоящее время не работает совместно с флагом командной строки -W, поскольку сам он не свободен от предупреждений.

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

© 1993–2020 Larry Wall and others
Licensed under the GNU General Public License version 1 or later, or the Artistic License.
The Perl logo is a trademark of the Perl Foundation.
https://perldoc.perl.org/5.32.0/perldebug

Spec-Zone.ru

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