Анимация
JavaScript
|
Главная Библионтека любой строке программы, главное, чтобы в них находился корректный оператор Нельзя устанавливать точки останова на скобках (строка 30), знаках пунктуации (строка 29), пуст1х строках (строка 31) и комментариях, если они занимают всю строку. Для задания точек останова используется команда b анова. Вместо параметра следует указать номер строки или имя подпрограммы. Например, чтобы задать точку останова в строке 33, введите следующую команду: DB<4> b 33 DB<5> Еще одной полезной командой, которая может пригодиться при работе с точками останова, является команда с (continue, или продолжить). При получении этой команды отладчик возобновляет выполнение программы до достижения следующей точки останова или конца программы (в зависимости оттого, что нроизойдетраньше), например: DB<5> с main::(Employee:33): print emp($ ) ; DB<5> Как и следовало ожидать, в данном случае выполнение программы будет остановлено в строке 33 перед вызовом функции printemp. Для продолжения работы введите команду с. Поскольку точка останова остается все время активной, после выполнения функции printemp программа будет снова остановлена в строке 33. При этом на экран будут выведены как данные программы, так и сообщение отладчика: DB<2>c 198131 Тед ВоЙОХОВИЦ 6.50 39 253.51 main::{Employее:3 3): ргint emp(S ); Для получения списка точек останова следует воспользоваться командой как показано ниже на примере: Е2> L Employee: 33: print e($ ); break if (1) Из этого примера видно, что в отладчике б1ла установлена одна точка останова в строке 33 файла Employee. Для удаления точек останова используется команда d, синтаксис которой же, как и у команды b - оки или ограшш. Вот пример: DB<2> d 33 DB<3> Другие команды отладчика Предположим, мы хотим отладить функцию и заодно посмотреть, как она работает. Это можно сделать несколькими способами. Для начала давайте перезапустим программу с помощью команды R: DB<3> Н Warning: some settings an d-line options may be lost! Default die handler restored. Loading DB routines from perl5db.pl version 1.07 I5дtвr h oh li fcr help, erldebug- fcr ncre help. main::(Employee:6): Смит,Боб,123101,9.35,40, main:: (Employee: 7): Франклин,Алиса,132912,10.15,35, main::(Employee:8): Войоховиц,Тед,198131,6.SO,39, main::(Ешр1оуее:9): Her,Венди,141512,9.50,40, main::(Employee:10): Клиборн,Стен,131211,11.25,40, main::(Employee:11): ); DB<1> b 33 Команда R выполняет установку программы в исходное состояние и подготавливает ее к повторному запуску. При этом аннулируются все заданные ранее точки останова, а значения переменных очищаются. Поэтому в предыдущем примере мы восстановили точку останова в строке 33. Теперь запустим программу на выполнение с помощью команды с: DB<2> о main::(Employee:33): print emp($ ); DB<2> Перед вызовом функции t emp программа остановится. А теперь, чтобы выполнить следующий оператор в пошаговом режиме, воспользуемся командой п: DB<2>n 198131 Itefl Войоховиц 6.50 39 253.51 main::(Employee:32): foreach(gemployees) { EB<2>n main::(Employee:33): print aip($ ); E2> Что произошло? Почему мы не увидели, как выполняются в пошаговом режиме операторы внутри функции printemp? Дело в том, что команда п выполняет текущий оператор, не выполняя трассировку функции. Для того чтобы "зайти" внутрь функции, используйте команду s (step, или шаг вперед). Данная команда аналогична команде п, но, в отличие от нее, выполняет оператор вызова функции и останавливается на ее первом операторе, а не выполняет функцию до конца и останавливается на следующем операторе после вызова функции. Вот пример: main::(Employee:33): print еюр($ ); DB<2> s main;:print emp(Employee:14): my ($last,$first,$emp,$hourly,$time)= main::print emp(Employее:15); split(,,S [0]); DB<2> ~ Как видите, отладчик остановил программу перед выполнением первого оператора функции print emp. Заметьте, что того же эффекта можно было бы добиться, установив точку останова на функцию print emp с помошью команды b print emp. Для того чтобы продолжить выполнение операторов функции в пошаговом режиме, воспользуйтесь командой п, как показано ниже: DB<2> n main::print emp(Employee:16): my Sfullnane; DB<2> n main::print emp(Employee:17): 5fullname=sprintf ("ts *s-, $first, $last); IB<2>n main;:print emp(Employee:18): printf("»6d »-20s %6.2f 43d «7.2f\n", main::priat"emp{Employee:19): $atp, Sfullname, $tourly, $time, main::print emp(Employee:20): (Shourly * $time)+.005); r2> Во время выполнения программы в отладочном режиме можно на ходу изменять значения переменных. Например, чтобы временно увеличить сотруднику почасовую тарифную ставку на $2,5, используются следующие команды: print Shourly 11.25 DB<3> Shourly+=2.5 DB<4> print Shourly 13.75 DB<5> n 131211 Стен Квнборн 13.75 40 550.01 itBin::(Ehplqyee:32): f or each (g employees) { В этом примере сначала мы распечатали значение переменной (11.25), за- тем увеличили его на 2.5 и продолжили выполнение программы. Обратите внимание, что оператор printf распечатал уже новое значение переменной нец, чтобы завершить работу отладчика, введите команду q. Упражнение: поиск ошибки в этом упражнении мы рассмотрим методику поиска ошибок в программе с помощью отладчика. В программе, приведенной в листинге 12.1, есть ошибка (точнее, целых две). Предполагается, что программа должна выводить в цикле приведенные ниже сообщения: В ксрвене оствгоэсь 20 пач срcнeЕ В ксрзин осталоэсь 19 твчзк срcнeЕ В ксрои осталось 1 пвчжа корснен В ксрок! оста 0 твчек срс:нeЕ Но она почему-то отказывается это делать. Итак, ваша задача - набрать программу, текст которой приведен в листинге 12.1, и попытаться найти в ней ошибки. Обратите внимание, что ни одна из ошибок не относится к категории синтаксических, поскольку интерпретатор Perl не выводит никаких предупредительных сообщений (а ведь используется ключ и оператор use strict). В то же время с помощью отладчика поиск ошибок не составит особого труда. Итак, после набора текста программы запустите ее в отладочном режиме. Не забывайте время от времени распечатывать значения ключевых переменных и выражений, а также обходить трассировку вызовов функции message. 1 bin/perl -v 2: t Вэ1ХЙ1рхЕа1У1Уеас{[»Ф1гсиДБЕовнбки. Bsmrevsx 3: use cict; 5: siibiiesge { 12-й час. с ком )око№г1 193 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 [ 58 ] 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 |