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

  Юрий  | 

    | 

  Обновл. 23 Мар 2019  | 

 12883

 ǀ   10 

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

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

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

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

Результат выполнения программы выше:

1 2 4 8

Используя команду “Выполнить до текущей позиции” переместитесь к строке std::cout << x << " ";:

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

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

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

В Visual Studio есть ещё возможность использовать «Быструю проверку». Выделите переменную х с помощью мыши > ПКМ (правая кнопка мыши) > «Быстрая проверка…»:

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

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

Значения переменных можно отслеживать и во время выполнения отладки. Переместитесь с помощью команды “Шаг с обходом” к строке std::cout << x << " ";:

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

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


«Быстрая проверка» или наведение курсора на элемент подходят для статического просмотра переменных, но не очень подходят для отслеживания изменений переменной во время выполнения программы, так как с каждой новой выполненной строкой придётся заново наводить курсор на элемент или использовать «Быструю проверку».

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

В Visual Studio для отображения окна просмотра вам нужно перейти в «Отладка» > «Окна» > «Контрольные значения» > «Контрольные значения 1»:

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

Вы должны увидеть следующее:

Пока что в этом окне ничего нет, так как мы ещё ничего в него не добавили. Есть 2 пути:

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

   Выделить переменную, которую мы хотим отслеживать > щёлкнуть правой кнопкой мыши и выбрать «Добавить контрольное значение».

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

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

Стек вызовов

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

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

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

Отобразить окно «Стека вызовов» в Visual Studio можно через «Отладка» > «Окна»> «Стек вызовов»:

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

Рассмотрим пример:

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

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

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

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


Заключение


Теперь вы знаете об основных возможностях встроенных отладчиков! Используя степпинг, точки останова, отслеживание переменных и окно «Стек вызовов» вы можете успешно проводить отладку программ.

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

Звёзд: 1Звёзд: 2Звёзд: 3Звёзд: 4Звёзд: 5 (130 оценок, среднее: 4,88 из 5)
Загрузка...

Комментариев: 10

  1. Аватар Сергей:

    функция CallC() должна быть подписана в call stack 15-ой строкой, когда вызывается во второй раз?

  2. Аватар Oleksiy:

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

    Не понятно, где именно надо стабить breakpoint. Функция CallC() упоминается несколько раз в программе.

    1. Юрий Юрий:

      В этой функции:

  3. Аватар Георгий:

    при нажатии клавиши "F11" (step into) меня перебрасывает куда то совершенно в другой файл (не мой), называется "ostream", в чём проблема? (с "F10" (step over) такой проблемы нет)

    1. Аватар Александр:

      Вас перебрасывает на выполнение оператора вывода в поток ( << )… видимо это следующая команда Вашего кода

  4. Аватар painkiller:

    Прочитал два урока об отладке, но, к сожалению, использую сейчас IDE DEV C++, а в ней проблемы с отладчиком. Подумал, что это у меня какие-то проблемы, но зашел на специализированные форумы и выяснилось, что такая проблема у многих. В этой среде отладчик очень слабый и нужно к ней подключать отладчики сторонних разработчиков.
    Решил для себя пользоваться этой средой до той поры, когда без отладчика будет очень еще терпимо, но позже обязательно перейду на более мощную среду.
    Написал это для тех, кто имеет эту же среду.

    1. Аватар Александр:

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

      1. Аватар Константин:

        Александр, а можешь по-шагово расписать "просто расставьте в своем коде вывод (например в лог-файл) интересующих Вас в данном куске кода параметров и вуаля…" как это сделать?

  5. Аватар Виталий:

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

    Наверное, имелось в виду, что переменные НЕ будут находиться в окне просмотра.

    1. Юрий Юрий:

      Переменные, которые выходят из области видимости будут находиться в окне просмотра. Если переменные возвращаются в область видимости (например, функция вызывается повторно), в окне появятся ЗНАЧЕНИЯ этих переменных.

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

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

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