gadget59.ru лекции
Тестирование ПО · Лекция 5 · 24 слайда

Отладка и инструменты разработчика: точки останова, шаги, стек вызовов

Отладка и инструменты разработчика

На прошлых занятиях мы научились находить ошибки с помощью тестов. Но что делать, когда ошибка найдена? Как понять, почему программа работает неправильно, и как это исправить?

Ответ — отладка (debugging). Это процесс поиска и исправления ошибок в программе. Сегодня мы разберём, какие инструменты помогают отлаживать код и как ими пользоваться.

🐞 Отладка ⏸️ Точки останова 👣 Пошаговое выполнение 🧠 Стек вызовов
Это пятая лекция из цикла. Она посвящена инструментам разработчика. Без умения отлаживать код невозможно стать хорошим программистом.
Формат: лекция + практика в конце. В следующей лекции — интеграционное тестирование.

План лекции

Сегодня мы разберём, как искать и исправлять ошибки в коде.

  • 1 Что такое отладка и зачем она нужна
  • 2 Чем отладка отличается от тестирования
  • 3 Что такое отладчик (debugger)
  • 4 Точки останова (breakpoints)
  • 5 Пошаговое выполнение (step over, step into, step out)
  • 6 Просмотр переменных (watch, locals)
  • 7 Стек вызовов (call stack)
  • 8 Условные точки останова
  • 9 Отладка в Python и C++
  • 10 Типичные ошибки при отладке
  • 11 Итоги и практика
Если вы пропустили предыдущие лекции — вернитесь. Без понимания тестирования отладка будет «гаданием на кофейной гуще».

Что такое отладка

Отладка (debugging) — это процесс поиска и исправления ошибок в программе. По-английски «debug» буквально означает «избавиться от жука» (bug — жук).

Аналогия. Представьте, что машина не заводится. Вы не просто «меняете всё подряд» — вы открываете капот, проверяете аккумулятор, свечи, топливо. Отладка — это то же самое: систематический поиск причины проблемы.
🔍
Поиск
Найти, где именно программа работает неправильно.
🛠
Исправление
Понять причину и устранить её.
Отладка — это не «перебор всех вариантов». Это систематический процесс: сформулировать гипотезу, проверить её, найти причину.

Отладка vs тестирование

Эти два процесса часто путают. Но у них разные задачи.

КритерийТестированиеОтладка Цельнайти ошибкуисправить ошибку Кто выполняеттестировщикпрограммист Результатбаг-репортисправленный код Когда начинаетсядо отладкипосле тестирования
Тестирование
→
Найдена ошибка
→
Отладка
→
Исправлено
Отладка начинается после того, как тестирование обнаружило проблему. Это следующий шаг.

Что такое отладчик

Отладчик (debugger) — это программа, которая позволяет выполнять код по шагам и смотреть, что происходит внутри.

Аналогия. Представьте, что вы смотрите фильм. Обычно он идёт быстро. Но с пультом вы можете поставить на паузу, перемотать назад, посмотреть кадр за кадром. Отладчик — это «пульт» для программы.
ВозможностьЧто делает Точка остановаостанавливает программу в нужном месте Шаг с заходомвыполняет одну строку, заходя внутрь функций Шаг с обходомвыполняет одну строку, не заходя внутрь Просмотр переменныхпоказывает значения переменных Стек вызововпоказывает, какие функции сейчас выполняются
Отладчик — это «микроскоп» для программы. Он позволяет увидеть, что происходит внутри, в реальном времени.

Точки останова (breakpoints)

Точка останова (breakpoint) — это метка, которая говорит отладчику: «Останови программу здесь».

// Пример на Python def calculate(a, b): result = a + b // ← поставить точку останова здесь return result // Программа остановится перед выполнением строки // и вы сможете посмотреть значения a и b
ДействиеКак сделать Поставить точкукликнуть на полях слева от строки Убрать точкукликнуть ещё раз Запустить отладкуF5 (или кнопка «Debug»)
Когда программа остановится на точке останова, вы сможете посмотреть значения всех переменных и понять, что пошло не так.

Пошаговое выполнение

Когда программа остановлена, вы можете выполнять её по одной строке. Это называется пошаговым выполнением.

КомандаЧто делаетГорячая клавиша Step Overвыполняет строку, не заходя в функцииF10 Step Intoвыполняет строку, заходя в функцииF11 Step Outвыходит из текущей функцииShift+F11 Continueпродолжает до следующей точки остановаF5
Аналогия. Вы читаете книгу. Step Over — перевернуть страницу. Step Into — заглянуть в сноску. Step Out — вернуться к основному тексту.
Пошаговое выполнение позволяет увидеть, как именно программа приходит к неправильному результату.

Просмотр переменных

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

// Пример на Python def foo(): a = 5 b = 10 c = a + b // ← точка останова return c // На точке останова вы увидите: // a = 5 // b = 10 // c = (ещё не вычислено)
ПанельЧто показывает Localsлокальные переменные текущей функции Watchпеременные, которые вы добавили вручную Evaluate Expressionвычислить любое выражение
Просмотр переменных — это самый быстрый способ понять, где именно значение стало неправильным.

Стек вызовов (call stack)

Стек вызовов (call stack) — это список функций, которые сейчас выполняются. Он показывает, как программа пришла к текущей строке.

// Пример стека вызовов main() └── calculate() └── add() // ← сейчас здесь
ФункцияЧто делает main()точка входа calculate()вызывает add() add()текущая функция
Стек вызовов помогает понять, откуда была вызвана функция. Это особенно полезно, когда ошибка возникает глубоко внутри программы.
Если вы видите ошибку в функции add(), но не понимаете, кто её вызвал — стек вызовов покажет всю цепочку.

Условные точки останова

Иногда программа останавливается слишком часто. Например, в цикле на 1000 итераций. Чтобы не нажимать «Continue» 1000 раз, используют условные точки останова.

// Обычная точка останова for i in range(1000): process(i) // ← остановится на каждой итерации // Условная точка останова // Остановится только когда i == 500
УсловиеКогда остановится i == 500только на 500-й итерации i > 100начиная с 101-й value == nullкогда значение станет null
Условные точки останова экономят время. Вы не тратите его на «прокрутку» до нужного момента.

Отладка в Python

В Python есть встроенный отладчик pdb. Но удобнее использовать отладчик в IDE (например, VS Code или PyCharm).

Способ 1: встроенный pdb

import pdb def calculate(a, b): pdb.set_trace() # ← точка останова return a + b calculate(5, 10)

Способ 2: в IDE

Просто кликните на полях слева от строки — появится красная точка. Нажмите F5 — программа остановится на этой строке.

В IDE вы увидите все переменные, стек вызовов и сможете выполнять код по шагам. Это гораздо удобнее, чем pdb.

Отладка в C++

В C++ отладка обычно выполняется через IDE (Visual Studio, CLion) или через консольный отладчик gdb.

Visual Studio / CLion

Кликаете на полях слева — появляется красная точка. Нажимаете F5 — программа останавливается. Внизу видите переменные и стек вызовов.

gdb (консольный)

// Компиляция с отладочной информацией g++ -g main.cpp -o main // Запуск отладчика gdb ./main // Внутри gdb: (gdb) break main // точка останова на функции main (gdb) run // запуск (gdb) next // шаг с обходом (gdb) step // шаг с заходом (gdb) print a // посмотреть значение переменной a (gdb) continue // продолжить
Чтобы использовать gdb, нужно компилировать программу с флагом -g. Иначе отладчик не увидит имена переменных и строки кода.

Как искать причину ошибки

Отладка — это не «тыканье наугад». Есть системный подход.

1. Воспроизвести ошибку
↓
2. Сформулировать гипотезу
↓
3. Проверить гипотезу (точки останова, шаги)
↓
4. Найти причину
↓
5. Исправить
↓
6. Проверить, что ошибка исчезла
Хороший отладчик не «перебирает всё подряд». Он формулирует гипотезы и проверяет их. Это экономит часы работы.

Типичные ошибки при отладке

1. «Тыканье наугад»
Менять код без понимания причины. Это может сделать только хуже.
2. Игнорирование стека вызовов
Не смотреть, откуда пришла ошибка. В итоге ищут не там, где нужно.
3. Отладка без воспроизведения
Если ошибку нельзя повторить — её нельзя и исправить.
4. Забыть убрать точки останова
Программа останавливается в самый неподходящий момент. Всегда убирайте точки после отладки.
5. Не проверять исправление
«Кажется, работает» — не аргумент. Нужно запустить тесты и убедиться.
6. Отладка в релизной сборке
В релизной сборке оптимизации могут «скрывать» переменные. Отлаживайте только отладочную сборку.

Практическое задание

Примените полученные знания на практике.

Задание 1

Возьмите функцию calculate(a, b), которая должна возвращать a + b, но возвращает a - b. Поставьте точку останова и найдите причину с помощью отладчика.

Задание 2

В цикле на 100 итераций программа выдаёт ошибку только на 50-й. Поставьте условную точку останова i == 50 и посмотрите значения переменных.

Задание 3

Откройте стек вызовов для функции, которая вызывается из другой функции. Объясните, как программа пришла к текущей строке.

Решения разберём на практическом занятии. Не бойтесь экспериментировать — отладчик безопасен, он не меняет код.

Шпаргалка

Сохраните этот слайд — здесь все основные понятия лекции.

ТерминЧто значит Отладкапоиск и исправление ошибок Отладчикпрограмма для выполнения кода по шагам Точка остановаместо, где программа останавливается Step Overвыполнить строку, не заходя в функции Step Intoвыполнить строку, заходя в функции Step Outвыйти из текущей функции Стек вызововсписок выполняющихся функций Условная точкаостановка при выполнении условия

Итоги лекции

Подведём итоги. Вот что вы теперь знаете.

  • ✅ Отладка — это поиск и исправление ошибок в программе.
  • ✅ Отладка ≠ тестирование. Тестирование находит, отладка исправляет.
  • ✅ Отладчик позволяет выполнять код по шагам и смотреть переменные.
  • ✅ Точки останова останавливают программу в нужном месте.
  • ✅ Step Over, Step Into, Step Out — три способа пошагового выполнения.
  • ✅ Стек вызовов показывает, как программа пришла к текущей строке.
  • ✅ Условные точки останова экономят время в циклах.
  • ✅ Системный подход к отладке эффективнее «тыканья наугад».
В следующей лекции мы перейдём к интеграционному тестированию — проверке того, как модули работают вместе. Это следующий уровень после модульного тестирования.

Домашнее задание

Задания для самостоятельной работы. Первые два обязательны, остальные — для оценки «отлично».

  1. Напишите функцию с ошибкой (например, return a - b вместо return a + b). Найдите ошибку с помощью отладчика.
  2. Сделайте скриншот стека вызовов для функции, которая вызывается из другой функции.
  3. Объясните своими словами, чем Step Over отличается от Step Into.
  4. Поставьте условную точку останова в цикле на 100 итераций так, чтобы программа остановилась на 50-й.
  5. Найдите в интернете пример реальной ошибки, которую нашли с помощью отладчика.
Если задание кажется сложным — разбейте его на части. Сначала одна ошибка, потом вторая.

Что дальше?

В этом блоке по тестированию у нас ещё несколько материалов.

  • Лекция 6: интеграционное тестирование.
  • Практика 3: интеграционное тестирование на Python.
  • Лекция 7: формальные инспекции и верификация.
Отладка — это навык, который отличает опытного разработчика от новичка. Умение быстро находить причину ошибки ценится в любой команде.

Спасибо за внимание!

🐞

Отладчик — это ваш лучший друг

Чем лучше вы умеете им пользоваться, тем быстрее находите ошибки и тем меньше времени тратите на «гадание».

🐞 Отладка ⏸️ Точки останова 👣 Шаги 🚀 практика