Перейти к основному содержимому

Отладка и поиск причин

Превратить «не работает» в конкретное, воспроизводимое утверждение о том, что именно происходит, а затем найти причину — а не правку, после которой симптом исчезает.

Почему это важно. Отладка — то место, где разница между 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, который автоматизирует поиск целиком.