Тема 3.4.2 Поиск ошибок с помощью отладчика.


Цель задания: Научиться отлаживать программы с помощью встроенного

отладчика.

Несмотря на то что Интегрированная Инструментальная Обо­лочка Турбо Паскаля включает в себя ряд средств, облетающих разработку программ, в них все равно могут содержаться ошибки, не позволяющие корректно работать с данными программами.

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

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

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

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

2. Ошибки, проявляющиеся на этапе выполнения — ошибки, возни­кающие в связи с нарушением семантических правил написания программ на языке программирования Турбо Паскаль 7.0 (ярким примером ошибки данного типа является ситуация, когда Ваша программа пытается выполнить деление на нуль). Если написанная Вами программа обнаруживает ошибку такого типа, то она завершает свое выполнение и выводит сообщение следующего вида:

Run-time error <nnn> at<xxxx:yyyy>

где

ллл —номер ошибки выполнения,

хххх.-уууу — адрес ошибки выполнения.

 

Если Вы выполняете программу из ИИО ТП, то она автоматически найдет вызвавший семантическую ошибку опера­тор (так же как и в случае синтаксических ошибок). Если же программа выполнялась вне ИИО и в ней появилась ошибка данного типа, то необходимо запустить ИИО ТП и найти вызвавший семантическую ошибку оператор, используя коман­дуSearch/Find Error (после того как Вы активизируете коман­дуSearch/Find Error, она запросит у Вас адрес сегмента и смещения (хххх:уууу) оператора, вызвавшего семантическую ошибку).

3. Логические ошибки — это ошибки, связанные с неправильным применением тех или иных алгоритмических конструкций. ИИО ТП 7.0 не позволяет автоматически обнаруживать ошибки данного типа. Она лишь обладает рядом средств отладки, которые могут значительно облегчить процесс поиска таких ошибок.

С точки зрения программиста одно из основных преимуществ отладки программ с помощью встроенного в ИИО ТП отладчика (Debugger) заключается в возможности осуществления контроля над ходом выполнения программы. Отследив таким образом выпол­нение каждой инструкции, Вы без особого труда сможете опреде­лить, в какой части программы находится ошибка.

Встроенный в ИИО ТП отладчик позволяет:

>• выполнять команды языка Паскаль построчно (пошагово);

>• трассировать команды языка Паскаль;

>• выполнять программу до некоторой определенной строки (до некоторой точки);

>• осуществлять перезапуск программы, не закончив ее выполнение.

Эти возможности позволяют контролировать ход выполнения программы.

Рассмотрим все эти управляющие средства по очереди.

Пошаговая отладка программы и трассировка.

 

КомандыStep Over и Trace Into менюRim позволяют осуществить построчную отладку программы. Активизация командыStep Overили нажатие функциональной клавиши [F8], так же как активиза­ция командыTrace Into или нажатие функциональной клавиши [F7], вызывает выполнение отладчиком всех операторов, располо­женных в строке, помеченной маркером (указателем строки выпол­нения). Единственное отличие между выполнением программы по шагам и ее трассировкой состоит в том, как реагирует отладчик на появление в тексте программы операторов вызова процедур или функций. При пошаговом выполнении программы вызов процедуры или функции интерпретируется как вызов простого оператора, т.е. Вы можете увидеть результаты работы процедуры, но не можете пошагово проследить, каким образом этот результат был получен, в то время как при трассировке программы такая возможность предоставляется.

Рассмотрим более подробно работу команд Step Over и Trace Into на следующем примере

PROGRAM Procedure_and_Function; {FUNKPROZ.PAS}

USESCrt;

VAR a, b, Sum_nuinbers: INTEGER;

PROCEDURE Summing-up (VAR Sum:INTEGER;a,b:INTEGER);

BEGIN

Sum:=a + b;

END;

FUNCTION Sum(a,b: INTEGER):INTEGERS;

BEGIN

Sum:=a + b;

END;

BEGIN

ClrScr;

a := 12; b := 15;

Suinming_up (Sum_number3, a, b);

WriteLn('Сумма равна: ',Sum_numbers);

Sum_number3:=Sum(a,b);

WriteLn('Сумма равна: ',Sum_numbers);

WriteLn('Сумма равна: ',Sum(a,b)) ;

END.

Примечание:

Прежде чем проводить пошаговую отладку программы или ее трассировку, необходимо убедиться, что опцияOptions/Debug­ger/Integrated активизирована.

Введите с клавиатуры и откомпилируйте текст данной програм­мы, после чего нажмите клавишу [F8] (пошаговая отладка). Обра­тите внимание на тот факт, что маркер сразу перемещается на оператор BEGIN, расположенный в основном блоке программы. Это происходит потому, что оператор BEGIN является первым оператором, который выполняется в теле программы. Нажимая клавишу [F8], выполните эту программу до конца. Теперь вы можете попытаться оттрассировать эту же программу, нажимая клавишу [F7]. Обратите внимание на то, что трассировка програм­мы во многом аналогична ее выполнению по шагам. Единственное отличие, как мы уже говорили, состоит в том, что когда встречается оператор вызова процедуры или функции, то при трассировке эти процедуры и функции также выполняются по шагам, а при простом выполнении по шагам управление возвращается к Вам только после завершения выполнения подпрограммы.