Отладка и поиск причин
Превратить «не работает» в конкретное, воспроизводимое утверждение о том, что именно происходит, а затем найти причину — а не правку, после которой симптом исчезает.
Почему это важно. Отладка — то место, где разница между senior и junior видна отчётливее всего, и дело не в знании инструментов. Дело в методе: один выдвигает гипотезу и проверяет её, другой правит код, пока ошибка не перестанет появляться, и оставляет баг, который вернётся в форме, которую никто не узнает.
Что нужно понимать
- Что происходит на самом деле, а не что вы предполагали
- Воспроизводится ли это по требованию — а если нет, то что меняется от раза к разу
- В каком слое проблема — прежде чем заглядывать внутрь любого из них
- Что изменилось, если раньше работало
- Устраняет ли исправление причину или прячет симптом
Ключевые темы
Метод
- Сначала воспроизвести: про баг, который не удаётся вызвать, нельзя убедиться, что он исправлен
- Сужать делением пополам — путь исполнения, данные, интервал времени
- По одному изменению за раз, чтобы было ясно, какое из них сработало
- Ставить под сомнение то допущение, в котором вы уверены больше всего: именно там всё и прячется
Инструменты
- Точки останова, условные точки останова и осмысленный пошаговый проход
- Логирование, которое доживает до production, и структурированные логи вместо
print - Просмотр состояния: деревья widget'ов, сетевой трафик, содержимое базы данных
- Профилировщики — для вопросов о времени и памяти, а не о корректности
Сложные случаи
- Плавающие баги и баги, зависящие от таймингов
- «У меня работает» — различия в окружении, версиях и данных
- Баги, которые проявляются только в release-сборке
- Сообщения от пользователей без сценария воспроизведения
После исправления
- Тест, который поймал бы этот баг
- Встречается ли та же ошибка где-то ещё
- Сделать так, чтобы в следующий раз сбой был громче
Уровни
| Уровень | Как это выглядит |
|---|---|
| Junior | Читает ошибку, ищет её в поиске, пробует исправления. С простыми багами справляется. |
| Middle | Уверенно воспроизводит, локализует слой, берётся за отладчик и профилировщик по выбору, а не как за последнее средство. |
| Senior | Ставит диагноз по неполным данным — отчёту о падении, описанию пользователя — и исправляет класс багов, а не отдельный случай. |
Практика
Для начала
-
Научитесь воспроизводить по требованию Возьмите баг, который случается «иногда», и найдите точные условия.
-
Отладчик вместо print'ов Разберите следующий свой баг целиком точками останова и просмотром состояния.
-
Прочитайте stack trace как следует Найдите первый фрейм, относящийся к вашему коду, и объясните, как исполнение туда попало.
Глубже
-
Найдите регрессию делением пополам С помощью
git bisectнайдите коммит, который внёс баг. -
Отладьте сбой, который есть только в release Разберитесь с тем, что воспроизводится только в release-сборке.
-
Поставьте диагноз по отчёту о падении Возьмите production stack trace без сценария воспроизведения и восстановите, что произошло.
Проверьте себя
- С чего вы начинаете, когда что-то не работает?
- Как вы определяете, в каком слое проблема?
- Когда вы в последний раз исправили симптом и баг вернулся?
- Что делает баг-репорт полезным для вас — и соответствуют ли этой планке ваши собственные?
- Как вы отлаживаете то, что не удаётся воспроизвести?
- Что вы делаете после исправления бага, чтобы он не смог вернуться незаметно?
Материалы
- Debugging: The 9 Indispensable Rules — книга Дэвида Аганса, выросшая из отладки железа и только выигравшая от этого. Правила достаточно коротки, чтобы их запомнить, и достаточно конкретны, чтобы ими пользоваться.
- Flutter DevTools — инспектор, просмотр сетевых запросов, профилировщики процессора и памяти. Большинство разработчиков пользуется малой частью этого и расплачивается за это.
- Debugging Flutter apps — официальное руководство, включая флаги отладки и assert'ы, которые вскрывают проблемы, за которыми иначе пришлось бы гоняться.
- A debugging manifesto — Джулия Эванс о том, чем настрой людей, которые находят баги, отличается от настроя тех, кто просто барахтается. К нему стоит добавить её debugging guide zine.
- git bisect — официальная
документация, включая
run, который автоматизирует поиск целиком.