
- •Методические указания
- •Часть 2
- •Лабораторна робота № 1
- •Загальні зведення про компоненти для розробки меню команд і вбудовування малюнків та значків на форму програми
- •Лабораторная работа № 2
- •Лабораторная работа № 3
- •Общие сведения о видах команд отладки для поиска
- •Лабораторная работа № 4
- •Общие сведения
- •2. Постановка задач лабораторной работы
- •Лабораторная работа № 5
- •Общие сведения о компонентах, инструментах для рисования
- •Лабораторная работа № 6 Обработка событий мышки в приложении Windows
- •1. Общие сведения о событиях мышки
- •2. Постановка задачи лабораторной работы.
- •3. Порядок действий и команд при выполнении работы.
- •Лабораторная работа № 7
- •Результат работы программы
- •Лабораторная работа № 8
- •Шаг 4. Установите на форму компоненты ListView1 и ListView2 , как это показано рис.3.
- •Лабораторная работа № 9
- •Лабораторная работа № 10
Лабораторная работа № 3
Работа с отладчиком программ С++ Builder
Общие сведения о видах команд отладки для поиска
ошибок в кодах программного модуля
Компиляция приложения может выполняться несколькими способами. Вариант первый. Компиляция с последующим выполнением приложения осуществляется командой Run/Run, или соответствующей быстрой кнопкой, или «горячей » клавишей F9. В этом случае производится компиляция программы, ее компоновка, создается выполняемый модуль .exe и он запускается на выполнение. Создание модуля .exe и выполнение будет проводиться только в случае, если при компиляции и компоновке не обнаружены ошибки.
В процессе компиляции и компоновки на экране активизируется окно состояния процесса компиляции. Верхняя строка окна показывает имя компилируемого проекта. В следующей строке отображается текущая обработка: компиляция определенного модуля или компоновка(Linking). В строке ниже отображается текущая строка модуля(Current line), обрабатываемая компилятором, и общее число строк в модуле(Total lines). В самой нижней строке отображается обнаруженное на данный момент число замечаний(Hints), предупреждений(Warnings) и ошибок(Errors). Клавиша Cancel внизу окна позволяет прервать процесс компиляции и компоновки.
Если в компилируемом файле встретились неисправимые ошибки, выполняемый файл на будет создан. Если ошибок нет, файл создается, но и в этом случае у компилятора могут быть предупреждения и замечания, которые необходимо внимательно изучить. При компиляции проекта, состоящего из нескольких модулей, компилируются только те модули, тексты которых были изменены с момента предыдущей компоновки проекта. Это существенно экономит время компиляции.
Вариант второй. При выполнении команды Run можно задать командную строку, если в приложении предусмотрено передача каких-то параметров. Для этого надо выполнить команду Run/Parameters и в открывшемся окне написать требуемую командную строку.
Не всегда надо компилировать проект и тут же выполнять. Часто важнее просто проверить, не содержат ли последние изменения кода каких-то ошибок. В этом случае не имеет смысла терять время на выполнение проекта и лучше воспользоваться другими командами меню: Project/Compile Unit, Project/Make Project или Project/Build Project.
Вариант третий. Команда Compile выполняет компиляцию только того модуля, который выделен в окне Редактора Кода или в Менеджере Проектов. Эта команда позволяет наиболее быстро проверить наличие ошибок или замечаний при компиляции модуля, так как не осуществляется компоновка программы и не компилируются никакие другие модули. Если компиляция прошла успешно, создается объектный файл .obj откомпилированного модуля.
Вариант четвертый. Команда Make выполняет компиляцию всех тех модулей, тексты которых были изменены с момента предыдущей компоновки проекта. Если компиляция прошла успешно, то создаются объектные файлы модулей .obj и осуществляется компоновка программы. Если и она прошла, то создается выполняемый модуль .exe. Таким образом отличие Make от Run только в том, что после компоновки не производится выполнение приложения.
Команда Build подобна команде Make за одним исключением – компилируются все модули, независимо от того, когда они в последний раз изменялись. Выполнение этой команды требует наибольшего времени.
Помимо описанных команд компиляции имеется еще две: Project/Make All Projects и Project/Build ALL Projects. Они подобны рассмотренным командам Make и Build, но используются при работе с группой проектов и относятся не к одному, а ко всем проектам группы.
Если в процессе компиляции обнаружена ошибка, то это активизирует окно с сообщениями о найденных ошибках компиляции. Обычно окно с сообщениями открывается в нижней части окна редактора кодов. Окно сообщений является встраиваемым окном и его можно вытянуть из окна редактора и сделать самостоятельным окном или встроить, например, в окно Инспектора Объектов. Наиболее удобно встраивать окно с сообщениями об ошибках в окно Редактора Кодов. Если при манипуляциях встраивания окно «сообщений» потеряно, то нужно в окне Редактора Кодов щелкнуть правой клавиши мыши и выполнить команду Message View. Ошибка компиляции также вызывает появление выделения цветом строки модуля, который компилируется.
В интегрированной рабочей среде С++ Builder5 имеется набор таких средств для отладки программных модулей:
Мастер оценки выражений – Tooltip Expression Evaluation. Этот мастер позволяет подвести курсор мыши к идентификатору переменной и на экране появляется числовое значение этой переменной. Таким способом можно узнать значения переменных программы в данный момент. Некоторые переменные не удается наблюдать, потому что оптимизирующий компилятор удалил их из результирующего кода. Этот инструмент позволяет контролировать только отдельные переменные;
Окно наблюдений – Watch List. Этот инструмент обеспечивает возможность видеть значения нескольких переменных сразу, чтобы их можно было сравнить и понять причину ошибки кода. Для открытия окна
Watch List нужно выполнить команды View/Debug Windows/Watches. Также достаточно подвести курсор мыши к переменной и нажать Ctrl+F5.При этом окно наблюдения автоматически откроется и в нем появится имя переменной и ее значение(значение переменной будет видно только при остановке выполнения приложения и переходе в ИСР С++ Builder).Затем можно подвести курсор к другой переменной, опять нажать Ctr+F5 и в окне наблюдений появится новая строка. Более того можно выделить курсором какое-то выражение, нажать Ctr+F5 и в окне наблюдения увидеть значение этого выражения.
Иногда переменные не удается наблюдать, потому что оптимизирующий компилятор удалил их из результирующего кода и поместил соответствующие значения в системные регистры. Это ускоряет выполнение вычислений в приложении, экономит память, но препятствует наблюдению переменных в процессе отладки. В таких случаях можно объявить соответствующую переменную с ключевым словом volatile. Например: volatile int x1; .
Спецификатор volatile говорит компилятору, что данную переменную нельзя хранить в регистре. В этом случае другой лучший вариант достичь той же цели – выполнить команду Project/Options и в открывшемся окне на странице Advanced Compiler выключить опцию Register Variables. Обязательно после отладки оба эти варианта нужно убрать, чтобы не снижать эффективность работы приложения.
Если перейти в окно наблюдений и там щелкнуть правой клавишей мыши, то во всплывшем меню выбрать такие команды, в частности Edit Watch(отредактировать наблюдаемое выражение) или AddWatch(вставить новое наблюдаемое новое выражение). В обоих случаях активизируется окно Watch Properties , которое также можно открыть через Ctrl+F5.
В поле редактирования Expression можно записать имя любой переменной или любое выражение, содержащее переменные, константы, функцию. Поле редактирования Repeat count используется при наблюдении массивов и позволяет задать число наблюдаемых элементов массива. Например, если имеется в программе массив Х[], то можно просто указать в поле Expression имя массива Х .Тогда в окне наблюдений будут отображаться все элементы массива Х. Но можно указать в поле Expression имя элемента Х[0] , а в поле Repeat count написать , например,5. Тогда в окне наблюдений будут отображаться только первые 5 элементов массива.
Поле редактирования Digits определяет число выводимых значащих разрядов чисел с плавающей запятой. Индикатор Enabled позволяет отключить вывод в окно наблюдений соответствующего выражения во время выполнения приложения. Это повышает производительность процесса выполнения. После того, как приложение остановлено и нужно все-таки посмотреть данное выражение в окне наблюдения, то выделите его в окне и сделайте на нем двойной щелчок. Откроется окно Watch Properties с загруженным в него выражением и затем нужно включить индикатор Enabled и щелкнуть ОК.
Индикатор Allow Side Effects разрешает или запрещает отображение таких выражений, которые способны вызвать побочные эффекты. Например, можно записать в поле Expression выражение ++А. Если индикатор Allow Side Effects выключен(он выключен по умолчанию), то в окне наблюдений рядом с выражением ++А покажется текст:”Side effects are not allowed”(побочные эффекты запрещены), такт как действительно сначала будет изменение на 1 значения А и после этого будет показано отличающееся значение А.
Радиокнопки в нижней части окна Watch Properties задают формат вывода значения переменной или выражения. По умолчанию включена кнопка Default. В этом случае формат определяется автоматически по типу отображаемого выражения. Но можно выбрать и другой формат. Например, можно воспользоваться этими радиокнопками, чтобы отображать некоторую целую переменную один раз в десятичном виде, а другой раз – в шестьнадцатиричном виде.
Выпадающий список в поле редактирования Expression позволяет выбрать выражение из тех, которые использовались ранее и при необходимости его отредактировать. Например, если нужно вывести значения Form1->Label1->Caption, Form2->Label2->Caption, Form3->Label3->Caption , то достаточно один раз написать это выражение, а в дальнейшем брать его из выпадающего списка и только изменять в нем цифру.
Окно оценки и модификации Evaluate/Modify. Это окно позволяет в процессе отладки не только наблюдать, но и изменять значения переменных. Сделать это окно видимым можно командой Run/Evaluate/Modify. Соответственно команду Debug/ Evaluate/Modify можно также выбрать из контекстного меню, всплывающего при щелчке правой клавишей мыши в окне Редактора Кода.
В верхнем поле Expression задается имя переменной или выражение. После этого нужно щелкнуть кнопку Evaluate и в поле Result появится текущее значение. Если в поле Expression задано имя переменной, то становится доступной кнопка Modify позволяющая изменить значение, т.е. можно вмешаться в процесс выполнения приложения путем задания нового значения в поле New value и затем необходимо нажать кнопку Modify. В результате значение переменной в приложении изменится, что можно видеть в поле Result. Также изменится значение в окне наблюдений – Watch List если в него перейти.
Трассировка приложения по шагам. Выше рассмотрены окна, которые позволяют видеть статическую информацию в момент, когда произошла ошибка или остановлено выполнение приложения. Но не всегда такая информация дает полную картину происходящего в программе. Часто, чтобы найти причину ошибки в программе, надо выполнить по шагам какой-то фрагмент (кусочек) программы, наблюдая за изменениями переменных при выполнении каждой команды.
Для прохода фрагмента программы по шагам можно использовать такие команды:
7Команда |
«Горячие» клавиши |
8Действие команды |
Step Over (По шагам без захода в ….) |
F8 |
Пошаговое выполнение строк программы, считая вызов функции за одну строку, т.е. вход в функцию не выполняется |
Trace Into (Трассировка с заходом в ...) |
F7 |
Пошаговое выполнение строк программы с заходом в вызываемые функции |
Trace to Next Source Line (Трассировка до следующей строки) |
Shift+F7 |
Переход к следующей исполняемой строке программы |
Run toCursor (Выполнить до курсора) |
F4 |
Выполняется программа до того места (выполняемого оператора), где стоит курсор в окне редактора кода |
Run Until Return (Выполнить до выхода из функции) |
Shift+F8 |
Выполнение программы до выхода из вызванной функции с остановкой на операторе, следующем за вызовом функции |
Show Execution Point (Показать точку выполнения) |
- |
Помещается курсор на оператор, который будет выполняться следующим |
При трассировке фрагмента программы изменения значений наблюдаются в окне Watches. Для удобной работы нужно встроить окно Watches в окно Инспектора Объектов, его активизировать щелчком на корешке закладки и задать список наблюдаемых переменных.
Точки прерывания(breakpoint). Мощным инструментом отладки приложения является расстановка точек прерываний в программе. Чтобы ввести простую (безусловную) точку прерывания, достаточно в окне Редактора Кода щелкнуть мышью на полоске левее кода требуемой строки программы. Строка программы окрашивается в красный цвет и на полоске слева появится красная точка. Преимущество точек прерывания заключается в том, что их можно одновременно указать множество в разных местах программы и в разных модулях. Приложение выполняется до тех пор, пока управление не перейдет к первой точке прерывания.
Для того чтобы убрать точку прерывания, достаточно щелкнуть мышью на красной точке левее кода , отмеченного точкой прерывания. Точки прерывания можно устанавливать только на выполняемых операторах. Если, например, установить прерывание на строке объявления переменной, то в момент запуска приложения в красной точке появится крестик. Так С++ Builder предупреждает, что прерывания не будет, оператор не выполняемый. Аналогичный крестик появляется и в том случае, если компилятор в процессе оптимизации кода убрал его из кода и разместил в регистрах.
С++ Builder дает возможность уточнить условия прерывания. Задержите курсор над красной точкой слева в строке, где задано прерывание. В результате всплывет ярлычок с характеристикой данной точки прерывания. По умолчанию никаких условий останова не задается.
Например, нужно задать точку прерывания и определить условие, останов должен происходить на 10 цикле выполнения оператора цикла. Для этого устанавливается прерывание и затем на красной точке слева выполняется щелчок правой клавишей мыши и из всплывшего меню выбирается команда Breakpoint properties. Открывается окно свойств прерывания, где в верхних строках Filename(имя файла) и Line Number(номер его строки ) заполнились автоматически в момент задания точки прерывания. Поле Condition(условие) позволяет ввести некоторое условие. Прерывание будет происходить только в том случае, если значение условия станет равно true . В нашем примере нужно указать условие останова в таком виде i == 10.
Дата _______________________
(відпрацювання лаб. роботи)
Студент___________________ Група ____________
Складови знань
Бали для оцінювання знань |
Уміння змінювати та налагоджувати алгоритм С++ програми |
Знання програмного та файлового забезпечення лабораторної роботи |
2,0 |
1,0 |
|
Набрані бали |
|
|
Дата __________________ Викладач ______________________
(захисту лаб. роботи) (підпис)