Поиск

Отладчик Perl

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

Запуск отладчика

Отладчик Perl запускается из командной строки операционной системы. В системах DOS и Windows в качестве приглашения на ввод команды обычно используется С:\>. В UNIX приглашение командной оболочки появляется после регистрации пользователя в системе и обычно имеет вид % или $. На компьютерах Macintosh для запуска отладчика выберите команду Debugger из меню Script. В результате на экране появится диалоговое окно отладчика.

Во всех примерах данного занятия используется программа Employee (см. листинг 9.1), о которой шла речь на 9-м занятии, "Дополнительные функции и операторы". Поэтому имеет смысл сделать закладку на странице 97, чтобы при необходимости быстро найти текст программы. Для отладки программы Employee после приглашения операционной системы введите приведенную ниже команду (для примера мы использовали систему DOS):

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

Кроме номера версии (в нашем случае 1.07) отображается строка с подсказкой о том, как можно вызвать справочную систему. Далее отладчик отображает первый оператор программы, который состоит из семи строк и начинается с фразы my @employees=(, а заканчивается закрывающейся круглой скобкой и точкой с запятой. Кроме содержимого оператора отладчик выводит дополнительную информацию (название процедуры, имя файла и номер строки в файле), помогающую идентифицировать отлаживаемый оператор.

В последней строке отладчик помещает приглашение DB<1> и устанавливает после него курсор. Цифра 1 означает, что отладчик ожидает ввода первой команды. В описанном нами состоянии программа на Perl не запущена и находится в состоянии ожидания. При этом на экране отображается оператор, который должен быть выполнен следующим (в нашем случае my @employees=(), а не ТОТ, который был выполнен раньше. Команды отладчика вводятся после приглашения.

Основные команды отладчика

Одной из самых важных команд, которую вы наверняка будете часто использовать, является команда help, предназначенная для вызова справочной системы отладчика. Введите символ h, в результате на экране появится список всех команд отладчика и их краткое описание. Если после команды h указать имя требуемой команды, то отладчик выведет описание только этой команды.

Часто бывает, что описание какой-то команды не помешается на экране. При этом первые несколько строк просто "уедут" с экрана. Чтобы вывести справочную информацию постранично, поместите перед командой символ вертикальной черты |. Например, чтобы вывести справку по всем командам отладчика в постраничном режиме, введите команду |h.

Самой ценной возможностью отладчика Perl является его способность запускать программы в пошаговом режиме. Пользуясь этим, давайте продолжим выполнение упражнения, которое мы начали в предыдущем разделе, и перейдем к следующему оператору программы Employee. Итак, после приглашения отладчика введите команду n (next, или следующий):

В результате интерпретатор Perl выполнит первый оператор программы Employee (строки с 5 по 11). После этого отладчик распечатает следующий оператор, который должен быть выполнен, — my ($L1, $Fl) = split(',', $а); — и выведет приглашение. В результате выполнения первого оператора программы был проинициализирован массив @employees. В нем будет содержаться информация по пяти сотрудникам. Чтобы распечатать значение элементов массива, воспользуйтесь оператором print, как показано ниже:

После приглашения отладчика можно вводить не только его команды, но и любой оператор Perl. Обратите внимание, что в приведенном выше примере элементы массива @employees никак не разделяются и смешаны в кучу. Чтобы распечатать каждое значение в отдельной строке, введите после приглашения такой оператор:

Чтобы продолжить выполнение программы в пошаговом режиме, вводите каждый раз команду п, как показано ниже:

Нетрудно заметить, что отладчик, пройдя несколько операторов, снова вернулся к строке 23 так, как будто в программе организован цикл. Все дело в том, что в операторе sort задан блок сортировки, который выполняется в пошаговом режиме для каждого элемента массива @employees. Поэтому при каждом вводе команды п отладчик будет выполнять цикл до тех пор, пока не будет отсортирован массив @employees (а это произойдет довольно быстро).

Чтобы повторить предыдущую команду, можно просто нажать клавишу <Enter> в строке приглашения.
Точки останова

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

Перед тем как задать точки останова, нужно определить номера соответствующих операторов программы. Для этого используется команда 1. С ее помощью можно вывести на терминал 10 следующих строк программы. Повторный ввод команды 1 выводит 10 следующих операторов программы и т.д. Чтобы распечатать листинг программы начиная с определенной строки, введите команду 1 строки, где вместо параметра строки укажите номер строки. В операторе 1 можно также указать диапазон строк, например 1 3-10.

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

В данном примере подходящим местом для установки точки останова будет строка 33. Дело в том, что она находится сразу после оператора sort и в ней расположен первый оператор блока основного цикла программы. Точки останова можно задать в любой строке программы, главное, чтобы в них находился корректный оператор Perl. Нельзя устанавливать точки останова на скобках (строка 30), знаках пунктуации (строка 29), пустых строках (строка 31) и комментариях, если они занимают всю строку. Для задания точек останова используется команда b точка останова. Вместо параметра точка_останова следует указать номер строки или имя подпрограммы. Например, чтобы задать точку останова в строке 33, введите следующую команду:

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

Как и следовало ожидать, в данном случае выполнение программы будет остановлено в строке 33 перед вызовом функции print_emp. Для продолжения работы введите команду с. Поскольку точка останова остается все время активной, после выполнения функции print_emp программа будет снова остановлена в строке 33. При этом на экран будут выведены как данные программы, так и сообщение отладчика: ..

Для получения списка точек останова следует воспользоваться командой L, как показано ниже на примере:

Из этого примера видно, что в отладчике была установлена одна точка останова в строке 33 файла Employee.

Для удаления точек останова используется команда d, синтаксис которой такой же, как и у команды b — d строки или d имя_продпрограммы. Вот пример:

Другие команды отладчика

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

Команда R выполняет установку программы в исходное состояние и подготавливает ее к повторному запуску. При этом аннулируются все заданные ранее точки останова, а значения переменных очищаются. Поэтому в предыдущем примере мы восстановили точку останова в строке 33. Теперь запустим программу на выполнение с помощью команды с:

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

Что произошло? Почему мы не увидели, как выполняются в пошаговом режиме операторы внутри функции print_emp? Дело в том, что команда п выполняет текущий оператор, не выполняя трассировку функции. Для того чтобы "зайти" внутрь функции, используйте команду s (step, или шаг вперед). Данная команда аналогична команде п, но, в отличие от нее, выполняет оператор вызова функции и останавливается на ее первом операторе, а не выполняет функцию до конца и останавливается на следующем операторе после вызова функции. Вот пример:

Как видите, отладчик остановил программу перед выполнением первого оператора функции print _erap. Заметьте, что того же эффекта можно было бы добиться, установив точку останова на функцию print_emp с помошью команды b print_emp. Для того чтобы продолжить выполнение операторов функции в пошаговом режиме, воспользуйтесь командой n, как показано ниже:

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

В этом примере сначала мы распечатали значение переменной $hourly (11.25), затем увеличили его на 2.5 и продолжили выполнение программы. Обратите внимание, что оператор printf распечатал уже новое значение переменной $hourly.

И, наконец, чтобы завершить работу отладчика, введите команду q.