Урок №27. Отладка программ: стек вызовов и отслеживание переменных



Книга Урок №27. Отладка программ: стек вызовов и отслеживание переменных

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

Примечание: Перед тем как продолжить, убедитесь, что вы находитесь в режиме конфигурации «Debug» .

Отслеживание переменных

Мониторинг переменных - это процесс контроля значений переменных во время отладки. Например:

#include

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.

Окно просмотра

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

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

Для того чтобы увидеть окно просмотра в Visual Studio, необходимо перейти в раздел "Отладка", затем выбрать "Окна", далее "Контрольные значения" и наконец "Контрольные значения 1":

Примечание : Вы должны находиться в режиме отладки — используйте для этого команду «Шаг с заходом» .

Необходимо обязательно рассмотреть следующее:

В настоящий момент в данном окне отсутствует содержание, поскольку вы еще не добавили ничего. У вас есть два варианта:

Укажите название переменной, которую необходимо мониторить, в поле "Имя" на панели просмотра.

Выберите переменную, которую необходимо мониторить, затем нажмите правую кнопку мыши и выберите опцию "Добавить контрольное значение".

Попробуйте внести переменную "x" в окно просмотра.

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

Стек вызовов

В настоящее время отладчики обладают дополнительным информационным окном, которое может оказаться весьма ценным в процессе отладки программы — «Стек вызовов».

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

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

Для отображения окна "Стек вызовов" в Visual Studio следует перейти в раздел "Отладка", затем выбрать пункт "Окна" и далее выбрать "Стек вызовов".

Примечание : Вы должны находиться в режиме отладки — используйте для этого команду «Шаг с заходом».

Давайте рассмотрим конкретный пример:

#include

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(), в программе имеется два места, где она вызывается: в функции CallB() и в функции CallA(). Какая из этих функций отвечает за вызов CallC() в текущий момент? Это можно определить, посмотрев на стек вызовов:

Сначала запускается функция main(). После этого main() вызывает функцию CallA(), которая в свою очередь вызывает функцию CallB(). Функция CallB() в свою очередь вызывает функцию CallC(). Если вы дважды щелкнете по разным строкам в окне "Стек вызовов", вы сможете увидеть дополнительную информацию о вызываемых функциях. Некоторые среды разработки переносят курсор непосредственно к вызову указанной функции. Например, Visual Studio перемещает курсор к следующей строке после вызова функции. Попробуйте сами! Чтобы продолжить выполнение программы, дважды щелкните на самой верхней (первой) строке в окне "Стек вызовов", и вы вернетесь к текущей точке выполнения.

Выберите опцию "Продолжить". Остановка должна произойти во второй раз, когда функция CallC() будет вызвана повторно (на этот раз из функции CallA()). Вся последовательность событий будет отображена в окне "Стек вызовов":

Заключение

Теперь у вас есть понимание основных функций встроенных отладчиков! При помощи функций степпинга, установки точек останова, отслеживания переменных и просмотра окна «Стек вызовов» вы сможете эффективно отлаживать программы.

225   0  

Comments

    Ничего не найдено.