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

Приложение П.2. Методика отладки программы

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

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

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

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

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

П.2.1. Компиляция и компоновка программного проекта. Устранение синтаксических ошибок

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

  • Скомпилировать каждый файл с расширением .срр. Для этой цели в IDE Borland C++ - команду Compile | Compile имя_файла или комбинацию клавиш <Alt+F9>. Компиляцию отдельного файла удобно использовать в больших проектах, чтобы сосредоточиться на конкретном файле. При этом следует иметь в виду, что ссылки между файлами не проверяются.

  • Скомпилировать и скомпоновать все файлы проекта ("собрать" или "построить" исполняемый файл), воспользовавшись для этого в IDE Borland C++ можно использовать команды Compile | Make имя_файла эквивалентно <F9> или Compile | Build All. В результате создается исполняемый файл с расширением .ехе.

  • Можно сразу запустить приложение, выполнив в IDE Borland C++ -команду Run | Run имя_файла или по комбинации клавиш <Ctrl+F9>.

Если программный проект содержит синтаксические ошибки, то в IDE Borland C++ 3.1 при выполнении любой из представленных выше команд информация об ошибках автоматически отображается в появившемся окне Message. Каждое сообщение об ошибке или предупреждении начинается со слова "error" (ошибка) или "warning" (предупреждение), за которым следуют имя файла и номер ошибочной строки, а далее идут двоеточие и приводится краткое описание ошибки или предупреждения. Если дважды щелкнуть левой кнопкой мыши на строке с сообщением или предупреждением, то в соответствующем окне редактирования в ошибочную строку будет помещен курсор, а текст сообщения будет повторен в нижней части окна редактирования.

После устранения синтаксических ошибок следует запустить программу, выполнив команду Run | Run имя_файла либо по комбинации клавиш <Ctrl+F9> (IDE Borland C++). При этом также можно получить сообщение об ошибке (или ошибках). Это тот самый случай, когда программный проект не содержит синтаксических ошибок, а приложение не работает. Вызвано это так называемыми логическими (алгоритмическими) ошибками, для обнаружения которых можно использовать разные методы (например, закомментировать фрагменты программы).

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

П.2.2. Отладка программного проекта. Устранение логических (алгоритмических) ошибок

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

  • Пошаговое выполнение программы.

  • Просмотр значений переменных в любом месте программы.

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

Для запуска исполняемого файла в режиме отладки следует также предварительно задать точки останова (breakpoints). Предполагаем, что все операторы, предшествующие первой точке останова, выполняются правильно. Самый простой способ установки точки останова заключается в следующем. Курсор устанавливается на строку, на которой нужно остановить работу программы, и вводится комбинация Клавиш <Ctrl+F8>. Повторный ввод этой комбинации удаляет точку останова. Строка останова в окне редактирования отмечена красным цветом. Если, после задания точки останова, программу запустить по команде Run | Run, либо введя комбинацию клавиш <Ctrl+F9>, •то все операторы программы, предшествующие точке останова, будут выполняться в обычном режиме и только перед строкой останова выполнение программы приостановится. При этом строка останова сохранит подсветку, но изменит цвет подсветки.

Для пошагового выполнения в отладчике имеются следующие команды.

  • - Run | Trace over (шаг поверх) или эквивалентно <F8> - выполняет текущий оператор' или функцию и переходит к следующей строке.

  • - Run | Trace into (шаг внутрь) или эквивалентно <F7> - выполняет текущий оператор языка C++ или переходит к первому оператору вызываемой функции.

  • - Run | Go to cursor (выполнить до -курсора) или эквивалентно <F4> - выполняет программу до строки, где в текущий момент находится курсор.

Переменные, которые нужно контролировать в точке останова можно посмотреть в окне Watch. Чтобы это окно появилось в IDE и отображало значение требуемого объекта, достаточно поместить курсор на идентификатор объекта, ввести комбинацию клавиш <CtrI+F7> и в появмвшемся окне Add Watch нажать кнопку [ОК].

П.2.3. Тестирование программного проекта

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

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

Требования к контрольным примерам. Какие же требования следует предъявить к контрольным примерам? Таких требований всего два.

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

- Контрольные примеры должны быть простыми в том смысле, чтобы анализ ожидаемых результатов был несложным (примеры должны быть небольшой размерности со значениями исходных данных, удобными для анализа).

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

Структура контрольного примера. Структура контрольного примера может быть, например, следующей:

  • цель примера;

  • исходные данные (для примеров с нормальным завершением привести ссылку на листинг файла данных) или как моделировать ошибку (для примеров с аварийным завершением);

  • анализ ожидаемых результатов (для примеров с нормальным завершением - анализ ожидаемых результатов в точках останова);

  • полученные результаты, выводы (для примеров с нормальным завершением привести ссылку на листинг файла результатов).

Выбор точек останова. При выборе точек останова можно руководствоваться следующими основными правилами:

    • • точки останова следует выбирать после выполнения каждой

    • функции программного проекта (в них следует проверить результаты работы функции);

  • если декомпозиция задачи выполнена не очень удачно и функция получилась большой (более страницы текста), то следует в ее теле выбрать промежуточные точки останова, разбив тело функции на функционально законченные части;

  • если функция была отлажена ранее, то после нее точку останова выбирать не следует;

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

Методика тестирования программы для контрольных примеров с нормальным завершением.

При тестировании программы выполняются следующие шаги.

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

- Если в очередной точке останова машинные результаты отличаются от ожидаемых, то текущий сеанс отладки с помощью команды Run | Program Reset (IDE Borland C++ 3.1) прекращается. Программа повторно запускается до последней точки останова с хорошими результатами и с этого места выполняется по шагам с проверкой полученных результатов (выполняется трассировка ошибочного участка). По результатам пошаговой проверки обнаруживается ошибка и текущий сеанс отладки также прекращается. Затем в исходный текст программы вносятся необходимые исправления и трассировка ошибочного участка повторяется. Этот процесс заканчивается после исправления ошибок, о чем будет свидетельствовать получение в очередной точке останова ожидаемых результатов.