Налагодження (breakpoints, watch, debugger, аналізатори коду)

Розділ: Інженерія систем і програмного забезпечення

📌 Про що ця тема


Налагодження (debugging) — це пошук і виправлення помилок у програмі за допомогою спеціальних інструментів. Ключове поняття — дебагер (debugger): засіб, що дозволяє виконувати код покроково й бачити, що відбувається «всередині». На іспиті перевіряють розуміння інструментів (точки зупину, спостереження за змінними) та видів помилок.


📖 Головне


• Помилки бувають трьох типів: синтаксичні (порушення правил мови, код не компілюється), логічні (програма працює, але дає неправильний результат) і помилки виконання/runtime (виникають під час роботи — ділення на нуль, вихід за межі масиву).


• Дебагер — інструмент для контрольованого виконання програми: зупиняє її у потрібних місцях і показує стан змінних, стек викликів, пам'ять.


• Breakpoint (точка зупину) — позначка на рядку коду; коли виконання доходить до неї, програма призупиняється, і можна перевірити значення.


• Умовна точка зупину спрацьовує лише тоді, коли виконується задана умова (наприклад, i == 100).


• Watch (спостереження) — вираз або змінна, значення яких дебагер показує й оновлює під час виконання, щоб відстежити, як вони змінюються.


• Крокові команди: Step Into (зайти всередину функції), Step Over (виконати функцію як один крок, не заходячи), Step Out (вийти з поточної функції), Continue (продовжити до наступного breakpoint).


• Стек викликів (call stack) — список функцій, які зараз виконуються одна в одній; показує «шлях» до поточного рядка.


• Аналізатор коду (статичний аналіз) — перевіряє код БЕЗ його запуску: знаходить потенційні помилки, невикористані змінні, порушення стилю. Динамічний аналіз — під час виконання (витоки пам'яті, швидкодія).


• Логування (вивід повідомлень у журнал) — простий спосіб налагодження без дебагера.


🔢 Як це працює на прикладі


Є цикл, що має підсумувати числа, але результат неправильний:

sum = 0

for i in range(1, 5): sum = i (помилка: = замість +=)


Крок за кроком:

1. Ставимо breakpoint на рядку з sum.

2. Додаємо sum і i у Watch.

3. Запускаємо — програма зупиняється. Бачимо: i=1, sum=0.

4. Натискаємо Step Over кілька разів. Помічаємо: при i=2 sum стає 2, а не 3.

5. Висновок: sum не накопичується, а перезаписується → логічна помилка в операторі.

6. Виправляємо на sum += i.


⚠️ Типові помилки


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

• Плутають Step Into і Step Over: Into заходить у функцію, Over виконує її цілком. Неправильний вибір «провалює» у чужий код або пропускає потрібний.

• Думають, що watch змінює значення — ні, він лише спостерігає.

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

• Забувають, що breakpoint лише зупиняє, а не виправляє код.


🎯 Що завчити напам'ять


• Три типи помилок: синтаксичні, логічні, runtime.

• Breakpoint — зупинка; Watch — спостереження за змінною.

• Step Into / Step Over / Step Out / Continue — що робить кожна.

• Статичний аналіз — без запуску; динамічний — під час виконання.


🧠 Перевір себе


1. Яка команда виконає функцію як один крок, не заходячи в неї?

2. Який тип помилки НЕ виявить компілятор одразу?

3. Чим статичний аналіз відрізняється від динамічного?

4. Для чого потрібна умовна точка зупину?


Відповіді: 1 — Step Over; 2 — логічна (програма працює, але результат хибний); 3 — статичний перевіряє код без запуску, динамічний — під час виконання; 4 — щоб зупинити програму лише при виконанні заданої умови, а не щоразу.

Перевірити себе на практиці

Прочитати — половина справи. Далі потрібні завдання цієї ж теми з розбором кожної відповіді: саме на них видно, чи справді тема закрита.