Налагодження програм користувача в Tubro Pascal

[ виправити ] текст може містити помилки, будь ласка перевіряйте перш ніж використовувати.

скачати

Думаю, ви не раз стикалися з тим, що програма відмовлялася працювати так, як треба. Часто ці помилки призводять до того, що рішення задачі заходило в глухий кут. Тут і приходять на допомогу великі кошти налагодження програм Turbo Pascal. Зазвичай ці кошти використовуються рідко, а дарма. Вміла налагодження програми дозволяє уникнути багатьох підводних каменів і створювати ідеальні програми.

Введення.

Turbo Pascal пропонує сверхусовершенствованную середу, з автоматичним управлінням проектом, модульною організацією програм, високою швидкістю компіляції, з легко використовуваними оверлеями. Але навіть використовуючи всі ці надані кошти, програми користувача можуть містити помилки, які призводять до неправильної роботи програми.

На допомогу користувачу Turbo Pascal надає засоби, необхідні для налагодження його програми, що сприяють усуненню всіх помилок в програмі, її ретельному тестуванню та виконання. Turbo Pascal дозволяє легко визначати місце розташування помилок під час компіляції і під час виконання програми, а також дозволяє включати або вимикати автоматичний контроль помилок під час виконання програми.

Особливо важливо те, що Turbo Pascal має потужний і гнучкий відладчик вихідного рівня, який дозволяє користувачеві виконувати програму порядково, переглядати вираження і модифікувати змінні в міру необхідності. Відладчик вбудований в інтегроване середовище розробки (IDE) Turbo Pascal; користувач може редагувати, компілювати і налагоджувати програму навіть не виходячи з Turbo Pascal. Для великих або складних програм, які вимагають використання всього діапазону засобів налагодження від машинного мови до обчислення виразів Паскаля, Turbo Pascal повністю підтримує автономний відладчик фірми Borland, Turbo Debugger.

Типи помилок.

Існує три основних типи програмних помилок: помилки часу компіляції, помилки часу виконання та логічні помилки.

Помилки компіляції.

Помилки компіляції або синтаксичні помилки зустрічаються, коли забувають оголосити змінну, передають помилкове кількість параметрів процедури, при призначенні дійсного значення цілочисельний змінної. Це означає, що записуються оператори, які не узгоджуються з правилами Паскаля.

Turbo Pascal не закінчить процес компіляції програми користувача (генерацію машинного коду), поки всі синтаксичні помилки не будуть видалені. Якщо Turbo Pascal виявить синтаксичну помилку під час компіляції програми, він зупиняє компіляцію, входить у вихідний текст, вказує місце розташування помилки позиціонуванням курсору і виводить повідомлення про помилку в вікно Edit. Як тільки користувач виправить помилку, він зможе почати процес компіляції знову.

Якщо використовується версія командного рядка (TPC.EXE), Turbo Pascal буде виводити помилковий оператор, номер рядка та повідомлення про помилку. Потім користувач може увійти в будь-який він використовує редактор, знайти задану рядок, виправити помилку і перекомпілювати програму. Для додаткової інформації про повідомлення про помилки див. Додаток А в Посібнику програміста.

Помилки часу виконання.

Інший тип помилок - помилки часу виконання програми або семантичні помилки. Вони зустрічаються, коли користувач компілює синтаксично коректну програму, яка намагається зробити що-небудь заборонене під час її виконання, наприклад, відкриває неіснуючий файл для введення або виробляє ділення на 0. У цьому випадку Turbo Pascal виводить на екран таке повідомлення про помилку: Runtime error # # at seg: ofs (Помилка виконання # в сегменті: зсув) і зупиняє виконання програми користувача.

При використанні інтегрованого середовища Turbo Pascal визначає місце розташування помилки виконання автоматично, здійснюючи перехід у вікно редагування для відповідного вихідний файл.

Якщо користувач виконує програму в середовищі MS-DOS, він буде повертатися в MS-DOS. Користувач може завантажити модуль TURBO.EXE і використовувати опції Search / Find error для локалізації позиції помилки у вихідній програмі (переконайтеся, що опція Destination встановлена ​​в Disk). Для виявлення помилки користувач може також використовувати і опцію / F для компілятора командного рядка (TPC.EXE).

(Більш повне пояснення опцій командного рядка TPC.EXE наведено в розділі 9 "Компілятор командного рядка".)

Логічні помилки.

Програма користувача може містити й логічні помилки. Це означає, що програма робить те, що їй вказали замість того, що хотілося б. Може бути відсутніми ініціалізація змінної; можуть виявитися помилковими обчислення; малюнки, зображені на екрані, виглядають неправильно; програма може просто працювати не так, як було задумано. Такі помилки перебувають з великими труднощами, і інтегрований відладчик допоможе вам у цьому випадку найкращим чином.

Інтегрований відладчик Turbo Pascal.

Деякі помилки часу виконання (логічні помилки) непомітні і важкі для простежування. Інші помилки можуть ховатися за невловимим взаємодією розділів великої програми. У цих випадках необхідно інтерактивне виконання програми, під час якого здійснюється спостереження за значеннями певних змінних або виразів. Вам хотілося б, щоб Ваша програма зупинялася при досягненні певного місця так, щоб переглянути, як вона пропрацювала цей шматок. Вам хотілося б зупинитися і змінити значення деяких змінних під час виконання програми, змінити певний режим або простежити за реакцією програми. І вам хотілося б зробити це в режимі, коли можливо швидке редагування, перекомп і повторне виконання програми.

Інтегрований відладчик Turbo Pascal має всі описані вище можливості і навіть більше того. Він представляє собою вбудовану частина інтегрованої удосконаленої середовища Turbo Pascal (IDE): для використання пропонуються дві основні функції меню (Run, Debug), а також деякі клавіші для команд отладчика. Для додаткової інформації про IDE гарячих клавішах див. розділ 7 "Довідник з IDE" або довідкову інформацію про Turbo Pascal.

Що може робити відладчик.

Інтегрований відладчик працює дуже просто. Йому не потрібні спеціальні інструкції у Вашому коді, він не збільшує розмір Вашого. EXE файла і не вимагає перекомпіляції для створення окремого. EXE файлу після закінчення налагодження.

Якщо Ваша програма розділена на ряд модулів, вихідний код кожного з них автоматично завантажується в редактор при трасування.

Якщо Ви використовуєте оверлеї, відладчик автоматично обробляє їх усередині IDE, яка виконує перемикання між компілятором, редактором і відладчиком.

Огляд можливостей отладчика:

Трасування. F7

Run / Trace Into Ви можете виконати один рядок вашої програми, потім перерватися і подивитися на результати. При виклику процедури або функції усередині вашої програми, Ви можете задати режим виконання виклику як одного кроку або режим трасування цієї процедури або функції рядок за рядком.

Ви можете так само трасувати висновок Вашої програми рядок за рядком. Ви можете також встановити, щоб екран перемикався за потребою або використовувати два монітори. Ви можете також встановити екран виведення в окремому вікні.

Перехід на курсор. F4

Run / Go to Сursor Ви можете пересунути курсор на певний рядок у Вашій програмі, а потім вказати відладчику виконати програму до досягнення цього рядка. Це дозволяє обходити цикли або інші виснажливі ділянки програми, це також дозволяє перебиратися в те місце програми, звідки Ви хочете почати налагодження.

Переривання.

За допомогою команди Debug / Breakpoints Ви можете помітити рядки у Вашій програмі як точки переривання. Коли в процесі виконання Вашої програми досягається точка переривання, виконання програми припиняється і відображається вихідний текст і курсор зупиняється на рядку з точкою переривання. Потім Ви можете перевірити значення змінних, почати трасування або виконати програму до іншої точки переривання. Ви можете підключити умова до точки переривання. Ви можете також перерватися в будь-якій точці Вашої програми, натиснувши клавішу Ctrl-Break. Відбудеться зупинка на наступному рядку вихідної програми, як якщо б у цьому рядку була встановлена ​​точка переривання.

Спостереження.

Debug / Watches Користувач має можливість задавати для перегляду у вікні Watch деякі об'єкти (змінні, структури даних, вирази). Популярні дані змінюються, відображаючи поточні зміни в програмі при покроковому виконанні.

Обчислення / модифікація Ctrl-F4.

Debug / Evaluate / Modify Користувач може викликати вікно Evaluate, що перевірити значення змінних, структуру даних і вирази в інтерактивному режимі. Використовуючи вікно Evaluate, Ви можете змінити значення будь-якої змінної, включаючи рядки, покажчики, елементи масиву і поля записів. Це забезпечує простий механізм для перевірки, як Ваш код реагує на певну установку значень або умов.

Пошук.

Користувач може швидко знаходити оголошення процедур або функцій, навіть якщо програма розбита на кілька модулів (Search / Find Рrocedure). Під час трасування Ви можете швидко повернутися назад з викликів процедур або функцій та перевірити параметри кожного виклику (Window / Call Stack).

Підготовка до використання отладчика.

До початку налагодження Ви повинні розуміти, що основним елементом виконання в відладчик є рядок, а не оператор. Більш точно найменшим елементом виконання є рядок. Якщо на одному рядку знаходиться декілька операторів, вони будуть виконуватися разом при натисканні F7. З іншого боку, якщо один оператор розміщений на декількох рядках, то при натисканні F7 буде виконуватися весь оператор. Усі команди виконання грунтуються на рядках, включаючи покрокову налагодження і точки переривання; рядок, на якій знаходиться виконання, завжди відзначена курсором виконання.

Перш, ніж почати налагодження програми, Ви повинні задати для компілятора Turbo Pascal інструкцію з генерації таблиці символів і таблиці номерів рядків цієї програми. Таблиця символів представляє собою невелику базу даних з усіма використовуваними ідентифікаторами - константами, типами, змінними, процедурами та інформацією про номери рядків. Директиви компілятора $ D + і $ L + роблять це за замовчуванням, вони відповідають елементам меню Options / Compiler / Debug Information та Options / Compiler / Local Symbols. Так само за умовчанням встановлена ​​опція Options / Debugger / Integrated, яка генерує налагоджувальну інформацію для виконанні файлі.

Директива {$ D +} генерує таблицю номерів рядків, яка встановлює відповідність між об'єктним кодом і вихідним модулем. Директива {$ L +} генерує локальну налагоджувальну інформацію, а саме, будує список ідентифікаторів, локальних для кожної процедури або функції, для того, щоб відладчик міг зберігати інформацію про них в процесі налагодження. Коли Ви використовуєте директиви компілятора, розділяйте їх комами та без пробілів, і ставлячи $ тільки перед першою директивою; наприклад {$ D +, L +}.

Примітка: Ви можете відключити ці перемикачі для збереження пам'яті або дискового простору під час компіляції.

Коли Ви виконуєте покрокову налагодження, Turbo Pascal буде іноді перемикатися на екран користувача, виконувати Ваш код, а потім повертатися в інтегровану середу, очікуючи наступної команди. Ви можете керувати перемиканням екрану за допомогою установок Options / Debugger / Display Swapping, які можуть приймати 3 значення:

Smart: Це режим за замовчуванням. Середа IDE перемикається на екран користувача, коли програма звертається до відеопам'яті або при виклику програми.

Always: Переключення на екран користувача відбувається на кожному кроці.

None: Переключення екранів не відбувається. Інтегроване середовище залишається видимої весь час. Якщо в програмі передбачається виведення на екран або потрібне введення інформації, текст буде писатися на екрані середовища. Ви можете відновити вікна інтегрованого середовища, вибираючи Е / Refresh Display.

Початок сеансу налагодження.

Найбільш швидкий спосіб почати налагодження полягає у завантаженні програми і виборі команди Run / Trace Into (F7). Програма буде компілюватися. Коли компіляція завершиться, редактор відобразить на дисплей тіло основної програми з індикацією рядка виконання на першому операторі begin. Користувач може почати трасування програми з цього місця (натиснути клавіші F7 або F8) або використовувати інші методи які наведені нижче.

Якщо користувачеві необхідно почати налагодження з певного місця програми, він може виконати програму до цього місця, а потім зупинитися. Для цього, завантажте потрібний розділ вихідного модуля в редактор і пересуньте курсор на рядок, де Ви бажаєте зупинитись. Потім можна піти двома шляхами:

- Вибрати команду Run / Goto Cursor (або натиснути клавішу F4), яка буде виконувати програму користувача до досягнення рядки, поміченої курсором, а потім зупиняли роботу програми.

- Поставити на вказаному рядку точку переривання (вибрати команду Debug / Toggle Breakpoint або натиснути на Ctrl-F8), потім виконати програму (виконати команду Run / Run або натиснути Ctrl-F9); зупинка буде відбуватися кожного разу при досягненні заданої рядка. Ви можете задати декілька точок переривання, в цьому випадку програма буде робити зупинку щоразу при досягненні якої-небудь із цих точок.

Рестарт сеансу налагодження.

Якщо в процесі відладки програми виникає необхідність почати все спочатку, то потрібно виконати команду Program Reset з меню Run. Система налагодження повторно ініціалізується, і команда наступного кроку поверне вас до першої рядку головної програми. При цьому проводиться закриття всіх файлів, які були відкриті програмою, очищення стека всіх вкладених програм, які викликалися програмою, і звільнення всього використаного простору купи. Змінні програми, проте, не будуть повторно ініціалізовані або піддані модифікації якого-небудь іншого виду. (Turbo Pascal ніколи не ініціалізує змінні автоматично). Однак, початкові значення тіпірованних констант програми будуть відновлені.

Turbo Pascal також пропонує рестарт, якщо Ви проводите які-небудь зміни в програмі під час налагодження. Наприклад, якщо Ви змінюєте частина програми, а потім вибираєте будь-яку команду виконання (натискаєте клавіші F7, F8, F4, Ctrl-F9 і т.д.), Ви отримаєте повідомлення: Source modified, rebuild? (Y / N) (вихідний модуль модифікований, потрібно повторити збірку? Так / ні). Якщо Ви відповідаєте Y, Turbo Pascal буде перекомпілювати програму і відновить налагодження програми з початку. Якщо Ви відповісте N, Turbo Pascal припускає, що Ви впевнені у своїх діях, і продовжує сеанс налагодження далі. (Будь-які зміни в програмі, які Ви зробили, не будуть впливати на її виконання до тих пір, поки Ви не перекомпіліруете програму). Якщо Ви додали або видалили рядки програми, курсор виконання не реагує на ці зміни, і може виявитися, що буде виділятися помилкова рядок.

Закінчення сеансу налагодження.

У процесі налагодження програми Turbo Pascal зберігає трасу того, що Ви робите і де знаходитесь в даний момент. Так як користувач може в процесі налагодження завантажувати і навіть редагувати різні файли, Turbo Pascal не інтерпретує завантаження іншого файлу в редактор, як кінець сеансу налагодження. Тому, якщо ви бажаєте виконати або налагодити іншу програму, потрібно виконати команду Run / Program Reset (клавіша Ctrl-F2).

Трасування Вашої програми.

Найпростіша техніка налагодження - це покрокова налагодження, яка трасує усередині процедур і функцій. Завантажте програму RANGE.PAS в Turbo Pascal.

{$ D +, L +}

{Для того, щоб забезпечити

повну генерацію налагоджувальної інформації}

{$ R-} {Для того, щоб відключити перевірку діапазону}

program RangeTest;

var

List: array [1 .. 10] of integer;

Indx: integer;

begin

for Indx: = 1 to 10 do List [Indx]: = Indx;

Indx: = 0;

while (Indx <11) do

begin

Indx: = Indx +1;

if List [Indx]> 0 then

List [Indx]: =- List [Indx]

end;

for Indx: = 1 to 10 do writeln (List [Indx]);

end.

Почніть налагодження, натиснувши клавішу F7. Це покрокова команда. Turbo Pascal справить компіляцію автоматично, а потім підготуватися до покрокової обробці цієї програми. Зауважимо, що курсор виконання розташований на операторі begin (рядок 7). Пам'ятайте, що курсор виконання позначає наступний рядок програми, яка повинна бути виконана.

Натисніть клавішу F7 кілька разів. Курсор виконання переміститься на оператор List [Indx]: = Indx і зупиниться. Це означає, що рядок виконується в циклі.

Виберіть команду Debug / Watches / Add Watch (Ctrl-F7) для перегляду у вікні Add Watch. Ви можете переглядати значення змінних, структур даних або виразів у вікні Watch.

Те, що з'явиться у вікні Add Watch залежить від того, де розташовується курсор, коли ви натискаєте на клавішу Ctrl-F7. Якщо Курсор знаходиться на першій букві будь алфавітно-цифровий рядка, усередині рядка або відразу за нею, рядок буде копіюватися у вікно Add Watch і підсвічуватися. Так, якщо курсор був позиційований на слові Indx, то Indx з'явиться у вікні. Якщо у вікні необхідно що-небудь змінити, почніть набір на клавіатурі і первісне вираження і підсвічування зникнуть.

Як тільки з'явиться вікно Add Watch, незалежно від його вмісту, можна додати в нього текст, якщо натиснути клавішу Ў (яка копіює додатковий текст з редактора). Помістіть List у вікно, використовуючи Ў, і натисніть Enter. Тоді у вікні Watch в нижній частині екрана з'явиться рядок:

List: (1,2,0,0,0,0,0,0,0,0)

Cнова натисніть клавішу Ctrl-F7, наберіть слово Indx і натисніть Enter. Indx буде першим у списку у вікні Watch:

Indx: 3

List: (1,2,0,0,0,0,0,0,0,0)

Натисніть клавішу F7 знову і Ви побачите, що значення Indx і List у вікні Watch зміняться, відображаючи роботу Вашої програми.

Як тільки Ви ввійдете в цикл while, Ви знову побачите, що значення Indx і List змінюються крок за кроком. Зауважимо, що ці зміни у вікні Window відображають дії кожного рядка циклу після натискання клавіші F7.

Продовжуйте натискати на клавішу F7, поки не досягнете початку циклу while, c Indx рівним 10. Під час проходження через цикл, Ви можете спостерігати як змінюються значення у вікні Watch. Коли виконується оператор

List [Indx]: = - List [Indx];

значення Indx зміниться на -11. Якщо Ви продовжуєте натискати на F7, то виявиться, що ви увійшли в нескінченний цикл.

Таким чином, якщо Ви наберете таку програму, вона буде компілюватися та виконуватися. Виходить нескінченний цикл, оскільки цикл while виконується 11 разів, а не 10, і останнє значення змінної Indx одно 11. Так як масив List містить лише 10 елементів, значення List (11) буде вказувати на деяку позицію пам'яті поза масиву List. Через способу розподілу змінних вже виявиться, що значення List (11) займе в пам'яті теж місце, що і мінлива Indx. Це означає, що при Indx = 11, запис:

List [Indx]: = - List [Indx]

ідентична запису

Indx: =-Indx.

Так як значення змінної Indx одно 11, цей оператор змінить її значення на -11. У результаті у програмі розпочнеться повторне виконання циклу. Цей цикл тепер змінює додаткові байти в місці, відповідному List [-11 .. 0]. І тому значення Indx ніколи не буде закінчувати цикл із значенням більшим чи рівним 11, то цикл ніколи не закінчиться.

Важливо відзначити те, що використовуючи лише дві клавіші (F7 і Ctrl - F7), через кілька хвилин, Ви швидко і легко простежується проміжні значення змінних і знаходите помилку.

Покрокове виконання програми.

Різниця між командами Trace Into (F7) і Step Over (F8) в тому, що при використанні F7 здійснюється трасування усередині процедур і функцій, в той час як використання F8 призведе до обходу викликів підпрограм. Ці команди мають особливе значення при виконанні оператора begin основної програми, якщо програма використовує модулі, які мають розділ ініціалізації. У цьому випадку, використання F7 призведе до трасуванні розділу ініціалізації кожного модуля, що дозволяє побачити, що ініціалізується в кожному модулі. При використанні F8 ці розділи не будуть трассіроваться, і курсор виконання переходить на наступний рядок після begin.

Розглянемо наступний (неповний) приклад програми:

($ D +, L +)

program TestSort;

const

NLMax = 100;

type

NumList = array [1 .. NLMax] of integer;

var

List: NumList;

I, Const: word;

procedure Sort (var L: NumList; Cnt: Integer);

begin

(Sort the list) (сортування списку)

end; (of proc sort) (процедури Sort)

begin

randomize;

Count: = NLMax;

for I: = 1 to Count do

List [I]: = Random (1000);

sort (List, Count);

for I: = 1 to Count do

Write (List [I]: 8);

Readln

end. {Програми TestSort}

Припустимо, що Ви налагоджує процедуру Sort. Ви хочете здійснити трасування процедури Sort, включаючи перевірку значення всередині List до виклику Sort. Однак, виконувати 100 раз ініціалізацію всередині List дуже втомлює. Чи є спосіб виконувати цикл, не зупиняючись на кожній виконуваної рядку.

Так, фактично, існує кілька способів. По-перше, Ви могли б виділити цей цикл в окрему процедуру і натиснути клавішу F8 для того, щоб обійти її трасування, але це занадто нераціонально. По-друге, Ви могли б встановити всередині програми точку переривання. Ми пояснимо, що це за крапки переривання, і як вони використовуються трохи пізніше. Зрештою, Ви могли б використовувати команду Run / Go to Cursor (F4). Перемістіть курсор на рядок з викликом Sort, а потім натисніть на клавішу (F4). Ваша програма буде виконуватися до досягнення рядки, поміченої курсором. Курсор виконання переміститься на цей рядок; потім Ви можете почати трасування з цього місця, натискаючи на клавішу F7, для того, щоб можна було зробити трасування всередині Sort.

Команда Run / Goto Cursor (F4) діє на вкладених рівнях викликів підпрограм, навіть якщо їх вихідний код знаходиться в іншому файлі. Наприклад, Ви могли б розмістити курсор де-небудь всередині процедури Sort і натиснути на клавішу F4; програма виконувалася б до цього рядка. По суті, Sort могла б бути виділена в окремий модуль, відладчик б уже знав, коли потрібно зупинитися і що відобразити.

Існують три випадки, коли команда Go to Cursor (F4) не буде виконувати програму до зазначеної курсором рядка.

Перший, коли Ви розташували курсор між двома виконуваними рядками; наприклад, на порожній рядку або рядку з коментарями. У цьому випадку програма буде виконуватися до наступного рядка, що містить оператор, який може бути виконаний.

Другий випадок, коли курсор розташований поза процедурного блоку, наприклад, на операторі оголошення змінної або операторі program. Відладчик буде виводити повідомлення "no code generated for this line" (для цього рядка код не генерується).

Третій випадок, коли Ви маєте в своєму розпорядженні курсор на рядку, яка ніколи не виконується. Наприклад, рядок розташовується вище курсору виконання (передбачається, що ви знаходитесь не в циклі) або рядок є частиною else - умовного оператора, коли вираз if має значення true. У цьому випадку відладчик буде діяти так, як якщо б виконувалася команда Run / Run (Ctrl-F9); програма буде виконуватися до кінця або до точки переривання.

Припустимо, що Ви трассіруете процедуру Sort, потім хочете завершити роботу програми і подивитися вихідні результати. Яким способом зробити це? Спочатку потрібно перемістити курсор до останнього оператору end основної частини програми, а потім виконати команду Run / Go to Cursor (F4). Або простіше, потрібно виконати команду Run / Run (Ctrl-F9). Вона дозволяє відладчику продовжити нормальне виконання програми користувача. Програма буде виконуватися до кінця, або до тих пір, поки Ви не досягнете точки переривання або не буде натиснуто Ctrl-Break.

Використання точок переривання.

Точки переривання є важливим інструментом налагодження. Точка переривання подібна знаку зупинки, введеному в програму користувача. Коли програма зустрічає таку точку, вона зупиняє своє виконання і чекає подальших налагоджувальних інструкцій.

Примітка: Ви можете мати до 16 активних точок переривання.

Зауважимо, що точки переривання існують тільки під час сеансу налагодження; вони не зберігаються у файлі. EXE, якщо програма компілюється на диск. Щоб визначити точку переривання, використовуйте звичайні команди редагування для переміщення курсору на кожний рядок програми, де Ви хочете зробити паузу. Кожного разу виконуйте команду Debug / Toggle Breakpoint (Ctrl-F8). Коли рядок відзначається як точка переривання, вона висвітлюється. Це не повинна бути порожній рядок, коментарі, директиви компіляції; оголошення констант, типів, міток, змінних; заголовком програми, модуля, процедури або функції. Як тільки Ви задали точки переривання, виконуйте програму за допомогою команди Run / Run (клавіша Ctrl-F9). Спочатку програма буде виконуватися нормально. Коли зустрінеться точка переривання, програма зупиниться. Відповідний вихідний файл (основна програма, модуль або включений файл) завантажується у вікно Edit, яке візуалізується на екрані і курсор виконання поміщається на рядок з точкою переривання.

Зауважимо, що точка переривання не висвічується, коли на ній знаходиться курсор виконання. Якщо будь-які змінні або вирази були додані у вікно Watch, то вони також виводяться на дисплей зі своїми поточними значеннями.

Потім, користувач може використовувати будь-який режим відладки.

Ви можете здійснювати послідовне виконання програми, використовуючи команду Run / Trace Into, Step Over або Go to Cursor (F7, F8 або F4). Ви можете перевірити або змінити значення змінних.

Ви можете додати або видалити вирази з вікна Watch.

Можна призначити або видалити точки переривання.

Можна переглянути вихідні результати програми, використовуючи команду Windows / User Screen (Alt-F5).

Ви можете перезапустити програму спочатку (Run / Program Reset і, потім, команду покрокового виконання).

Можна продовжити виконання до наступної точки переривання (або до кінця програми), виконавши команду Run / Run (Ctrl-F9).

Для видалення точки переривання з рядка перемістіть курсор на дану рядок і, виконавши команду Debug / Toggle Breakpoint (або натисніть Ctrl-F8) ще раз. Ця команда включає або відключає точку переривання в рядку; якщо вона використовується для рядка з точкою переривання, то рядок стає нормальною.

Давайте повернемося до прикладу, який був розглянутий раніше.

begin {основна частина програми Test.Sort}

Randomize;

Count: = NLMax;

for I: = 1 to Count do

List [I]: = Random (1000);

Sort (List, Count);

for I: = 1 to Count do

Write (List [I]: 8);

Readln

end. {Програма Test.Sort}

Як вже говорилося, ідея була в тому, щоб обійти початковий цикл і почати трасування з виклику процедури Sort. Новий варіант. Натисніть курсор на рядок з викликом процедури і виконайте команду Debug / Toggle Breakpoint (Ctrl-F8), яка відзначить рядок, як точку переривання. Тепер виконайте програму до цієї точки, використовуючи команду Run / Run (Ctrl-F9). Коли програма досягне цього рядка, вона зупиниться і дозволить Вам почати налагодження.

Використання Ctrl-Break.

Крім призначення точок переривання, користувач може зробити негайну зупинку під час виконання програми, використовуючи клавішу Ctrl-Break. Це означає, що можна перервати роботу програми в будь-який час. Коли Ви натискаєте на клавішу Ctrl-Break, виконання програми припиняється. Ви повертаєтеся в редактор, курсор виконання розташований на наступному рядку програми, і програма готова до подальшого покроковому виконання.

Фактично, відладчик автоматично підключає DOS, BIOS і інші сервісні функції. Він знає, чи є поточний що виконується код програмою DOS, програмою BIOS або програмою користувача. Коли Ви натискаєте на клавішу Ctrl-Break, відладчик чекає, поки програма виконується сама. Потім він робить покрокове виконання інструкцій машинного рівня, поки наступна інструкція не буде на початку рядка вихідного коду на Паскалі. З цього моменту відладчик припиняє роботу, переміщує курсор виконання на цей рядок і пропонує Вам натиснути на клавішу ESC.

Примітка: Якщо користувач натискає на клавішу Ctrl-Break вдруге ще до того, як відладчик знаходить і відображає наступний рядок вихідного коду для виконання, то відладчик завершує роботу і не намагається знайти рядок вихідного коду. У цьому випадку, процедури виходу не виконуються, що означає, що файли, відеорежим і розподіл пам'яті DOS можуть бути не повністю очищені.

Перегляд значень.

Виконання програми надає багато інформації, але не в тому обсязі, як хотілося б. Може виникнути необхідність переглянути за тим, як змінюються значення змінних під час виконання програми. Розглянемо процедуру Sort з попередньої програми:

procedure Sort (var L: NumList; C: word);

var

Top, Min, k: word;

Temp: integer;

begin

for Top: = 1 to C-1 do

begin

Min: = Top;

for k: = Top +1 to C do

if L [k] Top then

begin

Temp: = L [Top];

Top: = L [Min];

L [Min]: = Temp;

end;

end;

end; {процедури Sort}

Примітка: Змініть NLMax в тілі програми на 10 так, щоб Ви могли працювати з меншим масивом.

У цій процедурі є помилки, будемо переглядати її (використовуючи команду Run / Trace Into або клавішу F7) і спостерігати за значеннями змінних L, Top, Min і k.

Відладчик дає можливість користувачеві задати об'єкти для перегляду під час виконання Вашої програми. Як Ви і припускаєте, об'єктами перегляду є змінні, структури даних і вирази, розташовані у вікні Watch, де відображаються їх поточні значення, оновлювані по мірі виконання кожного рядка програми. Давайте повернемося до попереднього прикладу. Встановити об'єкти спостереження просто.

Наведіть курсор до кожного ідентифікатору і виконуйте команду Debug / Watch / Add Watch (Ctrl-F7) для додавання кожного виразу у вікно Watch.

Результат може виглядати так:

k: 21341

Min: 51

Top: 21383

L: (163,143,454,622,476,161,850,402,375,34)

Передбачається, що Ви щойно увійшли в процедуру Sort, курсор виконання розташований на початковому операторі begin. (Якщо Ви ще не ввійшли в процедуру Sort, то для кожного виразу у вікні Watch буде з'являтися повідомлення "unknown identifier" (невідомий ідентифікатор), поки Ви не ввійдете в процедуру). Зауважимо, що змінні K, Min і Top мають довільні значення, тому що вони ще не були ініціалізований. Значення змінної L, імовірно, теж має бути довільним, вони не будуть такими при виконанні всієї програми, і всі вони повинні бути невід'ємними і лежати в інтервалі від 0 до 999.

Якщо натиснути на клавішу F7 чотири рази, то ми просунемося до рядка if L [k] Top then, тому до вершини зовнішнього циклу, і знову вниз до рядка if L [k] <L [Min] then. У цей момент вікно Watch буде виглядати наступним чином (для L дані попередні значення):

k: 3

Min: 2

Top: 2

L: (34,143,454,622,476,161,850,402,375,34)

Тепер Ви можете помітити дві речі. Перше, останнє значення змінної L (34), яке є також і найменшим значенням, скопіювати в перше значення L, і значення, яке вже було там раніше (163), зникло. Друге, змінні Min і Top мали однакові значення під час трасування процедури. Фактично, Ви можете помітити, що змінна Min отримує значення змінної Top, але вона ніколи не змінюється де-небудь ще. Проте, нижче циклу розташовується перевірка:

if MinTop then.

Або ця перевірка помилкова, або існує якусь невідповідність між цими двома частинами процедури. Виявляється, є хибною п'ятий рядок програми. Вона повинна виглядати так:

Min: = k, замість L [Min]: = L [k].

Виправте рядок, перемістіть курсор до первісного оператору begin у процедурі Sort і виконайте команду Run / Go to Cursor (F4). Так як Ви змінили програму, на екрані з'явиться вікно з питанням Source modified, rebild? (Y / N) (вихідний модуль модифікований, чи потрібна збірка? Так / Ні). Дайте відповідь Y. Програма буде перекомпілювати, розпочнеться її виконання, потім відбудеться зупинка на початковому операторі begin процедури Sort. Тепер програма працює правильно. Значення першого елемента тепер не змінюється на найменше із значень елементів масиву L, відбувається обмін-переміщення значення першого елемента масиву на місце, де до цього розташовувався елемент з найменшим значенням. Потім процес повторюється з другою позицією, третьої і т.д., поки список елементів не буде відсортований повністю.

Додати в блог або на сайт

Цей текст може містити помилки.

Програмування, комп'ютери, інформатика і кібернетика | Реферат
58.2кб. | скачати


Схожі роботи:
Редагування та налагодження програм за допомогою Pascal
Етапи розробки програм Тестування та налагодження Документування програм
Паскаль Налагодження програм
Налагодження програм і програмних комплексів
Розробка програм у середовищі програмування Turbo Pascal 70
Розробка програм у середовищі програмування Turbo Pascal 7 0
Складання програм для вирішення задач на мові програмування Turbo Pascal
Основні відомості про алгоритмічну мову Turbo Pascal Графіка Pascal
Організація інтерфейсу користувача
© Усі права захищені
написати до нас