Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Вопросы ТРПП.doc
Скачиваний:
6
Добавлен:
14.09.2019
Размер:
289.79 Кб
Скачать

Автоматизированные средства отладки программ. Стандартные возможности отладчика. Контроль правильности написанной программы (этапы).Средства отладки

Помимо методик, хорошо бы иметь представление о средствах, которые помогают нам выявлять ошибки. Это:

1) Аварийная печать - вывод сообщений о ненормальном завершении отдельных блоков и всей программы в целом.

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

3) Непосредственное слежение:

  • арифметическое (за тем, чему равны, когда и как изменяются выбранные переменные),

  • логическое (когда и как выполняется выбранная последовательность операторов),

  • контроль выхода индексов за допустимые пределы,

  • отслеживание обращений к переменным,

  • отслеживание обращений к подпрограммам,

  • проверка значений индексов элементов массивов и т.д.

Нынешние среды разработки часто предлагают нам реагировать на возникающую проблему в диалоговом режиме. При этом можно:

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

  • прервать выполнение программы;

  • внести в программу изменения и повторно запустить ее (в компиляторных средах для этого потребуется перекомпилировать код, в интерпретаторных выполнение можно продолжить прямо с измененного оператора).

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

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

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

Шаг 3. Проверьте текст модуля, чтобы убедиться, что для каждого цикла существуют тесты, обеспечивающие, по крайней мере, три следующие ситуации: тело цикла не выполняется ни разу, тело цикла выполняется один раз и тело цикла выполняется максимальное число раз. Добавьте недостающие тесты.

Шаг 4. Проверьте текст модуля, чтобы убедиться, что существуют тесты, проверяющие чувствительность к отдельным особым значениям входных данных. Добавьте недостающие тесты.

Советы отладчику

1) Проверяйте тщательнее: ошибка скорее всего находится не в том месте, в котором кажется.

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

3) Тщательнее следить за объявлениями констант, типов и переменных, входными данными.

4) При последовательной разработке приходится особенно аккуратно писать драйверы и заглушки - они сами могут быть источником ошибок.

5) Анализировать код, начиная с самых простых вариантов. Чаще всего встречаются ошибки:

  • значения входных аргументов принимаются не в том порядке,

  • переменная не проинициализирована,

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

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

  • скобки в сложном выражении расставлены неправильно.

6) При упорной длительной отладке глаз "замыливается". Хороший прием - обратиться за помощью к другому лицу, чтобы не повторять ошибочных рассуждений. Правда, частенько остается проблемой убедить это другое лицо помочь вам.

7) Ошибка, скорее всего окажется вашей и будет находиться в тексте программы. Гораздо реже она оказывается:

  • в компиляторе,

  • операционной системе,

  • аппаратной части,

  • электропроводке в здании и т.д.

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

8) Убедитесь, что исходный текст программы соответствует скомпилированному объектному коду (текст может быть изменен, а запускаемый модуль, который вы тестируете - скомпилирован еще из старого варианта).

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

10) Старайтесь не жалеть времени, чтобы уясненить причину ошибки. Это поможет вам:

  • исправить программу,

  • обнаружить другие ошибки того же типа,

  • не делать их в дальнейшем.

11) Если вы уже знаете симптомы ошибки, иногда полезно не исправлять ее сразу, а на фоне известного поведения программы поискать другие ляпы.

12) Самые труднообнаруживаемые ошибки - наведенные, то есть те, что были внесены в код при исправлении других.

15) Стили программирования.

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

Работая над программой, программист, особенно начинающий, должен хорошо представлять, что программа, которую он разрабатывает, предназначена, с одной стороны, для пользователя, с другой — для самого программиста. Текст программы нужен прежде всего самому программисту, а также другим людям, с которыми он совместно работает над проектом. Поэтому для того, чтобы работа была эффективной, программа должна быть легко читаемой, ее структура должна соответствовать структуре и алгоритму решаемой задачи. Как этого добиться? Надо следовать правилам хорошего стиля программирования. Стиль программирования — это набор правил, которым следует программист (осознано или потому, что "так делают другие") в процессе своей работы. Очевидно, что хороший программист должен следовать правилам хорошего стиля:

1. Стремление к простоте. Простота проектирования программ – это первый шаг, ведущий к получению легко читаемой программы. Необычное кодирование программы (например, использование скрытых возможностей машины) часто препятствует отладки программы и конечно затрудняет ее использование другими программистами. Структура программы должна раскрывать ее логику, например, если тестовая программа имеет несколько ветвей, было бы удобно расположить части программы соответствующие каждой ветви в определенном порядке, например, по возрастанию значения параметра теста. Этот метод наиболее целесообразен поскольку именно такого решения и ожидает тот кто читает программу.

2. Чтение программы. Программу надо снабжать комментариями и параграфами.

3. Описание задач. Идеальная программа – это такая программа, которая дает точный желаемый выход при неясно сформированных требованиях пользователя. Один из путей уточнения описания требования заказчика, это проведение регулярных просмотров для координации установленных требований и действительных намерений заказчика.

4. Постановка задачи. В данном разделе надо четко определить задачу, ее цели, этапы и конечный результат. Далее программист должен переписать спецификации задачи ориентируясь на ЭВМ. Необходимо сжатое, но полное описание программы. Затем программист и заказчик должны тщательно изучить написанные спецификации задачи, чтобы быть уверенным в ее правильном понимании.

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

6. Описание данных. Другим фактором сравнимым по значению с выбором алгоритма является описание данных. Хорошо продуманное описание данных существенно сокращает программу. Так, полезно, использовать массивы данных в том случае когда это наиболее очевидный способ их организации. Другой пример такого рода – возможность использовать ссылки и указатели. Например, если нужно проследить отношения между родителями и их потомками на протяжении нескольких поколений, то легче всего это сделать с помощью ссылок и указателей.

7. Выбор языка программирования. Часто выбор языка программирования предоставлен данной выигрышной системе, или подготовкой программиста. Существуют серьезные основания для установления языковых стандартов для системы. Если применяют много разных языков для написания программ, то использование последних становится затруднительным. С другой стороны соблазн написать…

8. Универсальность. Хорошая универсальная программа должна обрабатывать вырожденные случаи (например, число элементов равно 0 ил 1) и печатать сообщения об ошибке. Тогда программа является не только универсальной, но и защищенной от ошибок. Используйте в качестве компиляторов переменные, а не константы. Если же применять константы, то при изменении параметров надо изменять в исходной программе каждый оператор, содержащий прежнюю константу. Укажем некоторые очевидные случаи, когда переменные могут быть использованы вместо констант: 1. размер таблиц, массивов, списков; 2. налоги, скидки, физические константы, проценты; 3. обозначения устройств ввода-вывода. Можно поступить и по другому, например, хранить все подлежащие изменению параметры в одном массиве. Эти параметры могут быть инициализированы в одном месте программы и достаточно полно прокомментированы.

9. Библиотеки. Чтобы повысить эффективность разработки программ, облегчить отладку и тестирование, а следовательно и сократить работу по созданию программ используйте библиотеки.

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

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

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

10. Форматы ввода/вывода. Форматы входных и выходных данных являются частью этапа проектирования, входные данные должны быть разработаны с учетом максимального удобства для пользователя и минимальные ошибки. Постоянство входных форматов, как правило, также способствуют уменьшению ошибок. Выходные спецификации могут сильно различаться. Иногда даются четкие инструкции и выходные данные подгоняются под определенный стандарт. Однако часто отсутствуют какие-либо указания и выходные данные подчас представляют собой страницы, заполненные числами без всякой идентификации. Выходная информация должна идентифицироваться без привлечения других источников. Выходные данные должны содержать: 1. идентификацию выходной информации, 2. описание записи, 3. дату, 4. нумерацию страниц. Кроме того, каждая напечатанная группа элементов должна быть помечена. При табличной форме выдачи должны быть помечены строки и столбцы.