Отладка
Системный подход к отладке, аппаратные и программные точки останова, отладчики (gdb, lldb, Visual Studio), санитайзеры и стратегия логирования.
4 вопросов
JuniorДебаггингОчень частоПочему if (x = 0) уходит не в ту ветку?
Почему if (x = 0) уходит не в ту ветку?
x = 0 — это присваивание, а не сравнение: оно записывает 0 в x, и выражение вычисляется в 0 (ложь), поэтому выполняется else, а x теперь 0. Автор имел в виду ==. Компиляторы предупреждают через -Wparentheses; некоторые стайл-гайды пишут if (0 == x).
Типичные ошибки
- ✗Читать
=как==внутри условия - ✗Ожидать ошибку компиляции вместо тихого выбора неверной ветки
- ✗Не включать -Wparentheses, чтобы поймать опечатку
Уточняющие вопросы
- →Почему запись
if (0 == x)превращает эту опечатку в ошибку компиляции? - →Чему равно значение выражения присваивания в C++?
JuniorТеорияЧастоЧто такое отладка и какие существуют базовые техники?
Что такое отладка и какие существуют базовые техники?
Отладка — это процесс поиска и устранения дефектов. Базовые техники: чтение стек-трейса, установка точек останова в gdb/lldb, пошаговое выполнение, printf-debug для быстрых проверок, бинарный поиск подозрительного коммита, санитайзеры (-fsanitize=address) и структурное логирование.
Типичные ошибки
- ✗Отлаживать оптимизированную сборку, не понимая, что компилятор переупорядочил или выбросил переменные — используйте
-Ogдля дружелюбной к отладчику оптимизации - ✗Гнаться за симптомом (строкой падения) вместо причины — реальный дефект часто за N шагов раньше в стеке вызовов
- ✗Не воспроизвести баг детерминированно перед попыткой починки — невоспроизводимый фикс — это догадка
Уточняющие вопросы
- →В чём разница между
-O0,-Ogи-O2с точки зрения отладки? - →Как
rr(record-replay) меняет подход к отладке плавающих багов?
MiddleТеорияЧастоКак системно отлаживать C++ код, и какие инструменты для этого есть?
Как системно отлаживать C++ код, и какие инструменты для этого есть?
Воспроизведите надёжно, изолируйте бинарным поиском, сформулируйте гипотезу и проверьте её. Используйте gdb/lldb для пошаговой отладки, санитайзеры (ASan/UBSan/TSan) для багов памяти и гонок, Valgrind для утечек, perf для профилирования, структурированные логи в production.
Типичные ошибки
- ✗Менять несколько вещей сразу — не поймёте, какое изменение исправило проблему; меняйте по одному
- ✗Идти по шагам в release-сборке — инлайнинг и переупорядочивание заставляют отладчик прыгать; используйте debug-сборку или
RelWithDebInfo - ✗Запускать ASan/TSan в production — санитайзеры добавляют 2-10× накладных расходов; оставьте их для CI и локальных воспроизведений
Уточняющие вопросы
- →Как отлаживать краш, который происходит только в production, но не в dev-сборках?
- →Что такое
rr(Mozilla Record and Replay) и когда он лучшеgdb?
SeniorТеорияИногдаКак работают аппаратные и программные точки останова?
Как работают аппаратные и программные точки останова?
Программные точки останова заменяют байт на INT 3 и ловят SIGTRAP; их сколько угодно, но память должна быть записываемой. Аппаратные используют регистры CPU и позволяют watchpoints, но их не более 4.
Типичные ошибки
- ✗Устанавливать watchpoint на локальную переменную после возврата из функции — фрейм стека исчез; отслеживаемый адрес теперь принадлежит другой переменной
- ✗Думать, что программные точки останова работают в ROM или памяти только для выполнения — отладчик не может записать в ROM; аппаратные точки — единственный вариант
- ✗Забывать, что
INT 3изменяет тайминг — при гонках вставка программной точки останова меняет чередование; используйте логирование или аппаратные watchpoints с меньшим влиянием
Уточняющие вопросы
- →Как gdb реализует условную точку останова без остановки при каждом срабатывании?
- →В чём разница между step-into, step-over и step-out в отладчике?