Стратегии охоты за ошибками?

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

Fine. Мы все были там.

У вас есть модульные тесты для написания и запуска, отладки/протоколирования операторов для вставки, операторов sql для записи и запуска, вещей, которые вы хотите проверить с помощью FireBug и т.д.

Скажем, на первом этапе появляется список потенциальных причин, которые вы хотите исследовать.

Теперь вам нужно решить, какой порядок делать.

Вы:

  • Исследуйте причины в порядке, основанном на чувстве кишечника?
  • Исследуйте причины, чтобы они были самыми быстрыми, чтобы проверить, насколько медленнее проверять?
  • Предположим, что ошибка специфична для этой функции и исследует от большинства функционально-специфических кодов до наименее специфичного для функции кода?
  • Предположим, что это кто-то другой, и исследуйте с самого общего кода до вашего конкретного кода?
  • Что-то еще я не упомянул?

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

Любые мысли?

Ответ 2

По моему опыту, возможно, лучше всего пойти с чувством кишки (1) в течение 30 минут или около того.

Если ничего не выходит из этого, поговорите с кем-то еще об этом.

Удивительно, как можно разговаривать с кем-то другим (даже если они не являются техническими). ​​

Ответ 3

  • Воспроизводите ошибку в среде отладки.
  • Изучите состояние системы в точке, где возникает ошибка, чтобы найти непоследовательные/неправильные/неожиданные элементы состояния, которые непосредственно, видимо, привели к возникновению ошибки. Часто просто просматривая код и стек вызовов, вы сразу скажете, в чем проблема.
  • Добавить тесты во все точки, где это состояние может быть создано/изменено в пределах обычного потока управления.
  • Рассматривая ошибки этих тестов как новую ошибку, вернитесь к шагу 2.

Промойте, налейте, повторите, пока не будет найдена первоначальная причина проблемы. Трудный и механический, но вы попадете туда.

Кроме того, иногда тесты на итерации этапа 3 не терпят неудачу; чаще всего потому, что некоторая не зависящая от системы память повреждает то, что приводит к недействительному состоянию, или потому что проблема связана с потоками/синхронизацией/неинициализацией данных, и введение тестов изменяет тайминги и/или структуру данных, чтобы изменить или скрыть симптомы. На данный момент для этого плаката, по крайней мере, процесс становится более интуитивным, чередуя между заменой тестов на здравомыслие с менее навязчивыми формами и выборочным отключением модулей, чтобы исключить источники коррупции.

Ответ 4

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

Никогда не недооценивайте чувства кишечника; этот опыт дает вам голову. Я почти всегда начинаю с того, что вы, вероятно, считаете моим чувством "кишки". Я смотрю на ошибку и проверяю шаги, которые, как я думаю, могут вызвать такую ​​проблему.

Ответ 5

Мой первый шаг в такой ситуации, как правило, заключается в том, чтобы проверять вещи в порядке, который наиболее быстро уменьшит количество вещей, оставшихся для проверки. Вы могли бы почти думать об этом, как делать двоичный поиск ошибки: "Ну, параметры POST выглядят правильно, поэтому я могу исключить все до отправки формы" и т.д.

Тем не менее, если у меня есть сильное чувство, что проблема может быть в определенном месте, я сначала проверю.

Ответ 6

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

Это не работает, если вы не знаете или не понимаете кодовую базу - если это так, найдите того, кто это делает, и поймите с его чувством кишки.

Ответ 7

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

Кроме того, когда я исследую причину, я пытаюсь напрямую добавить действительно быстрые проверки, поскольку я все равно проверяю код (добавьте временные отладочные операторы вывода, добавьте утверждения и т.д.)

Ответ 8

Слушайте, как эксперты отлаживают программное обеспечение на радиотехнике Software Engineering:

Дэйв Томас говорит о программной археологии, которая имеет некоторые действительно отличные советы по отладке.

Андреас Целлер появляется в episode, посвященной отладке.

Ответ 9

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

Независимо от порядка, важно то, что вы делаете с вашей гипотезой. Начните пытаться опровергнуть каждую гипотезу, а не проверять ее, и вы охватите больше земли (см. Психология аналитического анализа Ричардс Дж. Хейер, младший, бесплатный PDF).

Ответ 10

Я с @moonshadow, но я добавлю, что в какой-то степени это зависит от того, что происходит. То есть, некоторые виды сбоев имеют довольно известные причины, и я бы начал с известной причины

Например, в системах Windows ошибки "Нарушения доступа" почти всегда связаны с попыткой использовать или просматривать (доступ) нераспределенную память. Чтобы найти источник такой ошибки, рекомендуется рассмотреть все места, где память (или нет) выделена.

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

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

Ответ 11

Мой заказ:

  • Посмотрите на код 1-2 наиболее вероятных причин (выбранных исходя из чувства кишки).
  • Если ничего не найдено, выполните код в отладчике (или, если возможно, вставьте отладочные/протоколирующие инструкции в код).
  • Если ничего не найдено, вызовите кого-то другого и повторите шаги 1 и 2 вместе с ним/ей.

Ответ 12

Вот несколько полезных советов:

  • Если вы используете язык, который генерирует трассировку стека на исключениях, начиная с этого момента.
  • Получите копию исходных данных, вызвавших проблему, если сможете.
  • Используйте хороший отладчик.
  • Если у вас есть доступ к одному, есть такие вещи, как ODB для различных языков, которые могут быть полезны, позволяя вам перемотки вперед или назад через выполнение после возникновения события.
  • Исключить невозможное, и вы останетесь с решением!

Ответ 13

Я обычно делаю это:

1) Добавить новый функциональный тестовый пример в автоматическую систему тестирования регрессии. Обычно я запускаю программный проект с собственной регрессионной тестовой системой с

  • Библиотека Excel VBA + C для управления интерфейсом/устройством SCSI/IDE (13 лет назад), тестовый отчет - таблица Excel.
  • TCL Ожидайте тестирования системы комплексного сетевого маршрутизатора. Отчет о тестировании - это веб-страница. (6 лет назад)
  • Сегодня я использую Python/Expect. Отчет о тестировании - XML-анализатор XML + python base.

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

Не проверяйте какой-либо код, если это не закончится с тестом на автоматическое регрессионное тестирование.

Я обычно пишу соотношение 1:1 между кодом продукта и кодом тестирования. 20k строк эксперта TCL для 20K строк кода С++. (5 лет назад.) Например:

  • C-код будет реализовывать туннельный туннелирование туннеля для настройки туннеля.
  • Тесты TCL: (a) Установите соединения, убедитесь, что данные проходят через. (b) Настройте соединения с различными сетевыми элементами. (c) Сделайте это 10, 100, 1000 раз и проверьте наличие утечек памяти и проблем с системным ресурсом и т.д.
  • Сделайте это для всех функций в системе, можно понять, почему рацион 1:1 в тестовой программе для кодирования.

Я не хочу, чтобы команда QA выполняла автоматическое тестирование с моей тестовой системой, так как весь мой код проверки должен пройти тесты. Обычно я выполняю тест на регрессию на 2 недели, прежде чем я отправлю код команде QA.

Команда QA, в которой выполняются ручные тестовые примеры, также гарантирует, что моя программа имеет достаточно встроенной диагностической информации для захвата любых будущих ошибок. Цель состоит в том, чтобы иметь достаточно диагностической информации для решения 95% ошибок в < 2 часа. Я смог сделать это в своем последнем проекте. (Оборудование для видеосети в сетях RBG.)

2) Добавьте диагностическую процедуру (веб-базу в настоящее время), чтобы получить всю внутреннюю информацию. (Текущее состояние, журналы и т.д.). > 50% моего кода (c/С++, специально) являются диагностическим кодом.

3) Добавьте более подробную информацию для проблемной области, которые я не понимаю.

4) Проанализируйте информацию.

5) Попробуйте исправить ошибку.

6) Проведите ночь/в течение регрессионных тестов в выходные дни. Когда я был в R & D, я обычно прошу в аренду 5-10 тестовых систем для проведения непрерывных регрессионных тестов 24x7. Это обычно помогает ID и решает проблему памяти, ресурса и долгосрочной производительности, прежде чем код попадет в SQA.

Как только встроенная система время от времени загружается в приглашение Linux. Я добавил тестовый пример, в котором он снова и снова запускает систему с программируемой розеткой и следит за тем, чтобы она могла "видеть" командную строку и запускать тест на ночь. Мы смогли быстро определить проблему с кодом FPGA и убедиться, что система всегда работает после 5000 циклов питания. Был добавлен тестовый пример и встроен новый код проверки Verilog/FPGA. Этот тест был запущен. Это никогда не было проблемой снова.

Ответ 14

Я предлагаю прочитать "Отладка от мышления".

Андреас Целлер также проделал определенную работу по систематическим исследованиям отладки.