Отладка невозможных ошибок: попробуйте сделать еще хуже

Написано Дэйвом Свитоном, главным технологом компании Stout Systems

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

Большинство ошибок довольно просты. Вы можете посмотреть стек вызовов ошибки (если он у вас есть) или просмотреть логи, чтобы узнать подсказки о состоянии приложения. Надеюсь, вы получили хороший набор шагов для воспроизведения ошибки, либо из собственного тестирования, либо от тестировщика, который нашел ошибку!

Однако некоторые ошибки слишком упрямы, чтобы их можно было найти обычными средствами. Они не оставляют следов в журналах. След не имеет смысла. (Вы ловите себя на том, что говорите: «Этого не может быть!») Простые смертные не могут воспроизвести их, но Дженни из бухгалтерии может сломать их, просто нажав одну кнопку! У вас может даже быть ужасный «Heisenbug», когда ошибка исчезает всякий раз, когда вы ее исследуете.

Распространенными причинами невозможных ошибок являются условия гонки, когда задача B иногда завершается раньше задачи A и вызывает ошибку. Проблемы с потоками также распространены, особенно с общими данными. Без общих данных большинство проблем с многопоточностью являются той или иной формой состояния гонки.

Когда я сталкиваюсь с ошибкой, которая сопротивляется попыткам воспроизвести, мне нравится задавать один вопрос: «Если я не могу сделать ее лучше, могу ли я сделать ее хуже?» Иногда простое размышление о том, как вы можете усугубить ситуацию, может подстегнуть идеи о том, как ее найти.

Как сделать что-то хуже? Зависит от обстоятельств, но вот несколько идей:

  • Увеличьте нагрузку, добавив больше одновременных пользователей или используя автоматизированный инструмент стресс-тестирования.
  • Добавьте программные задержки в код, чтобы изменить время выполнения операций.
  • Измените код для повторения операций. Если нажатие кнопки запускает код, который иногда содержит ошибку, сделайте так, чтобы нажатие кнопки вызывало этот код несколько раз, возможно, в цикле.
  • Точно так же вы можете автоматизировать запуск кода с ошибками (возможно, с помощью модульного/интеграционного теста), чтобы запускать его в течение тысяч итераций. Если вы отойдете слишком далеко от «нормального» контекста приложения, вы, возможно, не сможете воспроизвести ошибку, но, по крайней мере, у вас может быть намек на то, что ошибка связана с контекстом, которого нет в вашем тесте.
  • Уменьшите пропускную способность сети и/или увеличьте задержку. Вы можете легко сделать это в браузере (для веб-приложения) с помощью инструментов разработчика браузера.
  • Попробуйте другую среду. Иногда разные часовые пояса, разные культуры или другое оборудование могут вызывать странные ошибки.
  • Попробуйте спросить: «Могу ли я сделать хуже?» вопрос в следующий раз, когда вы столкнетесь с невозможной ошибкой. Надеюсь, это приведет вас к моменту Эврика!!

Эта техническая/деловая статья предназначена для разработчиков, менеджеров по найму/проектов и других технических специалистов, стремящихся улучшить свои навыки. Зарегистрируйтесь, чтобы получать наши статьи на свой электронный ящик.

Если вы ищете работу в технологической отрасли, посетите нашу доску вакансий, чтобы узнать, подходите ли вы для некоторых из наших вакансий. Если вы ищете технических специалистов для своей компании, свяжитесь с нами.

Stout Systems — это консалтинговая и кадровая компания, работающая на основе самой мощной доступной технологии: Human Intelligence®. Мы были основаны в 1993 году и базируемся в Анн-Арборе, штат Мичиган. У нас есть клиенты в США в таких областях, как инженерия, наука, производство, образование, маркетинг, развлечения, малый бизнес и робототехника. Мы предоставляем экспертные услуги по разработке программного обеспечения, веб-сайтов и встроенных систем, а также услуги по подбору персонала, а также подбор и трудоустройство технических специалистов по прямому найму.