Блок №7
Блок «Документ». Результаты работы выводятся на принтер в виде таблицы (см. Приложение №1).
1.6. Отладка программы
1.6.1. Используемые средства автоматизации отладки программ
Отладка программы - это процесс выполнения программы с целью обнаружения в ней ошибок и их устранение.
Начальный процесс отладки программы начинается с визуального контроля. Визуальный контроль - это проверка программ “ за столом “, без использования компьютера. На первом этапе визуального контроля осуществляется чтение программы, причем особое внимание уделяется следующим ее элементам:
комментариям и их соответствию тексту программы ;
условиям в операторах условного выбора ( IF, CASE ) и цикла;
сложным логическим выражениям;
возможности не завершения итерационных циклов ( WHILE, REPEAT).
Второй этап визуального контроля - сквозной контроль программы ( ее ручная прокрутка на нескольких заранее подобранных простых тестах).
Интегрированная среда разработки в Delphi предоставляет не одну возможность упростить тестирование и отладку приложения. Путь к успеху лежит через разделение процесса отладки и тестирования на два разных этапа работы над программой, и вам следует четко представлять себе, что цель тестирования – определить наличие (или отсутствие) ошибок, В то время как цель отладки – определить местоположение ошибок и устранить их. Поскольку цели этих двух этапов разработки программ различны, различны и используемые для этого методы и инструменты.
Лучший путь исключить ошибки в программе - защититься от них еще при написании кода. Надежное приложение – приложение, создаваемое с возможностью легко и просто отлаживать его. Вот основные показатели, которые помогают уменьшить количество ошибок при разработке программ.
1. Приложение должно быть хорошо организовано. Разделите программу на модули, каждый из которых выполняет определенные задачи. Например, если код, создающий отчет, разнесен по десяти модулям, время отладки такого кода увеличится даже более чем в десять раз (хотя бы за счет поиска нужной строки в десяти модулях). Конечно же, вы можете вызывать подпрограммы из других модулей, но они должны быть созданы для выполнения четко поставленной задачи. Нецелесообразно размещать одну половину выполняемой операции в процедуре в одном модуле, а вторую половину – в другой процедуре (тем более— в другом модуле).
2. Если процедура не может переварить некорректные данные и вызвать тем самым крах всей системы, проверьте целостность входных данных, прежде чем работать с ними.
3. Используйте отладочный вариант вашей программы. В отладочной версии программы содержится дополнительный код, цель которого — отследить выполнение программы, убедиться в корректности ее работы и упростить отладку вашего приложения.
Delphi позволяет очень легко внести тестовый и отладочный коды в приложение. Один из путей – использовать в приложении два алгоритма одновременно (быстрый, но рискованный, и медленный, но проверенный), затем сравнить результаты работы обоих алгоритмов. Конечно же, этот вариант используется только в бета-версии, и после всестороннего тестирования, если все работает отлично и без сбоев, в конечной версии продукта останется только быстрый (и после такого тестирования – уже не рискованный) метод.
На этом этапе наиболее часто используемыми средствами для отладки программы являлись:
1. Пошаговая отладка
Одна из самых распространенных задач отладки – выполнение программы шаг за шагом, по одной строке за раз для проверки правильности выполнения. При пошаговом прохождении кода отладчик выводит окно редактирования с выполняемой программой. Точка выполнения, показывающая следующую выполняемую строку программы, представляется в виде зеленой стрелки, расположенной слева от области исходного текста в окне редактирования.
После успешной компиляции модуля на полосе отладочной информации каждая строка кода, внесшая свой вклад в модуль, будет отмечена маленьким, синим кружком. Если же строка не помечена, значит, здесь поработал оптимизатор. Поскольку для таких строк выполняемый код не сгенерирован эти строки не будут помечены точкой выполнения.
Просмотр значений переменных
При пошаговом прохождении программы в отладчике вы, несомненно, захотите узнать, что содержится в различных переменных. Для этого можно использовать окно просмотра переменных Watch List, которое предоставляет возможность пассивно просматривать содержимое одной или нескольких переменных, или диалоговое окно Evaluate/Modify, позволяющее работать только с одной переменной (в нем можно не только просмотреть, но и изменить ее содержимое).
Установка точек останова
Точка останова (breakpoint) — своеобразный знак STOP для отладчика (на полосе слева в окне редактора она и выглядит как маленький красный значок). Когда приложение запущено под отладчиком и доходит до строки, в которой находится точка останова, оно прекращает работу и ждет ваших дальнейших распоряжений. Такие точки могут быть условными и безусловными. Отладчик всегда останавливается на точке безусловного останова и может останавливаться в точке условного останова, когда выполнено условие. Интегрированный отладчик Delphi поддерживает два типа условий — логическое и по количеству проходов.
1.6.2. Трансляция и синтаксическая отладка
На этом этапе происходит статический контроль- это проверка программы по ее тексту (без выполнения) с помощью инструментальных средств. Наиболее известной формой статического контроля является синтаксический контроль программы с помощью компилятора, при котором проверяется соответствие текста программы синтаксическим правилам языка программирования. Сообщения компилятора обычно делятся на несколько групп в зависимости от уровня тяжести нарушения синтаксиса языка программирования:
- информационные сообщения и предупреждения, при обнаружении которых компилятор, как правило, строит корректный объектный код и дальнейшая работа с программой (компоновка, выполнение) возможна (тем не менее сообщения этой группы также должны тщательно анализироваться, так как их появление также может свидетельствовать об ошибке в программе - например, из-за неверного понимания синтаксиса языка);
- сообщения об ошибках, при обнаружении которых компилятор пытается их исправить и строит объектный код, но его корректность маловероятна и дальнейшая работа с ним скорее всего не возможна;
- сообщения о серьезных ошибках, при наличии которых построенный компилятором объектный код заведомо некорректен и его дальнейшее использование невозможно;
- сообщения об ошибках, обнаружение которых привело к прекращению синтаксического контроля и построения объектного кода.
Однако, практически любой компилятор пропускает некоторые виды синтаксических ошибок. Место обнаружения ошибки может находиться далеко по тексту программы от места истинной ошибки, а текст сообщения компилятора может не указывать на истинную причину ошибки. Одна синтаксическая ошибка может повлечь за собой генерацию компилятором нескольких сообщений об ошибках (например, ошибка в описании переменной приводит к появлению сообщения об ошибке в каждом операторе программы, использующем эту переменную).
Второй формой синтаксического контроля может быть контроль структурированности программ, то есть проверка выполнения соглашений и ограничений структурного программирования. Примером подобной проверки может быть выявление в тексте программы ситуаций, когда цикл образуется с помощью оператора безусловного перехода (использования оператора GOTO для перехода вверх по тексту программы ). Для проведения контроля структурированности могут быть созданы специальные инструментальные средства, а при их отсутствии эта форма статического контроля может совмещаться с визуальным контролем (см. пункт 1.5.1.).
Третья форма статического контроля - контроль правдоподобия программы, то есть выявление в ее тексте конструкций, которые хотя и синтаксически корректны, но скорее всего содержат ошибку или свидетельствуют о ней. Основные неправдоподобные ситуации :
- использование в программе неинициализированных переменных (то есть переменных, не получивших начального значения) ;
- наличие в программе описаний элементов, переменных, процедур, меток, файлов, в дальнейшем не используемых в ее тексте;
- наличие в тексте программы фрагментов, никогда не выполняющихся;
- наличие в тексте программы переменных, ни разу не используемых для чтения после присваивая им значений;
- наличие в тексте программы заведомо бесконечных циклов ;
Даже если присутствие в тексте программы неправдоподобных конструкций не приводит к ее неправильной работе, исправление этого фрагмента повысит ясность и эффективность программы, т. е. благотворно скажется на ее качестве.
Для возможности проведения контроля правдоподобия в полном объеме также должны быть созданы специальные инструментальные средства, хотя ряд возможностей по контролю правдоподобия имеется в существующих отладочных и обычных компиляторах.
Следует отметить, что создание инструментальных средств контроля структурированности и правдоподобия программ может быть существенно упрощено при применении следующих принципов:
1) проведение этих дополнительных форм статического контроля после завершения компиляции и только для синтаксически корректных программ ;
2) максимальное использование результатов компиляции программы и, в частности, информации, включаемой в листинг компилятора;
3) вместо полного синтаксического разбора текста проверяемой программы построение для нее списка идентификаторов и списка операторов с указанием всех их необходимых признаков.
При отсутствии инструментальных средств контроля правдоподобия эта фаза статического контроля также может объединяться с визуальным контролем (см. пункт 1.5.1.).