Spec-Zone.ru › Perl 5.34

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

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

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

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

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

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

! pattern

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

!! cmd

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

source file

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

H -number

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

q или ^D

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

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

R

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

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

|dbcmd

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

||dbcmd

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

= [alias value]

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

= quit q

или вывести список текущих alias.

command

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

m expr

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

M

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

man [manpage]

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

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

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

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

В отладчике есть множество опций, настраиваемых с помощью команды o, как интерактивно, так и из среды или файла rc. Файл называется ./.perldb или ~/.perldb под Unix с /dev/tty, perldb.ini в противном случае.

recallCommand, ShellBang

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

pager

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

tkRunning

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

signalLevel, warnLevel, dieLevel

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

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

AutoTrace

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

LineInfo

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

inhibit_exit

Если 0, позволяет выйти за пределы скрипта.

PrintRet

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

ornaments

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

frame

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

Если frame & 4, аргументы функций выводятся, плюс информация о контексте и вызывающей функции. Если frame & 8, перегруженные stringify и tie аргументы FETCH включены в вывод. Если frame & 16, выводится возвращаемое значение из подпрограммы.

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

maxTraceLen

Длина обрезки списка аргументов, когда бит 4 опции frame установлен.

windowSize

Изменение размера окна списка кода (по умолчанию 10 строк).

Следующие параметры влияют на то, что происходит с командами V, X, и x:

arrayDepth, hashDepth

Выводить только первые N элементов ('' — все).

dumpDepth

Ограничить глубину рекурсии при выводе структур до N уровней. Отрицательные значения интерпретируются как бесконечность. По умолчанию: бесконечность.

compactDump, veryCompact

Изменить стиль вывода массивов и хешей. Если compactDump, короткие массивы могут быть выведены в одной строке.

globPrint

Выводить содержимое глобов.

DumpDBFiles

Выводить массивы, содержащие отлаживаемые файлы.

DumpPackages

Выводить таблицы символов пакетов.

DumpReused

Выводить содержимое "переиспользованных" адресов.

quote, HighBit, undefPrint

Изменить стиль вывода строк. Значение по умолчанию для quote — auto; можно включить формат с двойными кавычками или одинарными кавычками, установив его соответственно на " или '. По умолчанию символы с установленным старшим битом выводятся дословно.

UsageOnly

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

HistFile

Путь к файлу, из которого будет считываться история (при использовании совместимого с Term::ReadLine бэкенда) при запуске отладчика и в который она будет сохраняться при завершении (для сохранения между сессиями). Аналогично файлу истории Bash'a .bash_history.

HistSize

Количество сохраненных строк в истории (при использовании HistFile выше).

После чтения файла rc отладчик считывает переменную окружения $ENV{PERLDB_OPTS} и обрабатывает ее как остаток строки "O ..." так, как это можно ввести в приглашении отладчика. Вы можете поместить опции инициализации TTY, noTTY, ReadLine, и NonStop туда.

Если ваш файл rc содержит:

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

то ваш скрипт запустится без вмешательства пользователя, записывая отладочную информацию в файл db.out. (Если вы прервете его, вам лучше сбросить LineInfo на /dev/tty, если вы ожидаете увидеть что-либо.)

TTY

TTY для использования при отладке I/O.

noTTY

Если установлено, отладчик переходит в режим NonStop и не подключится к TTY. Если прерван (или если управление переходит к отладчику через явное задание $DB::signal или $DB::single из скрипта Perl), он подключается к TTY, указанному в опции TTY при запуске или к TTY, найденному во время выполнения с помощью модуля Term::Rendezvous по вашему выбору.

Этот модуль должен реализовывать метод с именем new, который возвращает объект с двумя методами: IN и OUT. Они должны возвращать дескрипторы файлов для использования для ввода и вывода отладки соответственно. Метод new должен проверить аргумент, содержащий значение $ENV{PERLDB_NOTTY} при запуске или "$ENV{HOME}/.perldbtty$$" в противном случае. Этот файл не проверяется на правильное владение, поэтому теоретически возможны угрозы безопасности.

ReadLine

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

NonStop

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

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

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

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

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

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

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

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

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

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

$ sleep 1000000

Подробности см. в разделе "Debugger Internals" в perldebguts.

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

Приглашение

Приглашение отладчика примерно такое

DB<8>

или даже

DB<<17>>

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

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

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

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

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

Стек трассировки

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

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

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

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

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

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

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

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

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

Список кадров

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

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

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

$DB::single = 1;

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

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

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

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

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

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

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

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

Вы можете изменить опции из .perldb, используя такие вызовы:

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

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

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

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

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

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

BEGIN { require "myperl5db.pl" }

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

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

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

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

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

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

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

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

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

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

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

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

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

$ perl -d:NYTProf mycode.pl

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

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

use re 'debug' позволяет вам увидеть подробности работы движка регулярных выражений Perl. Чтобы понять этот, обычно обширный вывод, необходимо не только иметь общее представление о работе сопоставления регулярных выражений, но также знать, как регулярные выражения Perl компилируются во внутренний автомат. Эти вопросы подробно изучаются в "Отладка регулярных выражений" в perldebguts.

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

Perl содержит встроенную поддержку для отчета об использовании памяти, но это довольно сложная концепция, которая требует понимания принципов работы выделения памяти. См. "Отладка использования памяти Perl" в perldebguts для подробностей.

См. также

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

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

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

$ perl -Sd foo.pl

Ошибки

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

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

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

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

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

Spec-Zone.ru

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