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

  Юрий  | 

  |

  Обновл. 21 Июл 2021  | 

 81963

 ǀ   12 

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

Примечание: Перед тем как продолжить, убедитесь, что вы находитесь в режиме конфигурации «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 (602 оценок, среднее: 4,89 из 5)
Загрузка...

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

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

    На самом деле в gdb все проще (как и в любой командной строке). Нужен стэк вызовов — bt, подняться — up, нужна точка останова — b, просмотреть переменную — p и т.д. Т.е. десяток команд выписать, выучить, и хоть из сериальной консоли удалённое приложение отлаживай … зря всё так поверхностно в этом плане.

  2. Юра:

    Автор похоже больше занимается разработкой, чем преподаёт т.к. в начале курса уделяет много внимания проблемам, которые появятся при разработке крупных проектов. Однако объясняет хорошо, по крайней мере мне всё понятно.

  3. Сергей:

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

  4. Oleksiy:

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

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

    1. Фото аватара Юрий:

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

  5. Георгий:

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

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

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

  6. painkiller:

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

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

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

      1. Константин:

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

  7. Виталий:

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

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

    1. Фото аватара Юрий:

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

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

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

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