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

   ⁄ 

 Обновлено 22 Фев 2017

  ⁄   

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

В наших примерах мы будем использовать дебаггер Visual Studio Express. Если вы используете другую IDE или другой отладчик, то команды могут немного отличаться в названиях или иметь разные локейшены.

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

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

Отслеживание переменных — это процесс проверки значений переменных во время отладки. Есть несколько способов. Давайте рассмотрим на примере:

Программа выводит числа 1, 2, 4 и 8.

Во-первых, используйте команду “Run to cursor” для отладки программы до первой строки std::cout << x << " ";.

mal1

На данный момент, переменная х уже создана и инициализирована, поэтому, при проверке значения мы увидим 1.

Самый простой способ отслеживания простых переменных (как х) — наведение курсора мыши. Большинство современных отладчиков имеют в арсенале эту возможность.

mal2

Обратите внимание, вы можете навести курсор мыши на любую другую переменную х в любой строке.

mal3

В Visual Studio есть еще возможность использовать Quick Watch. Выделите переменную х с помощью мыши, а затем выберите «Quick Watch» в контекстном меню (клик правой кнопкой мыши).

mal4

Появится специальное окно, в котором будет текущее значение переменной.

mal5

Хорошо, теперь закрываем QuickWatch.

Можно отслеживать переменные (смотреть их изменения) и в ходе выполнения программы. Для этого выберите “Step over” дважды, так чтобы следующей строкой для выполнения стала std::cout << x << " ";.

mal6

Теперь значение переменной х должно поменяться на 2. Проверьте!

Watch window

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

Для решения этой проблемы, все современные компиляторы имеют еще один инструмент — watch window. Watch window (окно просмотра) – это окно, в которое можно добавлять переменные для постоянного отслеживания, они будут автоматически обновляться при выполнении программы, строка за строкой. Окно просмотра уже может быть в рабочей области вашей среды разработки, но если нет, то его можно подключить, используя команды IDE (смотрите в пунктах меню Debug или View).

В Visual Studio для отображения watch window нужно перейти в меню Debug > Windows > Watch > Watch 1 (примечание: вы должны находиться в режиме отладки — используйте для этого команду Step Into).

Перед вами должно появиться:

mal7

Пока что в этом окне ничего нет, так как мы еще ничего не добавляли. Но это легко поправимо 🙂 Есть два способа задать отслеживание:

1) Ввести имя переменной, которую мы хотим отслеживать, в колонку «Name» в окне просмотра.

2) Выделить переменную, которую мы хотим отслеживать, щелкнуть правой кнопкой мыши и выбрать «Add Watch».

Попробуйте добавить переменную «х» в список просмотра. У вас должно появиться:

mal8

Теперь выберете команду «Step Over» несколько раз и смотрите изменение значений вашей переменной!

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

Watch window — это лучший способ наблюдения за значениями переменных в ходе выполнения программы.

Стек вызовов

Современные отладчики имеют еще одно информационное окно, которое может быть очень полезным при отладке программы – окно Стека вызовов.

При вызове функции, как вы уже знаете, программа оставляет закладку в текущем местоположении, выполняет функцию, затем возвращается. Но как она знает, куда возвращаться? Ответ прост: программа отслеживает всё в стеке вызовов.

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

Отобразить окно Стека вызовов в Visual Studio можно через меню Debug > Windows > Call Stack (примечание: вы должны находиться в режиме отладки — используйте для этого команду Step Into).

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

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

Несмотря на то, что вы знаете, что сейчас выполняется CallC(), на самом деле существует два вызова CallC() в этой программе (один в функции CallB() и один в CallA()). Какая функция ответственна за вызов CallC() на этот раз? Стек вызовов покажет нам:

mal9

(Обратите внимание, что ваши номера строк могут немного отличаться)

Программа запускается вызовом главный функции main(). main() вызывает CallA(), которая вызывает CallB(), которая в свою очередь вызывает CallC(). Вы можете щелкнуть дважды по разным линиям в окне Call Stack, чтобы увидеть больше информации о вызываемых функциях. Некоторые IDE переносят курсор непосредственно к вызову. Visual Studio переносит курсор к следующей строке после вызова функции. Попробуйте! Когда вы будете готовы возобновить пошаговый просмотр кода (степпинг), щелкните дважды по самой верхней (первой) строке окна Call Stack и вы вернетесь к текущей точке выполнения.

Продолжайте отладку дальше. Точка останова должна сработать во второй раз, когда будет повторный вызов функции CallC() (на этот раз с функции CallA()). Всё происходящее вы должны увидеть в стеке вызовов:

mal10

Результат

Поздравляем, теперь вы знаете основы дебаггинга! Используя степпинг, точки останова, отслеживание переменных и окно Стека вызовов, у вас есть возможность отладить практически любую проблему. Как во многом другом, для того, чтобы научиться эффективно использовать отладчик, вам нужна практика и опыт, которые не бывают без ошибок. Тем не менее, чем больше ваши программы, тем более ценным станет дебаггер, так что эта тема, безусловно, стоила потраченного времени!

Оценить статью:

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (22 оценок, среднее: 4,95 из 5)
Загрузка...
Поделиться в:
Подписаться на обновления:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *