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

Методичка по Visual Studio 2008

.pdf
Скачиваний:
300
Добавлен:
27.03.2015
Размер:
6.26 Mб
Скачать

Пример 3. Программа с ошибкой, обнаруживаемой на этапе ком-

поновки

#include <stdio.h> #include <conio.h> #include <locale.h>

// функция проверки числа на четность

int isEven (int a); // прототип фукции есть, поэтому // компилятор не обнаружит ошибку

void main()

{

setlocale(LC_CTYPE, "Russian"); int a = 0;

printf_s("Введите число a: "); scanf_s("%d", &a);

if (isEven(a)) // Ошибка компоновки: в программе // нет описания функции isEven

printf_s("Число a = %d – четное\n", a); else

printf_s("Число a = %d – нечетное\n", a); _getch();

}

//int isEven (int a) { return 0 == a % 2; }

Рис. 16. Сообщение компоновщика об ошибке

21

Рис. 17. Сообщения компилятора и компоновщика

в окне Вывод

Рис. 18. Описание ошибки компоновки во встроенной

справочной системе

22

ОТЛАДКА В VISUAL STUDIO.

ПОИСК ЛОГИЧЕСКИХ ОШИБОК В ПРОГРАММЕ

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

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

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

Самым простым способом локализации логической ошибки являет-

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

Начало сеанса отладки

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

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

23

Установка точек останова

Для того чтобы отладчик прерывал выполнение программы на оп- ределенной строке, необходимо установить на этой строке точку ос-

танова. Точка останова (или точка прерывания) – это просто место

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

Установить точку останова на какой-либо строке кода можно при помощи щелчка по полю индикаторов данной строки (рис. 19). Либо можно установить курсор на нужной строке и нажать клавишу F9.

Рис. 19. Установка точки останова

24

Просмотр данных в отладчике

Когда выполнение программы в сеансе отладки приостановлено (например, при помощи точки останова), можно изучить состояние и содержимое ее переменных и объектов. Для этого в VS можно ис-

пользовать три вида окон: Локальные, Видимые и Контрольные значения.

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

На рис. 20 показан пример окна Локальные. С его помощью можно увидеть приложение нашего примера, которое приостанов- лено до обнуления соответствующих элементов массива. Обратите внимание, что объект (массив) a развернут для того, чтобы показать значения его элементов в момент остановки выполнения програм- мы. По мере установки значений результаты будут отображаться в столбце Значения.

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

Окна Контрольные значения в VS позволяют настраивать собст- венный список переменных и выражений, за которыми нужно наблю- дать (рис. 22). Окна Контрольные значения выглядят и ведут себя точно так же, как и окна Локальные и Видимые. Кроме того, те эле- менты, которые вы размещаете в окнах Контрольные значения, со- храняются между сеансами отладки.

25

Рис. 20. Окно Локальные

Вы получаете доступ к окнам Контрольные значения из меню или панели инструментов Отладка. Четыре окна Контрольные значения

(которые называются Контрольные значения 1, Контрольные значения 2, Контрольные значения 3 и Контрольные значения 4) по-

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

26

Рис. 21. Окно Видимые

Переменную или выражение в окно Контрольные значения 1 можно добавить из редактора кода. Для этого в редакторе кода выде- лите переменную (или выражение), щелкните по ней правой кнопкой мыши и выберите пункт Добавить контрольное значение. При этом выделенная переменная (или выражение) будет помещена в окно Контрольные значения 1. Вы можете также перетащить выделенный элемент в это окно.

27

Рис. 22. Окно Контрольные значения 1

Пошаговое прохождение для поиска ошибки

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

28

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

Одной из более удобных (и часто упускаемых) функциональных

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

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

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

Команда Шаг с заходом (F11) позволяет продвигаться по коду по одной строке. Вызов этой команды выполнит текущую строку кода и поместит курсор на следующую выполняемую строку. Важное разли-

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

Команда Шаг с обходом (F10) позволяет вам сохранять фокус в те- кущей функции (не заходя в вызываемые ею подпрограммы), т. е. вы- зов Шаг с обходом приведет к выполнению строки за строкой, но не

заведет вас в вызовы функций и при этом следующей выполняемой строкой для пошагового прохождения станет следующая за вызовом функции строка.

29

Рис. 23. Вызов команды Выполнить до текущей позиции

Команда Шаг с выходом (SHIFT + F11) – это еще один полезный инструмент. Он позволяет вам дать указание отладчику закончить вы- полнение текущей подпрограммы (которую вы отлаживаете) и вер- нуться в режим останова сразу после ее завершения. Это очень удобно тогда, когда вы завязли в длинной подпрограмме, которую стоило бы пропустить. Кроме того, вы можете войти в данную подпрограмму для отладки только ее части, а затем выйти из нее.

30