Первый сайт на Perl

         

Отладчик Perl

Написав программу и устранив ошибки компиляции, любой программист втайне надеется, что она будет работать именно так, как он и задумывал. Практика, однако, в большинстве случаев совершенно иная: при первом запуске программа работает, но выполняет не совсем, а иногда и совсем не то, что надо; при одних исходных данных она работает идеально, а при других "зависает". И это случается не только с начинающим, но и с опытным программистом. В таких случаях на помощь приходит отладчик — специальная программа, которая позволяет программисту, обычно в интерактивном режиме, предпринять определенные действия в случае возникновения необычного поведения программы.

Для вызова встроенного отладчика интерпретатора peri его необходимо запустить с опцией -d (задав ее либо в командной строке, либо в строке специального комментария I! самой программы). Отладчик инициируется, когда начинает выполняться сценарий Perl. При этом отображается




версия отладчика, первая выполняемая строка кода программы и его приглашение DB<I> на ввод команд пользователя:

Loading DB routines from perl5db.pl version 1.0402 Emacs support available.

Enter h or *h h' for help.

main::(examplel.pl:3): print "\000\001\002\003\004\005\006\007\n"; DB<1>

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

Замечание

Все, что здесь говорится о встроенном отладчике, относится к пользователям системы UNIX. Тот, кто работает в системах семейства Windows и пользуется интерпретатором peri фирмы ActiveState, может совсем не читать этот раздел, так как интерпретатор этой фирмы снабжен отладчиком, работа с которым осуществляется через графический интерфейс пользователя, а не с помощью командной строки. Хоти ничто не мешает таким пользователям воспользоваться встроенным отладчиком, аналогичным отладчику интерпретатора peri для UNIX, и работать с ним из командной строки. Для этого следует воспользоваться командным файлом cmddb.bat, расположенным в каталоге \perl520\debugger.

Просмотр текста программы

При загрузке отладчика отображается первая строка кода программы Perl. Но для выполнения определенных действий (установки точки останова, задания определенных действий при выполнении конкретного оператора Perl и т. д.) нам необходимо видеть текст программы. Как это осуществить? В отладчике для подобных действий предусмотрен ряд команд.

Команда i отображает на экране монитора 10 строк текста программы, расположенных непосредственно за последней отображенной строкой. Последовательное выполнение этой команды позволяет быстро пролистать текст программы. Вызов команды i с указанием номера строки отобразит ее содержимое. Несколько последовательных строк программы можно увидеть, задав в команде i через дефис номер начальной и конечной строки. Например, команда 1 1-5 отобразит пять строк программы:

DB<5> 1 1-5 1 #! peri -w

2==> open FILE, "books" or die $!; 3: open REPORT, ">report"; 4 5: select REPORT;

Обратите внимание, что отладчик отображает не только содержимое строк, но и их номера, причем после номера строки с первым выполняемым оператором следует стрелка, а номер каждой последующей выполняемой строки завершается символом двоеточие ":". В угловых скобках приглашения отладчиков <5> отображается порядковый номер выполненной команды от начала сеанса отладки.

Команда w отобразит блок, или окно строк — три строки до текущей, текущая строка и шесть после текущей. Текущей в отладчике считается строка программы после последней отображенной. Если команде w передать номер строки, то отобразится окно строк относительно заданной строки текста — три строки до заданной, сама заданная строка и шесть после нее.

Последняя команда отображения текста программы — команда - (дефис), которая отображает 10 строк текста, предшествующих текущей строке.  

Выполнение кода

Команда s предназначена для последовательного пошагового выполнения программы: каждый ее вызов выполняет следующую строку кода. Эта строка должна выполняться в программе без изменения потока выполнения операторов. После выполнения очередной строки кода отображается строка, которая должна быть выполнена следующей:

DB<1> s main: : (exaitple2.pl:3) : @s = split;

При следующем выполнении команды s будет выполнена отображенная строка программы: @s = split;.

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

Команда п работает аналогично команде s, последовательно выполняя строки кода программы, за одним исключением — она выполняет код подпрограммы без захода в него, т. е. код подпрограммы выполняется полностью, и при следующем вызове команды п выполняется оператор строки кода, непосредственно следующей за строкой с вызовом подпрограммы. Таким образом, команда п позволяет "обойти" пошаговое выполнение операторов подпрограммы.

Совет
Если мы осуществляем пошаговое выполнение программы (командами s или n), то нажатие клавиши <Enter> эквивалентно вызову последней команды s или n.

Если мы в процессе отладки попали в тело подпрограммы (после, например, выполнения очередной команды s), то командой г можно немедленно завершить ее выполнение. Выполнение программы приостанавливается на первом после вызова подпрограммы операторе в ожидании очередной команды пользователя.

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

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

Просмотр значений переменных

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

V [пакет [переменная]]

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

При работе с этой командой следует иметь в виду, что при задании переменной, значение которой необходимо посмотреть, не надо задавать никакого префикса, а только идентификатор переменной. Отладчик отобразит значения всех переменных указанного пакета с заданным идентификатором. Например, если в программе определена скалярная переменная $ref, маесив скаляров @ref и хеш-массив %ref, то выполнение команды v main ref приведет к следующему результату:

DB<1> V main ref $ref = 24 @ref = ( 1

01

1 2 | ) %ref = (

'One' => 1

'Two' => 2 )

Команда х аналогична команде v, но она отображает значения переменных текущего пакета. Ее параметром является идентификатор переменной, имя пакета указывать не надо. Вызванная без параметров, она отображает значения всех переменных текущего пакета. Например, команда х ref отобразит значения переменной $ref, массива @ref и хеш-массива %ref текущего пакета, внутри которого приостановлено выполнение программы. По умолчанию программа выполняется в пакете main.

Команда t работает как переключатель, включая режим отображения строк выполняемого кода (режим трассировки) или выключая его:

DB<11> t Trace = on

DB<11> с 5

main::(example2.pl:3): @ref = (1,2,3,4); main::(example2.pl:4): %ref = ("One",l, "Two",2); main::(example2.pl:5): $_ = " qwerty \t\tqwerty";

DB<12> t Trace = off

DB<12> с 7 main::(example2.pi:7): mySub();

DB<13>

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

Точки останова и действия

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

переменных и предпринять дальнейшие действия по отладке кода. Нам уже известна команда с отладчика, которая непрерывно выполняет код программы до первой встретившейся точки останова, но как задать ее?

Для этих целей служит команда ь (сокращение от английского глагола break — прервать) отладчика. Ее параметром является номер строки кода, в которой устанавливается точка останова: отладчик приостановит выполнение программы Perl перед заданной строкой. Если команда ь вызывается без параметра, то точка останова определяется в текущей строке.

Можно определить точку останова в первой строке кода подпрограммы. Для этого команде b необходимо передать в качестве параметра имя подпрограммы. Например, следующая команда

DB<11> b mySub

I устанавливает точку останова в первой строке кода подпрограммы mySub.

Иногда необходимо, чтобы выполнение программы приостанавливалось в некоторой точке программы только при выполнении каких-либо условий (например, равенства заданному числу значения какой-нибудь переменной, или совпадения значений двух других переменных и т. п.). Команда ь позволяет задавать подобные условные точки останова. Для этого ей можно передать в качестве второго параметра условие, при истинности которого точка останова будет восприниматься отладчиком как действительная точка останова. Если условие перед выполнением строки кода не будет истинно, то останова программы в этой точке не произойдет. Например, следующая команда

DB<1> b 4 $r==l I

определяет условную точку останова в строке 4. Отладчик приостановит выполнение программы перед этой строкой по команде с только, если значение переменной $г будет равно 1.

Команда L отображает список всех установленных точек останова, как безусловных, так и условных:

DB<1> b 4 $г==1 DB<2> b 6 DB<3> L

Iexample2.pl: . •:.,-. , 4: %ref = ("One",!, "Two",2);

break if ($r==l) 6: @s = split;

break if (1) •/;•;'• : • -

Отображаемая информация о точке останова представляет номер строки и код Perl, а также условие, при котором действует точка останова (break if (УСЛОВИЕ)). Для безусловной точки останова условие всегда истинно и равно 1.

Для удаления точки останова достаточно выполнить команду d с параметром, равным номеру строки, в которой определена точка останова. Команда о удаляет все точки останова, определенные в сеансе работы с отладчиком.

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

а 75 print "*** $ref\n";

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

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

Мы познакомили читателя лишь с основными командами отладчика, наиболее важными и полезными, с нашей точки зрения, для процесса поиска ошибок. Их полный набор с краткими описаниями представлен в табл. 14.2. Более подробную информацию можно всегда найти в документации, с которой распространяется Perl, или из различных ресурсов Internet.

Таблица 14.2. Основные команды отладчика

Команда

Описание

m

Отображается содержимое стека вызванных подпрограмм

s

Пошаговое выполнение программы (с заходом в подпрограммы)

n

Пошаговое выполнение программы (без захода в подпрограммы)

<Enter>

Повтор последней команды s или п

r

Завершение текущей подпрограммы и возврат из нее

с [строка] с [подпрогр]

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

1 строка+число

Отображает число плюс одну строку кода, начиная с заданной строки —

1 строка!-строка2

Отображает диапазон строк: от строки с номером строка! до строки с номером строка2

1 строка

Отображает заданную строку

1 подпрогр

Отображает первый блок строк кода подпрограммы

1

Отображает следующий блок из 10 строк

-

Отображает предыдущий блок из 10 строк

w [строка]

Отображает блок строк вокруг заданной строки

Возврат к выполненной строке

f файл

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

/образец/

/ Поиск строки по образцу; направление вперед от текущей строки. Завершающая косая черта не обязательна

?образец?

Поиск строки по образцу; направление назад от текущей строки. Завершающий символ "?" не обязателен

L

Отображение всех установленных точек останова

S [ [ ! ] образец]

Отображение имен подпрограмм, [не] соответствующих образцу

t

Включение/выключение режима трассировки

b [строка] [условие]

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

b подпрогр [условие]

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

b load файл

Установка точки останова на операторе require файл

b postpone подпрогр [условие]

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

b compile подпрогр

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

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

Для удобства и ускорения отладки больших программ в интерпретаторе per! предусмотрен встроенный отладчик. Его команды позволяют приостанавливать выполнение сценария Perl в подозрительных точках, задавать определенные действия при выполнении кода программы, просматривать стек вызова подпрограмм, менять в цикле значения переменных программы и многие другие полезные при поиске ошибок действия. Использование отладчика ускоряет процесс разработки программ Perl.

Содержание раздела