
- •Лабораторная работа №2 (1 часть) Отладка консольного приложения.
- •Отладочная и окончательная версии.
- •Переключение между отладочной и окончательной версией.
- •Установки по умолчанию для отладочной и окончательной версий
- •Изменение опций отладки
- •Изменение формата генерируемой отладочной информации
- •Генерация карты символов
- •Что такое файл .Pdb?
- •Что такое файл .Dbg?
- •/Gd, /Gr, /Gz (соглашения о вызовах)
- •Отладочные макросы
- •Установка точек останова
- •Расширенные точки останова
- •Установка точек трассировки
- •Использование Утверждений
- •Отладка программы
- •Использование циклов для решения задач численными методами Вычисление значения с заданной точностью методом прямоугольников
- •Вычисление по формуле Симпсона путем деления отрезка [a,b] на множество более мелких отрезков
- •Методом простых итераций
- •Методом деления отрезка пополам
Расширенные точки останова
Более совершенный способ установки точек останова предлагается в окне, которое открывается с помощью комбинации клавиш <Alt+F9> или выбора пункта Breakpoints (Точки останова) из списка, отображаемого при выборе кнопки Windows (Окна) панели инструментов Debug, которая находится в ее правой части.
Если выполнить действия, показанные на рисунке, появится окно, в котором вы можете также настраивать точки останова. Познакомьтесь с возможностями этого окна.
Дополнительные параметры для точки останова устанавливаются щелчком правой кнопкой мыши на строке останова в окне Breakpoints и выбором соответствующих пунктов из контекстного меню. Наряду с установкой точки останова в определенном месте кода можно также установить точку останова, когда определенное логическое выражение вернет значение true. Это мощное средство, но оно влечет за собой очень существенные накладные расходы при выполнении программы, поскольку проверочное выражение должно постоянно вычисляться.
Установка точек трассировки
Точка трассировки (tracepoint) — разновидность точки останова, с которой связано некоторое специальное действие. Такая точка создается щелчком правой кнопкой мыши на строке, где ее нужно установить, и выбором пункта Breakpoint=>When Hit (Точка останова=>При попадании) из контекстного меню. Откроется диалоговое окно When Breakpoints Hit (Когда происходит попадание в точку останова).
После постановки точки останова в коде, запускаете отладку и затем смотрите необходимые значения переменных в меню Отладка=>Окна
Как видно из рисунка выше можно посмотреть локальные и видимые переменные, а также их изменить. Что бы посмотреть локальные переменные выберите пункт Локальные.
Вы их можете менять, наведя курсор мыши на значение переменной и щелкнув два раза клавишей мышки.
Так же можно посмотреть значение переменной, наведя курсор мышки на эту переменную
Во вкладке Отладка=>Окна=>Контрольные значения можно задавать переменные, которые нужно отслеживать.
Появится окно, в котором нужно ввести имя переменной или нескольких переменных.
Использование Утверждений
Файл заголовка стандартной библиотеки cassert объявляет функцию assert(), которую можно использовать для проверки логических условий в программе, когда не определен специальный символ препроцессора NDEBUG. Эта функция объявлена следующим образом:
void assert(int expression);
Аргумент функции задает условие, которое должно быть проверено, но эффект от функции assert() подавляется, если определен специальный символ препроцессора NDEBUG. Символ NDEBUG автоматически определяется в рабочей версии программы, но не в отладочной версии. Поэтому утверждение (assertion) проверяет свой аргумент в отладочной версии программы, но ничего не делает в рабочей версии. Если хотите отключить этот механизм в отладочной версии программы, определите символ NDEBUG явно, используя директиву #define. Чтобы это возымело действие, такую директиву необходимо поместить раньше директивы #include для заголовочного файла cassert в исходном файле.
#define NDEBUG //Отключить механизм утверждений в коде
#include <cassert>//Объявление assert()
Если выражение, переданное в качестве аргумента функции assert(), возвращает не нуль (т.е. значение true), функция ничего не делает. Но если выражение равно нулю (другими словами, значение false) и символ NDEBUG не определен, выводится диагностическое сообщение, показывающее выражение, которое вернуло значение false, имя файла исходного кода и номер строки в исходном файле, где это произошло. После отображения диагностического сообщения функция assert() вызывает функцию abort() для завершения программы.
Пример:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
#include <iostream> using std::cout; using std::endl;
//при раскомментировании assert игнорируется //#define NDEBUG #include <cassert>
int main() { int a=4; int b=5;
//проверить что а > b assert(a>b);
return 0; } |
вывод:
как видно сработал assert, что означает ошибка отладки. В коде выше мы проверяем, чтобы а было всегда больше b, если а меньше b, то вызывается assert() оно выводит окошко с тремя кнопками. Щелчок на кнопке Abort (Прервать) немедленно завершает программу. Кнопка Retry (Повторить) запускает отладчик среды разработки Visual C++ 2010, так что можете пошагово выполнить программу, чтобы подробнее выяснить причину отказа утверждения. В принципе кнопка Ignore (Игнорировать) позволяет продолжить выполнение программы, несмотря на ошибку, но обычно это неразумный выбор, поскольку результат, скорее всего, будет непредсказуемым.
В качестве аргумента функции assert() можно использовать логические выражение любого рода. Можно сравнивать значения, проверять указатели, верифицировать типы объектов или выполнять любую другую полезную проверку, чтобы убедиться в корректности работы вашего кода
Например, проверить указатель
assert(ptr!=0);
если он вдруг будет равен 0, то вызовется assert() и выведется окошко с кнопками.
Полученное сообщение о невыполнении некоторого логического условия помогает мало, так что обычно потребуется дополнительная помощь для обнаружения и исправления ошибок.