Ноу Інти, лекція, тестування і налагодження

Робота з отладчиком

Давайте від теорії перейдемо до практики. Завантажте Lazarus з новим проектом, встановіть на форму просту кнопку і збережіть проект в папку 27-01. Імена проекту, форми, модуля і кнопки змінювати не потрібно, залиште імена, дані за замовчуванням.

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

Що ми тут робимо? Цілочисельну змінну i використовуємо в якості лічильника для циклу for. Цикл виробляємо від -3 до 3, тобто, 7 разів, включаючи нуль. У тілі циклу ми ділимо 10 на значення i. результат оформляємо у вигляді рядка і додаємо до списку рядків st. Ми вже наголошували, що подібні дії потрібно укладати в блок обробки виняткових ситуацій try-finally-end. що ми і зробили.

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

Отже, програму ми написали, зберегли, пора її компілювати. Натисніть кнопку "Запустити" на Панелі управління (або ). Програма нормально скомпілювати і запустилася. Натиснемо кнопку Button1. І тут же отримуємо помилку:

Ноу Інти, лекція, тестування і налагодження


Мал. 27.3. Повідомлення Lazarus про помилку

Судячи з повідомлення, помилка сталася під час виконання коду 42-го рядка. Гаразд, натиснемо "ОК" і командою "Запуск -> Скинути відладчик" припинимо виконання програми. Повернемося до коду і проаналізуємо 42-й рядок (якщо ви додавали порожні рядки, то у вас буде інший номер):

Ну що, нічого кримінального тут немає, чому ж сталася помилка? Код вірний і повинен був нормально виконуватися ... Коли ви заходите в подібний глухий кут. допомогти вам може здоровий глузд і вбудований відладчик. Здоровий глузд говорить, що помилка сталася десь в тілі циклу for. А щоб скористатися отладчиком, потрібно призупинити виконання програми на цьому циклі, щоб потім через підрядник його продовжити. Для зупинки роботи програми служать так звані точки зупинки (англ. Breakpoints).

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

Ви можете встановити одну таку точку або декілька, в різних частинах коду. Оскільки помилка виникає в 42-му рядку, розумніше буде призупинити виконання на попередній, 41-му рядку. Переведіть курсор на цей рядок, на будь-який її місце.

Встановити точку зупину можна різними способами:

Останні два способи найбільш зручні, але вибирати вам. У будь-якому випадку, рядок з встановленої точкою зупинки забарвиться червоним кольором:


Мал. 27.4. Рядок з точкою зупинки

Зняти точку зупину зручніше також останніми двома способами. Точка зупинки у нас є, знову натискаємо кнопку "Запустити". Програма починає свою роботу, натискаємо кнопку "Button1".


Мал. 27.5. Рядок, яка буде виконана далі

У нас викликів функцій немає, тому ми можемо скористатися як . так і (Найчастіше використовують - Крок в обхід).

Отже, натиснемо . і відладчик виконає рядок з точкою зупинки, і виділить сірим наступний рядок. знову натиснемо . і знову буде виділена ця рядок - був виконаний крок циклу. Натиснувши кілька разів . ми доб'ємося появи на екрані все тієї ж помилки, яка заблокує подальше виконання програми. Стає зрозуміло, що цикл нормально виконується кілька проходів, після чого все ж виникає помилка. Включаємо логіку: всередині циклу у нас змінюється тільки змінна i. значить, помилка якось пов'язана з нею. А як дізнатися, як саме?

Тут нам на допомогу приходить ще один корисний інструмент отладчика - спостереження за значеннями змінних. Скиньте програму командою "Запуск -> Скинути відладчик". Тепер знову натисніть кнопку "Запустити", а потім знову кнопку "Button1". Отладчик знову призупинив виконання програми на сходинці з циклом, однак не поспішайте натискати . Для початку, додамо спостереження над змінної i. Робиться це командою "Запуск -> Додати спостереження", яка була недоступна, поки програма не почала виконуватися. У рядку "Вираз" вкажіть змінну i. і натисніть "ОК":

Ноу Інти, лекція, тестування і налагодження


Мал. 27.6. Установка спостереження за змінною

Тепер відладчик спостерігає за значеннями змінної i. але нам від цього не легше - ми не бачимо цих значень! Щоб їх побачити, потрібно вивести на екран вікно Списку спостережень. Робиться це командою "Вид -> Вікна налагодження -> Вікно спостережень" або "гарячими клавішами" .

яке у нас повинно обчислюватися всередині циклу. У вікні Списку спостереження ви побачите і змінну i. і вираз. а також їх значення:


Мал. 27.7. Вікно Списку спостережень

Оскільки змінної i ще не було присвоєно значення -3, то в колонці значень ви, швидше за все, побачите 1, яким за замовчуванням була проініціалізувати наша змінна. Відповідне значення буде і у вирази. Тепер ми готові рухатися далі. натискаємо . У Списку спостережень відразу ж змінилася картина - i тепер одно -3, а вираз -3,3333 ...

натискаємо ще раз. Знову значення змінилися, тепер i = -2. а вираз = -5. Ми розуміємо, що цикл працює, і два його кроку були зроблені. натискаємо ще два рази. Зараз змінна містить нуль, а значення виразу вказує "inf". Однак рядок з обчисленням ще не була виконана, не забуваємо про це. знову натискаємо . і знову отримуємо помилку. А в значеннях змінної і виразу бачимо слово "evaluating", що перекладається, як "оцінка". Тепер ми наочно бачимо, що в рядку

виявилася невдалою, то коли змінна i дорівнює нулю. І тут вже нескладно здогадатися, чому ця помилка виникає - тому що відбувається спроба ділення 10 на 0.

Ноу Інти, лекція, тестування і налагодження


Мал. 27.8. Результуюче повідомлення програми

Як бачите, обчислення. де i дорівнює нулю, було пропущено.

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

Дякуємо за Ваш чудовий курс!

У самостійній роботі №2 при компіляції модуля MyCript.pas (ОС: Windows 7 x64, Lazarus 1.4 win64) видається помилка на код асемблера

mycript.pas (54,5) Error: Asm: [push reg32] invalid combination of opcode and operands
mycript.pas (95,5) Error: Asm: [pop reg32] invalid combination of opcode and operands

Я розумію, що курс готувався для 32 розрядних ОС, але як бути в разі 64 розрядних систем?

У обробниках пунктів меню FileCreate і FileOpen, а також в обробнику закриття форми OnClose - в цих трьох процедурах міститься один і той же код

їх перед створенням нового тексту>
if Memo1.Modified then begin
// якщо користувач згоден зберегти зміни:
if MessageDlg ( 'Збереження файлу',
'Поточний файл був змінений. Зберегти зміни?',
mtConfirmation, [mbYes, mbNo, mbIgnore], 0) = mrYes then
FileSaveClick (Sender);
end; // if

Дозвольте запитати: чи не краще було б винести цей код в окрему процедуру, наприклад - в обробник події форми OnCloseQuery? Наскільки я пам'ятаю з досвіду Delphi, виклик цієї процедури сам по собі не повинен призводити до закриття форми. А значить, її можна використовувати і в процедурах очищення Memo1 і читання з файлу. Або в Lazarus так робити не можна?

Схожі статті