Анимация
JavaScript


Главная  Библионтека 

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

любой строке программы, главное, чтобы в них находился корректный оператор Нельзя устанавливать точки останова на скобках (строка 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