На предыдущем уроке о степпинге и точках останова , мы узнали, как, с их использованием, контролировать выполнение программы шаг за шагом. Тем не менее, на этом не заканчиваются все полезные возможности отладчика. Он также позволяет отслеживать значения переменных.
Примечание: Перед тем как продолжить, убедитесь, что вы находитесь в режиме конфигурации «Debug» .
Отслеживание переменных
Отслеживание переменных — это процесс проверки значений переменных во время отладки. Например:
#include <iostream>
int main ( )
{
int x = 1 ;
std :: cout << x << " " ;
x = x + 1 ;
std :: cout << x << " " ;
x = x + 2 ;
std :: cout << x << " " ;
x = x + 4 ;
std :: cout << x << " " ;
return 0 ;
}
Результат выполнения программы:
1 2 4 8
Используя команду «Выполнить до текущей позиции» переместитесь к строке std::cout << x << " "; :
К этому моменту переменная х уже создана и инициализирована, поэтому, при проверке этой переменной, вы должны увидеть число 1 .
Самый простой способ отслеживания простых переменных (как х ) — это наведение курсора мыши на элемент. Большинство современных отладчиков поддерживают эту возможность:
Обратите внимание, вы можете навести курсор мыши на любую другую переменную (и на любой строке):
В Visual Studio есть еще возможность использовать «Быструю проверку». Выделите переменную х с помощью мыши > ПКМ (правая кнопка мыши) > "Быстрая проверка..." :
Появится специальное окно с текущим значением переменной:
Хорошо, теперь закройте это окно.
Значения переменных можно отслеживать и во время выполнения отладки. Переместитесь с помощью команды «Шаг с обходом» к строке std::cout << x << " "; :
Значение переменной х должно поменяться на 2 . Проверьте!
Окно просмотра
Команда «Быстрая проверка» или наведение курсора на элемент подходят для статического просмотра переменных, но не очень подходят для отслеживания изменений переменной во время выполнения программы, так как с каждой новой выполненной строкой придется заново наводить курсор на элемент или использовать «Быструю проверку».
Для решения этой проблемы, все современные отладчики предлагают еще один инструмент — окно просмотра. Окно просмотра — это окно, в которое можно добавлять переменные для постоянного отслеживания. Данные переменные будут автоматически обновляться при последовательном выполнении программы. Окно просмотра уже может быть подключено и отображаться в вашей рабочей области, но если это не так, то вы можете это исправить, перейдя в настройки вашей IDE .
В Visual Studio для отображения окна просмотра вам нужно перейти в "Отладка" > "Окна" > "Контрольные значения" > "Контрольные значения 1" :
Примечание : Вы должны находиться в режиме отладки — используйте для этого команду «Шаг с заходом» .
Вы должны увидеть следующее:
Пока что в этом окне ничего нет, так как вы еще ничего в него не добавили. Есть 2 пути:
Ввести имя переменной, которую нужно отслеживать, в колонку "Имя" в окне просмотра.
Выделить переменную, которую нужно отслеживать > ПКМ > "Добавить контрольное значение" .
Попробуйте добавить переменную х в окно просмотра:
Теперь выберите команду «Шаг с обходом» несколько раз и следите за изменениями значения вашей переменной!
Стек вызовов
Современные отладчики имеют еще одно информационное окно, которое может быть очень полезным при отладке программ — «Стек вызовов».
Как вы уже знаете, при вызове функции программа оставляет закладку в текущем местоположении, выполняет функцию, а затем возвращается в место закладки. Программа отслеживает все вызовы функций в стеке вызовов.
Стек вызовов — это список всех активных функций, которые вызывались до текущего местоположения. В стек вызовов записывается вызываемая функция и выполняемая строка. Всякий раз, когда происходит вызов новой функции, эта новая функция добавляется в верх стека. Когда выполнение текущей функции прекращается, она удаляется из верхней части стека и управление переходит к функции ниже (второй по счету).
Отобразить окно «Стека вызовов» в Visual Studio можно через "Отладка" > "Окна"> "Стек вызовов" :
Примечание : Вы должны находиться в режиме отладки — используйте для этого команду «Шаг с заходом».
Рассмотрим пример:
#include <iostream>
void CallC ( )
{
std :: cout << "C called" << std :: endl ;
}
void CallB ( )
{
std :: cout << "B called" << std :: endl ;
CallC ( ) ;
}
void CallA ( )
{
CallB ( ) ;
CallC ( ) ;
}
int main ( )
{
CallA ( ) ;
return 0 ;
}
Укажите точку останова в функции CallC(), а затем запустите отладку. Программа выполнится до точки останова.
Несмотря на то, что вы знаете, что сейчас выполняется CallC(), в программе есть два вызова CallC(): в функции CallB() и в функции CallA(). Какая функция ответственна за вызов CallC() в данный момент? Стек вызовов нам это покажет:
Сначала выполняется main(). Затем main() вызывает CallA(), которая, в свою очередь, вызывает CallB(). Функция CallB() вызывает CallC(). Вы можете щелкнуть дважды по разным строкам в окне «Стек вызовов», чтобы увидеть больше информации о вызываемых функциях. Некоторые IDE переносят курсор непосредственно к вызову указанной функции. Visual Studio переносит курсор к следующей строке, которая находится после вызова функции. Попробуйте! Для того, чтобы возобновить степпинг, щелкните дважды по самой верхней (первой) строке в окне «Стек вызовов» и вы вернетесь к текущей точке выполнения.
Выберите команду «Продолжить». Точка останова должна сработать во второй раз, когда будет повторный вызов функции CallC() (на этот раз из функции CallA()). Всё происходящее вы должны увидеть в окне «Стек вызовов»:
Заключение
Теперь вы знаете об основных возможностях встроенных отладчиков! Используя степпинг, точки останова, отслеживание переменных и окно «Стек вызовов» вы можете успешно проводить отладку программ.