Отладка и инструменты разработчика
На прошлых занятиях мы научились находить ошибки с помощью тестов. Но что делать, когда ошибка найдена? Как понять, почему программа работает неправильно, и как это исправить?
Ответ — отладка (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) — это метка, которая говорит отладчику: «Останови программу здесь».
Пошаговое выполнение
Когда программа остановлена, вы можете выполнять её по одной строке. Это называется пошаговым выполнением.
Просмотр переменных
Когда программа остановлена на точке останова, вы можете посмотреть значения всех переменных.
Стек вызовов (call stack)
Стек вызовов (call stack) — это список функций, которые сейчас выполняются. Он показывает, как программа пришла к текущей строке.
add(), но не понимаете, кто её вызвал — стек вызовов покажет всю цепочку.Условные точки останова
Иногда программа останавливается слишком часто. Например, в цикле на 1000 итераций. Чтобы не нажимать «Continue» 1000 раз, используют условные точки останова.
Отладка в Python
В Python есть встроенный отладчик pdb. Но удобнее использовать отладчик в IDE (например, VS Code или PyCharm).
Способ 1: встроенный pdb
Способ 2: в IDE
Просто кликните на полях слева от строки — появится красная точка. Нажмите F5 — программа остановится на этой строке.
Отладка в C++
В C++ отладка обычно выполняется через IDE (Visual Studio, CLion) или через консольный отладчик gdb.
Visual Studio / CLion
Кликаете на полях слева — появляется красная точка. Нажимаете F5 — программа останавливается. Внизу видите переменные и стек вызовов.
gdb (консольный)
-g. Иначе отладчик не увидит имена переменных и строки кода.Как искать причину ошибки
Отладка — это не «тыканье наугад». Есть системный подход.
Типичные ошибки при отладке
Менять код без понимания причины. Это может сделать только хуже.
Не смотреть, откуда пришла ошибка. В итоге ищут не там, где нужно.
Если ошибку нельзя повторить — её нельзя и исправить.
Программа останавливается в самый неподходящий момент. Всегда убирайте точки после отладки.
«Кажется, работает» — не аргумент. Нужно запустить тесты и убедиться.
В релизной сборке оптимизации могут «скрывать» переменные. Отлаживайте только отладочную сборку.
Практическое задание
Примените полученные знания на практике.
Задание 1
Возьмите функцию calculate(a, b), которая должна возвращать a + b, но возвращает a - b. Поставьте точку останова и найдите причину с помощью отладчика.
Задание 2
В цикле на 100 итераций программа выдаёт ошибку только на 50-й. Поставьте условную точку останова i == 50 и посмотрите значения переменных.
Задание 3
Откройте стек вызовов для функции, которая вызывается из другой функции. Объясните, как программа пришла к текущей строке.
Шпаргалка
Сохраните этот слайд — здесь все основные понятия лекции.
Итоги лекции
Подведём итоги. Вот что вы теперь знаете.
- ✅ Отладка — это поиск и исправление ошибок в программе.
- ✅ Отладка ≠ тестирование. Тестирование находит, отладка исправляет.
- ✅ Отладчик позволяет выполнять код по шагам и смотреть переменные.
- ✅ Точки останова останавливают программу в нужном месте.
- ✅ Step Over, Step Into, Step Out — три способа пошагового выполнения.
- ✅ Стек вызовов показывает, как программа пришла к текущей строке.
- ✅ Условные точки останова экономят время в циклах.
- ✅ Системный подход к отладке эффективнее «тыканья наугад».
Домашнее задание
Задания для самостоятельной работы. Первые два обязательны, остальные — для оценки «отлично».
- Напишите функцию с ошибкой (например,
return a - bвместоreturn a + b). Найдите ошибку с помощью отладчика. - Сделайте скриншот стека вызовов для функции, которая вызывается из другой функции.
- Объясните своими словами, чем
Step Overотличается отStep Into. - Поставьте условную точку останова в цикле на 100 итераций так, чтобы программа остановилась на 50-й.
- Найдите в интернете пример реальной ошибки, которую нашли с помощью отладчика.
Что дальше?
В этом блоке по тестированию у нас ещё несколько материалов.
- Лекция 6: интеграционное тестирование.
- Практика 3: интеграционное тестирование на Python.
- Лекция 7: формальные инспекции и верификация.
Спасибо за внимание!
🐞
Отладчик — это ваш лучший друг
Чем лучше вы умеете им пользоваться, тем быстрее находите ошибки и тем меньше времени тратите на «гадание».