Налагодження (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 — щоб зупинити програму лише при виконанні заданої умови, а не щоразу.