Разработка сложных программных изделий


Средства и методы отладки


Отладка начинается после обнаружения ошибки. Существуют следующие средства обнаружения причины ошибки и ее локализа­ции:

1. Листинг исходного кода.

2. Подробная спецификация программы.

3. Детальный алгоритм программы, представленный в виде блок-схемы, схемы действий, таблицы решений и т.п.

4. Выходной листинг.

5. Анализ последовательности выполнения операторов и оценка ожидаемых значений переменных.

6. Отслеживание обращений к подпрограммам.

7. Дампы памяти.

Эти средства предполагают проведение внимательного анализа программы за столом.

Существенную помощь в отладке оказывают инструментальные средства:

• отладочные компиляторы применительно к языку программи­рования;

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

• средства для печати значений используемых переменных при аварийном завершении программы, для трассировки значений пере­менных в процессе выполнения программы и т.п.;



• пакеты программ для прослеживания потоков управления и данных в программе, контроля индексов и регистрации вызовов подпрограмм;

• генераторы тестовых данных, формирующие тестовые наборы данных в соответствии со спецификациями, задаваемыми пользова­телем;

• специальные он-лайновые отладчики, обеспечивающие авто­матизацию рестартов, остановов и прерываний программы, про­смотр работы отдельных операторов и т.п.;

• пакеты словарей/справочников данных, позволяющие контро­лировать имена и типы данных и их использование разными моду­лями программы;

• CASE-средства для построения схем потоков данных, моделей данных, схем алгоритмов и т.п.;

• автоматизированные рабочие места программистов, включаю­щие большинство из перечисленных средств.

Для отладки применяется ряд методов, которые можно укруп-ненно представить в виде следующих групп.

1. Метод "грубой силы". Наиболее распространенный и тради­ционно используемый программистами подход; связан со всесто­ронним анализом за столом исходного кода и алгоритма програм­мы, выходных результатов и сообщений компилятора.
Прежде ши­ роко использовался анализ содержимого памяти (дампа памяти) обычно в шестнадцатеричной или восьмеричной форме.

Для повышения эффективности отладки в текст программы включают операторы отладочного кода. Наиболее просто осущест­вить вставку операторов, которые регистрируют результаты испол­нения конкретного оператора. Часто — это распечатка выбороч­ных значений переменных. Кроме того, может осуществляться про­верка завершения логических участков программ, результаты вы­полнения условий и т.п. Такой метод вставок предполагает, что после проверяемых включаются операторы, регистрирующие ре­зультаты выполнения контролируемых. После завершения отладки программы отладочные операторы можно оставить в виде коммен­тариев для возможного использования их в дальнейшем на этапе сопровождения программного изделия.

К сожалению, подобный подход требует использования боль­шого объема тестовых данных, поскольку процедура локализации ошибок достаточно случайна. Хотя программисту предоставляется возможность работать за терминалом, анализируя работу программы в динамике и используя при этом разнообразные инструмен­тальные отладочные средства, эффективность его работы методом проб и ошибок остается низкой.

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

2. Метод индукции. Большая часть ошибок может быть локали­зована в результате анализа алгоритма решаемой задачи, используя стратегию движения от частного к общему. В результате тестирова­ния разработчик получает данные, отражающие как правильные, так и неверные действия программы- Данные должны быть систе­матизированы и хорошо структурированы (например, представле­ны в табличной форме), с указанием симптомов ошибки, места и времени ее появления. Одновременно указываются тестовые набо­ры данных, приводящие к неверным результатам, и те, которые дают правильный результат.


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

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

3. Метод дедукции. Метод предполагает, что на основе резуль­татов тестирования выдвигается множество возможных гипотез о причине ошибки. Затем из общего списка исключаются предполо­жения, которым противоречат данные тестирования. Если в резуль­тате анализа будут исключены все выдвинутые гипотезы, то необ­ходимо с помощью тестирования собрать дополнительные данные и повторить процедуру выдвижения новых предположений о при­чине ошибки. Когда остается несколько предположений, все они тщательно анализируются, начиная с наиболее правдоподобного. Выбранная гипотеза всесторонне рассматривается и уточняется. До­казательство ее правильности осуществляется, как в предыдущем методе, и, если она оказывается верной, на ее основе находится ошибка.

4. Инверсное прослеживание логики программы. Для неболь­ших программ анализ логики выполнения программы в обратном направлении оказывается довольно эффективным способом обнару­жения ошибки. Отладка начинается с точки программы, где обна­ружен неверный результат или произошел останов программы. На основе полученных в этой точке значений переменных необходимо определить, исходя из логики программы, какие результаты долж­ны были быть при правильной работе программы. Последователь­ное продвижение к началу программы позволяет достаточно бы­стро и точно определить место (и причину возникновения) ошибки, т.е. место между оператором, где результат выполнения программы соответствовал ожидаемому, и оператором, в котором появились расхождения.


Содержание раздела