Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
мет_указ_лр_ПИ_б3.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
1.8 Mб
Скачать

Лабораторная работа №5.

Отладка и тестирование

Цель работы:

  1. Выполнение программы по шагам;

  2. Научиться определять и использовать точки прерывания;

  3. Научиться контролировать значения переменных в ходе работы программы;

  4. Научиться создавать протокол работы программы.

Содержание работы:

  1. Прочитать дополнительный материал и выполнить указанные задания.

  2. Оформить отчет.

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

Дополнительные сведения и задания

Отладка. Виды ошибок

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

Система Delphi 5 предоставляет средства отладки, которые ориентированы на программистов любой квалификации.

Ошибки:

  • Синтаксические

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

  • Логические

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

ЗАДАНИЕ 1

Настроить компилятор для отладки

В настройках проекта — соответствующее диалоговое окно вызывается командой Project -> Options (Проект -> Настройки) — на вкладке Compiler (Компилятор) надо выполнить следующие действия:

  • На панели Code generation (Генерация машинного кода) сбросьте флажок Optimization (Оптимизация). Когда компилятор создает оптимизированный код, он нередко вносит существенные улучшения в детали алгоритма, реализованного на Паскале.

  • На панели Runtime errors (Ошибки времени выполнения) должны быть установлены флажки Range checking (Контроль выхода индекса за границы массива), I/O Checking (Контроль ошибок ввода/вывода) и Overflow checking (Контроль переполнения при целочисленных операциях). Так как все типы Паскаля имеют строго ограниченные диапазоны, то, например, при сложении двух чисел, близких к максимально допустимому значению, получится число, которое не укладывается в этот диапазон. Последний флажок позволяет обнаруживать такие ошибки.

  • На панели Debugging (Отладка) установите флажки Debug information (Добавление отладочной информации), Local symbols (Просмотр значений локальных переменных), Reference info (Просмотр структуры кода), Assertions (Включение процедуры Assert в машинный код) и Use Debug DCUs (Использование отладочных версий стандартных модулей библиотеки компонентов VCL).

Без отладочной информации отладка программы в среде Delphi 5 вообще невозможна. Процедура Assert выполняет отладочные функции. В заключительной версии программы она, как правило, не нужна, а удалять ее вызовы из исходного текста неудобно — их могут насчитываться сотни. Отключить генерацию машинного кода для этой процедуры можно с помощью флажка Assertions. Отладочные версии стандартных модулей содержат дополнительные режимы проверки корректности работы с компонентами Delphi 5.

В отчете по выполнению ЗАДАНИЯ 1 указать результаты выполненных действий (в виде рисунка окна настройки), а также пояснить значение процедуры Assert.

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

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

Выполнение по шагам

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

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

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

Ставится точка прерывания нажатием клавиши F5 или щелчком мыши на синем маркере. При этом соответствующая строка выделяется красным цветом. Снимается точка прерывания аналогичным способом.

Далее выполнение можно продолжить по шагам. Для этого используется команда Run -> Step Over (Запуск -> Перешагнуть) или клавиша F8.

Полностью остановить работу программы можно с помощью команды Run -> Program Reset (Запуск -> Сброс программы) или комбинацией клавиш Ctrl+F2.

Чтобы пропустить выполнение группы операторов, можно использовать команду Run -> Run to Cursor (Запуск -> Выполнение до курсора) или клавишу F4.

Продолжить выполнение программы (не по шагам) можно с помощью команды Run (Запуск) или клавиши F9.

Просмотреть список всех установленных точек прерывания можно с помощью команды View -> Debug Windows -> Breakpoints (Вид -> Окна отладки -> Точки прерывания).

Если в момент, когда программа остановлена, выполнялись какие-то действия по просмотру файлов и текущее место остановки было потеряно, быстро вернуться к нему поможет команда Run -> Show Execution Point (Запуск -> Показать точку выполнения).

ЗАДАНИЕ 2

В отчете по ЗАДАНИЮ №2 дать определение точки прерывания, а также записать основные используемые команды для работы с точкой прерывания и пояснить их.

Просмотр значений

Когда во время работы программы приходится контролировать множество значений разных переменных, использовать для этой цели мышь неэффективно. Система Delphi 5 позволяет помещать переменные в специальное окно, где наряду с их именами показываются также и текущие значения. При выполнении программы по шагам переключаться между этим окном и окном редактора неудобно, поэтому в контекстном меню окна списка переменных имеется пункт Stay on Top (Поверх других окон). Если его включить, это окно будет во время отладки располагаться выше всех остальных окон, что позволяет следить за изменениями переменных при пошаговом выполнении программы.

Добавление новых переменных в такое окно осуществляется с помощью команды Run -> Add Watch (Запуск -> Добавить слежение) или нажатием клавиш CTRL+F5. В появившемся окне Watch Properties (Свойства слежения) имя переменной вводится в поле Expression (Выражение). Можно следить за изменениями не только отдельных переменных, но и за значениями целых выражений, например х+у или i-5.

В нижней части окна Watch Properties имеется ряд переключателей, с помощью которых можно указать тип результирующего значения (например переменная может иметь тип Integer, а показывать требуется символ, соответствующий этому значе­нию). По умолчанию считается, что показываться будет значение, имеющее тот же тип, что и переменная — переключатель Default (По умолчанию).

В поле Repeat Count (Число элементов) указывается, сколько элементов массива будут отображаться. Например, можно указать элемент массива Arr[3] и число элементов, равное 5. Тогда при выполнении программы по шагам в этом поле будут отображаться через запятую значения пяти элементов, начи­ная с Arr[3]: Arr[3], Arr[4], Arr[5], Arr[6], Arr[7].

В поле Digits (Разрядность) задается число значащих цифр после запятой, которые будут выводиться для чисел дробных типов.

С помощью переключателя Enable (Включено) можно временно отключать контроль значений некоторых переменных списка.

Флажок Allow Function Calls (Разрешить вызов функций) допускает использование в выражениях вызовов функций. Например, выражение IntToStr(Arr[3]) будет показы­вать текстовое представление значения, хранящегося в элементе Arr[3].

Содержимое переменной, тип которой основан на записи (record), отображается в виде, принятом для инициализации записей:

имя-поля : значение;

Значение точки Р в методе FormMouseUp будет показано так:

Р: (х: 129; у: 312)

Чтобы отредактировать выражение, ранее введенное в список, надо дважды щелкнуть на нем. Удаление выражение производится нажатием клавиши DELETE. В контекстном меню окна слежения имеются также пункты Delete All Watches (Удалить все элементы), Disable All Watches (Отключить все элементы), Enable All Watches (Включить все элементы), позволяющие, соответственно, удалить, временно выключить или включить все элементы.

Просмотр и изменение значений

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

Чтобы обойти ошибку, неверное значение можно исправить вручную. Это делается в окне быстрого просмотра значений, которое открывается командой Run -> Evaluate/Modufy (Запуск -> Определить/Изменить) или комбинацией клавиш CTRL+F7.

В поле Expression (Выражение) вводится вычисляемое выражение. По щелчку на кнопке Evaluate (Вычислить) в поле Result (Результат) появится его значение. Это поле (панель) сделано таким большим, потому что в нем отображаются не только отдельные значения, но и массивы, и записи. В поле New value (Новое значение) выводится измененное значение. С помощью кнопки Watch (Следить) выражение, указанное в поле Expression (Выражение), можно добавить в окно слежения.

Просмотр и анализ кода

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

Навигатор проекта (Project Browser) вызывается командой View -> Browser (Вид -> Навигатор).

Если нажата кнопка Globals (Глобальные объекты), то в левой части окна (это Инспектор проекта) отображаются списки используемых в программе классов, типов, свойств, методов, переменных и подпрограмм. Детально настроить способ отображения каждого элемента можно, выбрав в контекстном меню Навигатора пункт Properties (Свойства).

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

Если нажата кнопка Units (Модули), отображаются все модули со взаимными ссылками и входящие в них переменные.

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

Для быстрой навигации по коду в системе Delphi 5 имеются еще два метода:

  1. Чтобы переключаться между описаниями подпрограммы в интерфейсном разделе и разделе реализации, надо, находясь внутри описания подпрограммы, использовать комбинации клавиш CTRL+SHIFT+UP и CTRL+SHIFT+DOWN.

  2. Чтобы отметить некоторое место в тексте, надо сформировать для него закладку — нажать комбинацию клавиш CTRL+K и затем цифру от 0 до 9. При этом на внутренней кайме редактора появится зеленый пря­моугольник с номером закладки.

В дальнейшем вернуться к нужной закладке можно, нажав комбинацию клавиш CTRL+номер закладки (например CTRL+1).

В правой части окна расположен Проводник объектов (Symbol Explorer). Его также можно вызвать командой Search -> Browse Symbol (Поиск -> Выбор объекта) или непосредственно из редактора, наведя указатель на переменную и выбрав в контекстном меню пункт Browse Symbol at Cursor (Выбрать объект под указателем).

Этот Проводник показывает подробную информацию об объекте, выбранном на левой панели Навигатора проекта. На панели Scope (Область видимости) отображается список идентификаторов, объявленных внутри класса или модуля, на панели Inheritance (Наследование) — локальная иерархия в рамках текущего проекта для выбранного класса, на панели References (Ссылки) — список имен файлов и номеров строк в исходном тексте, где описан соответствующий идентификатор. Чтобы перейти к его описанию, надо выполнить двойной щелчок на нужном имени в Проводнике.

Навигация по коду

Порой разработчик забывает, что означает тот или иной класс или определение. Можно обратиться к справочной системе, но профессиональным программистам обычно удобнее взглянуть на реализацию конкретного определения внутри системы Delphi 5 (в стандартной библиотеке VCL). Для этого служит технология навигации по коду. Находясь в редакторе, надо нажать и удерживать клавишу CTRL, переместив при этом указатель к нужному определению. Курсор примет вид указательного пальца, а расположенный под ним идентификатор, если он доступен для просмотра, выделяется синим цветом и подчеркиванием. Теперь достаточно щелкнуть на нем, и редактор переключится в файл в котором хранится нужное определение.

Автоподсказки.

В системе Delphi 5 реализовано несколько типов автоподсказок. Они включаются и выключаются в диалоговом окне настроек редактора, которое открывают с помощью пункта Properties (Свойства) в контекстном меню. Для этого используются флажки, расположенные на вкладке Code Insight (Анализ кода).

Флажок Code completion (Автозавершение) помогает при вводе членов класса. Когда в редакторе набирается название класса и ставится точка, система отображает список методов этого класса. Подходящий метод можно выбрать с помощью курсорных клавиш без ручного ввода).

Флажок Code parameters (Параметры вызова) упрощает ввод параметров для метода. Когда введено имя метода и поставлена открывающая скобка, система Delphi 5 подскажет тип следующего параметра.

Флажок Tooltip expression evaluation (Быстрое вычисление значений) рекомендуется всегда держать установленным. В этом случае во время отладки значения переменных отображаются во вплывающем окне при наведении указателя.

Флажок Tooltip symbol insight (Информация об описании) управляет отображением всплывающей подсказки, которая поясняет, в каком модуле соответствующий идентификатор описан и какой тип имеет.

С помощью движка Delay (Задержка) устанавливается величина задержки перед появлением всплывающих подсказок (от 0,5 до 1,5 с).

ЗАДАНИЕ 3

В отчете по ЗАДАНИЮ 3 привести рисунок навигатора проекта, указать, с помощью какой команды вызывается навигатор проекта.

Также указать методы быстрой навигации по коду в системе Delphi 5 (не менее 3).

Привести рисунок диалогового окна настроек редактора, в котором включаются и выключаются автоподсказки. Указать значения флажков, расположенных на вкладке Code Insight (Анализ кода).

Расширенные средства отладки

Прерывание по условию

Когда выполняется длинный цикл, многократно нажимать клавишу F8 очень неудобно. Чтобы прервать работу цикла точно в нужный момент, к точке прерывания, установленной внутри цикла, надо добавить условие, при котором эта точка сработает. Надо поместить курсор на строку с оператором и выполнить команду Run -> Add Breakpoint ->Source Breakpoint (Запуск -> Добавить точку прерывания -> Исходная точка прерывания). На экране появится диалоговое окно Add Source Breakpoint (Добавление исходной точки прерывания).

Поле Condition – поле условия. В нем нужно указать выражение (например, i=3), с помощью которого работа программы прервется, если будет выполнено условие.

Можно также задать число повторов выполнения конкретной строки программы в поле Pass count (Число проходов). Перед первым проходом это число равно нулю, поэтому если оставить значение 0, предлагаемое по умолчанию, то программа прервется перед первым выполнением отмеченного оператора.

ЗАДАНИЕ 4

В отчете по ЗАДАНИЮ 4привести рисунок диалогового окна Add Source Breakpoint (Добавление исходной точки прерывания), указать команду его вызова.

Организация точек прерывания в группы

Эта новая возможность Delphi 5 позволяет объединить несколько точек прерывания в группу. Название группы вводится в поле Group (Группа) при установке точки прерывания. Подобный подход хорош тем, что позволяет выполнять схожие действия над целыми группами точек остановки — одновременно включать или выклю­чать все точки, входящие в группу с помощью раскрывающихся списков Enable Group (Включить группу) и Disable Group (Выключить группу). Это позволяет избежать путе­шествия по разным файлам в редакторе для поиска нужных строк и ручного переключения точек прерывания. Немаловажно, что при этом не происходит физического удаления точек.

Просмотр списка всех точек прерывания выполняется с помощью команды View -> Debug Windows -> Breakpoints (Вид -> Окна отладки -> Точки прерывания). На экране появляется окно, в котором отображается следующая информация.

  • Столбец Filename (Имя файла) указывает имя файла, в котором установлена точка прерывания.

  • Столбец Line (Строка) содержит номер строки, в которой установлена точка. О Столбец Condition (Условие) отображает условие активизации данной точки.

  • Столбец Action (Действие) показывает действие, выполняемое дополнительно (см. ниже).

  • Столбец Pass Count (Число проходов) указывает, сколько раз во время работы программы встретилась данная точка.

  • В столбце Group (Группа) приводится название группы, к которой относится точка.

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

Действия

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

  • Флажок Break (Прерывание) отвечает за обычное прерывание работы программы.

  • Флажок Ignore subsequent exceptions (Игнорировать последующие исключительные ситуации) обеспечивает отключение всех исключительных ситуаций, возникающих при попытке выполнения ошибочных действий в программе. Это относится как к очевидным ситуациям, типа деления на ноль, так и к таким, как неверные преобразования типов и прочее.

  • Флажок Handle subsequent exceptions (Обрабатывать последующие исключительные ситуации), наоборот, включает поддержку всех исключительных ситуаций.

ЗАДАНИЕ 5

В отчете по ЗАДАНИЮ 5 привести рисунок диалогового окна, в котором можно просмотреть список всех точек прерывания. Указать команду, с помощью которой вызывается это окно.

Ведение протокола работы

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

Новая, очень полезная возможность системы Delphi 5 — это ведение протокола событий (log). Информация о состоянии различных объектов программы в определенных точках записывается в специальный протокол, который затем просматривается и анализируется. На его основе удается подчас обнаружить логические ошибки и некорректности, которые очень трудно выявить при пошаговой отладке и тестировании. Поддерживать ведение протокола также полезно в готовых программах, когда пользоваться встроенным отладчиком Delphi 5 невозможно и остается только анализировать выдаваемый программой протокол работы, чтобы определить, в каком месте произошла ошибка.

В протокол может записываться информация двоякого рода. Если в ходе задания параметров точки прерывания в поле Log message (Сообщение для протокола) введена какая-либо текстовая строка, то когда программа во время своей работы встретит соответствующую точку прерывания, она запишет эту строку в протокол. Можно также указать произвольное выражение в поле Eval expression (Вычислить выражение). По достижении точки прерывания соответствующее выражение будет вычислено и, если установлен флажок Log result (Записать результат в протокол), занесено в протокол.

Если флажок сброшен, то записи значения выражения в протокол не произойдет. Зачем это надо? В ранних языках программирования встречались неточности в их описании или неверные реализации различных конструкций языка на уровне компиляторов. Это приводило к так называемым «побочным эффектам» и позволяло программистам использовать «черные ходы», добиваясь нужного результата неявным способом. Такая практика давно осуждена, и в современных реализациях попу­лярных языков программирования подобных «дырок», конечно, нет. Все же в исключительных ситуациях, в особо тяжелых отладочных случаях полезна возможность, для примера, «на лету», без остановки работы откорректировать значение какого-то ошибочно измененного свойства, чтобы не мешать текущему выполнению программы. Именно для создания побочных эффектов и предназначена возможность системы Delphi 5 вычислять выражения без записи их в протокол.

В программе нужно выполнить команду Run -> Add Breakpoint -> Source Breakpoint (Запуск -> Добавить точку прерывания -> Исходная точка прерывания). Если теперь запустить программу, то работа программы не прервется, но будет сформирован протокол, который можно в любой момент просмотреть из оболочки Delphi 5. Для этого используется команда View -> Debug Windows -> Event Log (Вид -> Окна отладки -> Протокол событий) или комбинация клавиш CTRL+ALT+V.

Окна протокола можно гибко настраивать на вывод нужной информации. С помощью контекстного меню — пункт Properties (Свойства) — включается или отключается вывод следующей информации.

  • Сообщения о встретившейся точке прерывания и выводимая ей информация относятся к категории Breakpoint messages (Сообщения точки прерывания). Если установлен флажок Display process info with event (Отображать также сведения о процессе), то дополнительно выводится информация о процессе Windows, который сгенерировал соответствующее сообщение.

  • Сообщения об обращении отлаживаемого приложения к системным программам и библиотекам Windows относятся к категории Process messages (Сообщения процессов).

  • Сообщения, выводимые в точках прерывания — поля Log message (Сообщение для протокола) и Eval expression (Вычислить выражение) — входят в категорию Output messages (Сообщения вывода).

  • Получаемые программой сообщения Windows входят в категорию Windows messages (Сообщения Windows). Их может быть очень много, поэтому злоупотреблять данной возможностью не стоит.

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

Лабораторная работа №6