Spec-Zone.ru › Perl 5.28

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 в текущем пакете. В частности, поскольку это просто собственная функция Perl's 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

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

! 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 на вашей системе. Это можно установить в файле конфигурации или непосредственно присвоив значение. Мы все еще ждем рабочего примера чего-то вроде:

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

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

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

recallCommand, ShellBang

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

pager

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

tkRunning

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

signalLevel, warnLevel, dieLevel

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

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

AutoTrace

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

LineInfo

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

inhibit_exit

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

PrintRet

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

ornaments

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

frame

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

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

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

maxTraceLen

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

windowSize

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

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

arrayDepth, hashDepth

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

dumpDepth

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

compactDump, veryCompact

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

globPrint

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

DumpDBFiles

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

DumpPackages

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

DumpReused

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

quote, HighBit, undefPrint

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

UsageOnly

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

HistFile

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

HistSize

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

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

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

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

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

TTY

TTY для использования при отладке ввода-вывода.

noTTY

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

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

ReadLine

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

NonStop

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

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

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

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

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

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

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

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

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

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

$ sleep 1000000

См. "Debugger Internals" в perldebguts для получения подробностей.

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

Приглашение

Приглашение отладчика - что-то вроде

DB<8>

или даже

DB<<17>>

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

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

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

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

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

Стек отслеживания

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

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

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

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

Формат вывода строк

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

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

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

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

Вывод кадра

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

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

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

$DB::single = 1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

BEGIN { require "myperl5db.pl" }

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

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

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

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

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

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

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

Если у вас установлена GNU-версия emacs, она может взаимодействовать с 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, re, DB, Devel::NYTProf, Dumpvalue и perlrun.

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

$ perl -Sd foo.pl

Ошибки

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

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

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

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

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

Spec-Zone.ru

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