Visual studio отладка консольного приложения
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Open with Desktop
- View raw
- Copy raw contents Copy raw contents
Copy raw contents
Copy raw contents
Знакомство с отладчиком Visual Studio
В этом разделе представлены средства отладчика, предоставляемые Visual Studio. В контексте Visual Studio отладка приложения обычно означает запуск приложения с подключенным отладчиком (то есть в режиме отладчика). При этом в отладчике доступно множество способов наблюдения за выполнением кода. Вы можете пошагово перемещаться по коду и просматривать значения, хранящиеся в переменных, задавать контрольные значения для переменных, чтобы отслеживать изменение значений, изучать путь выполнения кода и т. д. Если вы не знакомы с процессом отладки, перед выполнением задач в этом разделе рекомендуется прочесть документ об отладке для начинающих.
Установка точки останова и запуск отладчика
Точки останова полезны, если вам известны строка или раздел кода, которые вы хотите подробно изучить в среде выполнения. Дополнительные сведения о различных типах точек останова, которые можно задать, например об условных точках останова и точках останова в функциях, см. в разделе Использование точек останова.
Для отладки нужно запустить приложение с отладчиком, подключенным к процессу приложения. Для этого чаще всего используется клавиша F5 (Отладка > Начать отладку). Однако сейчас у вас, возможно, не задано ни одной точки останова для проверки кода приложения, поэтому мы сначала зададим их, а затем начнем отладку. Точки останова — это один из самых простых и важных компонентов надежной отладки. Точка останова указывает, где Visual Studio следует приостановить выполнение кода, чтобы вы могли проверить значения переменных или поведение памяти либо выполнение ветви кода.
Если вы открыли файл в редакторе кода, точку останова можно задать, щелкнув в поле слева от строки кода.
. moniker range=">= vs-2022" . moniker-end . moniker range=" . moniker-end
Нажмите клавишу F5 (Отладка > Начать отладку) или Начать отладку кнопку на панели инструментов отладки, при этом отладчик выполняется до первой встреченной точки останова. Если приложение еще не запущено, при нажатии клавиши F5 запускается отладчик и выполняется остановка в первой точке останова.
Переход по коду в отладчике с помощью пошаговых команд
Мы указываем сочетания клавиш для большинства команд, так как они ускоряют навигацию по коду вашего приложения. (Аналогичные команды, такие как команды меню, отображаются в круглых скобках.) Дополнительные сведения об использовании команд пошагового выполнения см. в разделе Навигация по коду в отладчике.
Для запуска приложения с подключенным отладчиком нажмите клавишу F11 (Отладка > Шаг с заходом). F11 — это команда Шаг с заходом, которая выполняет приложение с переходом к следующему оператору. При запуске приложения с помощью клавиши F11 отладчик останавливается на первом выполняемом операторе.
. moniker range=">= vs-2022" . moniker-end . moniker range="
Желтая стрелка представляет оператор, на котором приостановлен отладчик. В этой же точке приостанавливается выполнение приложения (этот оператор пока не выполнен).
Клавишу F11 удобно использовать для более детальной проверки потока выполнения. (Мы также покажем другие варианты более быстрого перемещения по коду.) По умолчанию отладчик пропускает непользовательский код (дополнительные сведения см. в статье об отладке в режиме "Только мой код").
[!NOTE] В управляемом коде вы увидите диалоговое окно с запросом о том, хотите ли вы получать уведомления при автоматическом обходе свойств и операторов (поведение по умолчанию). Если вы хотите изменить этот параметр позже, отключите параметр Шаг с обходом свойств и операторов в меню Сервис > Параметры в разделе Отладка.
Шаг с обходом по коду для пропуска функций
Когда вы находитесь на строке кода, представляющей собой вызов функции или метода, можно нажать клавишу F10 (Отладка > Шаг с обходом) вместо F11.
Клавиша F10 продолжает выполнение отладчика без захода в функции или методы в коде приложения (код продолжает выполняться). Нажав клавишу F10, вы можете обойти код, который вас не интересует. Так можно быстро перейти к важному для вас коду. Дополнительные сведения об использовании команд пошагового выполнения см. в разделе Навигация по коду в отладчике.
Быстрое выполнение до точки в коде с помощью мыши
Использование кнопки Выполнение до щелкнутого аналогично установке временной точки останова. Кроме того, эта команда удобна для быстрой работы в видимой области кода приложения. Выполнение до щелкнутого можно использовать в любом открытом файле. Дополнительные сведения об этой функции и аналогичных функциях навигации см. в разделе Выполнение до определенного места в коде.
Находясь в отладчике, наведите курсор на строку кода, пока слева не появится кнопка выполнения до щелкнутого (Выполнить до этого места) отображается слева.
. moniker range=">= vs-2022" . moniker-end . moniker range="
[!NOTE] Кнопка выполнения до щелкнутого (Выполнить до этого места) доступна начиная с версии [!includevs_dev15].
Вывод отладчика из текущей функции
В некоторых случаях может потребоваться продолжить сеанс отладки, однако полностью проведя отладчик сквозь текущую функцию.
Нажмите клавиши SHIFT+F11 (или выберите Отладка > Шаг с выходом).
Эта команда возобновляет выполнение приложения (и перемещает отладчик) до возврата текущей функции.
Выполнить до текущей позиции
Если вы находитесь в режиме редактирования кода (то есть работа отладчика не приостановлена), щелкните правой кнопкой мыши строку кода в приложении и выберите команду Выполнить до текущей позиции (или нажмите клавиши CTRL+F10). Эта команда запускает отладку и задает временную точку останова на текущей строке кода. Дополнительные сведения об этой функции и аналогичных функциях навигации см. в разделе Выполнение до определенного места в коде.
. moniker range=">= vs-2022" . moniker-end . moniker range="
Если имеются заданные точки останова, отладчик приостанавливается в первой достигнутой точке останова.
Нажимайте клавишу F5, пока не достигнете строки кода, для которой выбрали Выполнить до текущей позиции.
Эта команда удобна, когда вы редактируете код и хотите быстро задать временную точку останова и одновременно запустить отладчик.
[!NOTE] Вы можете использовать функцию Выполнить до текущей позиции в окне Стек вызовов во время отладки.
Быстрый перезапуск приложения
Кнопка Перезапустить позволяет сэкономить время, затрачиваемое на остановку приложения и перезапуск отладчика. Отладчик приостанавливается в первой точке останова, достигнутой при выполнении кода.
Если вы хотите остановить отладчик и вернуться в редактор кода, вы можете нажать красную кнопку вместо Перезапустить.
. moniker range=">= vs-2022"
Редактирование кода в реальном времени
Visual Studio 2022 поддерживает динамическое редактирование кода в процессе отладки. Дополнительные сведения см. в следующих разделах.
. moniker-end . moniker range="
В большинстве языков, поддерживаемых Visual Studio, можно изменять код во время сеанса отладки, а затем продолжать отладку. Для использования этой функции щелкните код, чтобы установить в нем курсор, когда отладчик приостановлен, внесите изменения и нажмите клавишу F5, F10 или F11, чтобы продолжить отладку. Дополнительные сведения об этой функции и ее ограничениях см. в статье Изменить и продолжить.
Сведения об изменении кода XAML во время сеанса отладки см. в статье Создание и отладка выполняющегося кода XAML с помощью горячей перезагрузки XAML. . moniker-end
Проверка переменных с помощью подсказок по данным
Теперь, когда вы немного освоились, у вас есть хорошая возможность проверить состояние приложения (переменные) с помощью отладчика. Функции, позволяющие проверять переменные, являются одними из самых полезных в отладчике. Реализовывать эту задачу можно разными способами. Часто при попытке выполнить отладку проблемы пользователь старается выяснить, хранятся ли в переменных значения, которые требуются в определенном состоянии приложения. Подробные сведения об использовании подсказок по данным см. в разделе Просмотр значений данных в подсказках по данным.
В режиме приостановки в отладчике наведите указатель мыши на объект, чтобы увидеть его текущее значение или значение по умолчанию.
. moniker range=">= vs-2022" . moniker-end . moniker range=" . moniker-end
Если переменная имеет свойства, объект можно развернуть, чтобы увидеть все его свойства.
Часто при отладке бывает необходимо быстро проверить значения свойств для объектов. Лучше всего для этого подходят подсказки по данным.
[!TIP] В большинстве поддерживаемых языков можно изменять код во время сеанса отладки. Дополнительные сведения см. в разделе Изменить и продолжить.
Проверка переменных с помощью окон "Видимые" и "Локальные"
В окне Видимые отображаются переменные вместе с текущим значением и типом. Окно Видимые содержит все переменные, используемые в текущей строке или предыдущей строке (в C++ в окне отображаются переменные в трех предыдущих строках кода; сведения о зависящем от языка поведении см. в соответствующей документации). Дополнительные сведения об использовании этих окон см. в статье Проверка переменных в окнах "Видимые" и "Локальные".
Во время отладки взгляните на окно Видимые в нижней части редактора кода.
. moniker range=">= vs-2022" . moniker-end . moniker range="
[!NOTE] В JavaScript окно Локальные поддерживается, а окно Видимые — нет.
Взгляните в окно Локальные. В окне Локальные показаны переменные, которые находятся в текущей области.
. moniker range=">= vs-2022" . moniker-end . moniker range="
В этом примере объекты this и f находятся в области действия. Дополнительные сведения см. в статье Проверка переменных в окнах "Видимые" и "Локальные".
Установка контрольного значения
В окне Контрольное значение можно указать переменную (или выражение), которую необходимо отслеживать. Дополнительные сведения см. в статье Установка контрольных значений с помощью окон "Контрольное значение" и "Быстрая проверка".
Во время отладки щелкните правой объект кнопкой мыши и выберите пункт Добавить контрольное значение.
. moniker range=">= vs-2022" . moniker-end . moniker range="
В этом примере у вас есть контрольное значение, заданное для объекта, и по мере перемещения по отладчику вы можете наблюдать за изменением его значения. В отличие от других окон переменных, в окне Контрольное значение всегда отображаются просматриваемые вами переменные (они выделяются серым цветом, когда находятся вне области действия).
Просмотр стека вызовов
В окне Стек вызовов показан порядок вызова методов и функций. В верхней строке показана текущая функция. Во второй строке показана функция или свойство, из которого она вызывалась, и т. д. Стек вызовов хорошо подходит для изучения и анализа потока выполнения приложения. Дополнительные сведения см. в статье о просмотре стека вызовов.
[!NOTE] Окно Стек вызовов аналогично перспективе "Отладка" в некоторых интегрированных средах разработки, например Eclipse.
Во время отладки щелкните окно Стек вызовов, которое по умолчанию открыто в нижней правой области.
. moniker range=">= vs-2022" . moniker-end . moniker range="
Дважды щелкните строку кода, чтобы просмотреть исходный код. При этом также изменится текущая область, проверяемая отладчиком. Это не перемещает отладчик.
Для выполнения других задач можно воспользоваться контекстными меню из окна Стек вызовов. Например, можно вставлять точки останова в указанные функции, перезапускать приложение с помощью функции Выполнение до текущей позиции и изучать исходный код.
Когда приложение выдает исключение, отладчик переходит к строке кода, вызвавшей исключение. Подробные сведения см. в разделе Проверка исключения с помощью помощника по исправлению ошибок.
. moniker range=">= vs-2022"
В этом примере вызов DirectoryInfo выдал ошибку на пустой строке, хранящейся в переменной value . . moniker-end
Помощник по исправлению ошибок — это отличная функция, которая помогает отлаживать ошибки. Используя помощник по исправлению ошибок, вы также можете, например, просмотреть сведения об ошибке и добавить контрольное значение. При необходимости вы также можете изменить условия для возникновения конкретного исключения. См. дополнительные сведения об обработке исключений в коде в разделе Приемы и инструменты отладки.
Разверните узел Параметры исключений, чтобы просмотреть дополнительные параметры для обработки исключения этого типа, однако в рамках этого тура ничего менять не требуется.
Вы можете настроить проект для сборки, как описано в статье о конфигурации отладки или выпуска, настроить свойства проекта для отладки или настроить общие параметры для отладки. Кроме того, можно настроить отладчик для вывода пользовательских сведений с помощью таких компонентов, как атрибута DebuggerDisplay либо платформы NatVis для C/C++.
Свойства отладки зависят от типа проекта. Например, можно задать аргумент, который будет передан в приложение при запуске. Чтобы получить доступ к свойствам проекта приложения, щелкните имя проекта правой кнопкой мыши в обозревателе решений и выберите Свойства. Свойства отладки обычно отображаются на вкладке Сборка или Отладка в зависимости от типа проекта.
. moniker-end . moniker range="
Средство Snapshot Debugger создает моментальный снимок рабочих приложений при выполнении интересующего вас кода. Чтобы указать отладчику на необходимость создать моментальный снимок, следует установить точки прикрепления и точки ведения в коде. Отладчик позволяет увидеть источник ошибки, не затрагивая трафик рабочего приложения. Средство Snapshot Debugger позволяет значительно сократить затраты времени на устранение проблем, возникающих в рабочих средах.
. moniker range="
Просмотр моментальных снимков с помощью возврата на шаг назад в IntelliTrace (Visual Studio Enterprise)
Функция возврата на шаг назад в IntelliTrace автоматически создает моментальный снимок вашего приложения для каждого события точки останова и шага отладчика. Используя записанные моментальные снимки, вы можете возвращаться к этим точкам останова и шагам, просматривая предыдущее состояние приложения. Возможность возврата на шаг назад в IntelliTrace позволяет сэкономить время в тех случаях, когда вам нужно просмотреть предыдущее состояние приложения, но не требуется перезапускать отладку или воссоздавать необходимое состояние приложения.
Для просмотра моментальных снимков и перехода между ними используйте кнопки На шаг назад и На шаг вперед на панели инструментов отладки. С помощью этих кнопок можно перейти к событиям, которые отображаются на вкладке События в окне Средства диагностики.
. moniker range="
Отладка проблем производительности
Если приложение работает слишком медленно или использует слишком много памяти, возможно, вам следует протестировать его с помощью средств профилирования на раннем этапе. Дополнительные сведения о средствах профилирования, таких как средство загрузки ЦП и анализатор памяти, см. в разделе Знакомство со средствами профилирования.
В этом руководстве вы кратко познакомились с функциями отладчика. Отдельные функции, например точки останова, вы можете изучить более подробно.
Подготовка к отладке консольного проекта аналогична подготовке к отладке проекта Windows, с некоторыми дополнительными соображениями, такими как установка аргументов командной строки и приостановка приложения для отладки. Дополнительные сведения см. в статье Подготовка к отладке. Приложения Windows Forms. Из-за схожести всех консольных приложений в этом разделе описываются следующие типы проектов:
консольное приложение С++ (Win32).
Задание аргументов командной строки
Может потребоваться задание аргументов командной строки для консольного приложения. Дополнительные сведения см. в статьях Параметры проектов для конфигураций отладки C++ и Параметры проекта для конфигурации отладки Visual Basic, или Параметры проекта для конфигурации отладки C++.
Запуск приложения
Некоторые консольные приложения после запуска выполняются до полного завершения, после чего сразу закрываются. Если это происходит быстро, то можно не успеть прервать выполнение приложения и выполнить отладку. Чтобы можно было выполнить отладку такого приложения, необходимо использовать один из следующих приемов для запуска приложения.
Установите точку останова в коде и запустите приложение.
Запустите приложение, нажав клавишу F10 (Отладка > Шаг с обходом) или F11 (Отладка > Шаг с заходом), а затем пройдите по коду, используя другие параметры, такие как Run to click (Выполнение до щелчка).
В редакторе кода щелкните правой кнопкой мыши строку и выберите пункт Выполнить до текущей позиции.
При отладке консольного приложения может потребоваться запуск приложения из командной строки, а не из Visual Studio. В этом случае можно запустить приложение из командной строки и присоединить к нему отладчик Visual Studio. См. сведения о присоединении к выполняемым процессам.
При запуске консольного приложения из Visual Studio окно Консоль иногда отображается позади окна Visual Studio. Если при попытке запустить консольное приложение из Visual Studio кажется, что ничего не происходит, попробуйте переместить окно Visual Studio.
В этом пошаговом руководстве рассматриваются возможности отладчика Visual Studio. Более полное описание функций отладчика см. в статье c Знакомство с отладчиком Visual Studio. Отладка приложения обычно означает запуск и выполнение приложения с подключенным отладчиком. При этом в отладчике доступно множество способов наблюдения за выполнением кода. Вы можете пошагово перемещаться по коду и просматривать значения, хранящиеся в переменных, задавать контрольные значения для переменных, чтобы отслеживать изменение значений, изучать путь выполнения кода, просматривать выполнение ветви кода и т. д. Если вы не знакомы с процессом отладки, перед выполнением задач в этой статье рекомендуется прочесть документ об отладке для начинающих.
В этом руководстве рассмотрены следующие задачи:
- Запуск отладчика и попадание в точки останова.
- Использование команд для пошагового выполнения кода в отладчике.
- Проверка переменных в подсказках к данным и окнах отладчика.
- Просмотр стека вызовов
Предварительные требования
У вас должна быть установлена среда Visual Studio и рабочая нагрузка Разработка классических приложений на C++ .
Установите Visual Studio бесплатно со страницы скачиваемых материалов Visual Studio, если еще не сделали этого.
Установите Visual Studio 2022 бесплатно со страницы скачиваемых материалов Visual Studio 2022, если еще не сделали этого.
Если вам нужно установить рабочую нагрузку, но вы уже используете Visual Studio, выберите пункт Средства > Получить средства и компоненты. , после чего запустится Visual Studio Installer. Запускается Visual Studio Installer. Выберите рабочую нагрузку Разработка классических приложений на C++ , а затем нажмите Изменить.
Создание проекта
Сначала вы создадите проект консольного приложения на C++. Для этого типа проекта уже имеются все нужные файлы шаблонов, что избавляет вас от лишней работы.
Откройте Visual Studio 2017.
В верхней строке меню последовательно выберите Файл > Создать > Проект.
В левой области диалогового окна Новый проект разверните узел Visual C++ и выберите Рабочий стол Windows. В средней области выберите Консольное приложение Windows. Назовите проект get-started-debugging.
Новый проект открывается в Visual Studio.
Запустите Visual Studio.
Если окно запуска не открыто, выберите Файл > Окно запуска.
На начальном экране выберите Создать проект.
В поле поиска окна Создание проекта введите консоль. Затем выберите C++ в списке языков и Windows в списке платформ.
Применив фильтры языка и платформы, выберите шаблон Консольное приложение и нажмите кнопку Далее.
В поле Имя проекта окна Настроить новый проект введите get-started-debugging. Затем нажмите Создать.
Новый проект открывается в Visual Studio.
Создание приложения
Откройте файл get-started-debugging.cpp и замените все его содержимое по умолчанию следующим кодом:
Запуск отладчика
Нажмите клавишу F5 (Отладка > Начать отладку) или кнопку Начать отладку на панели инструментов отладки.
При нажатии клавиши F5 происходит запуск приложения с присоединенным отладчиком. Но пока мы не сделали ничего особенного, чтобы проанализировать код. Поэтому приложение будет просто загружено, и вы увидите выходные данные консоли.
В этом руководстве мы более подробно рассмотрим приложение с отладчиком и познакомимся с возможностями отладчика.
Остановите отладчик, нажав красную кнопку остановки (SHIFT + F5).
В окне консоли нажмите клавишу ВВОД, чтобы закрыть его.
Установка точки останова и запуск отладчика
В цикле for функции main установите точку останова, щелкнув левое поле следующей строки кода:
В месте установки точки останова появится красный круг .
Точки останова — это один из самых простых и важных компонентов надежной отладки. Точка останова указывает, где Visual Studio следует приостановить выполнение кода, чтобы вы могли проверить значения переменных или поведение памяти либо выполнение ветви кода.
Нажмите клавишу F5 или кнопку Начать отладку. Запустится приложение и отладчик перейдет к строке кода, где задана точка останова.
Желтая стрелка представляет оператор, на котором приостановлен отладчик. В этой же точке приостанавливается выполнение приложения (этот оператор пока не выполнен).
Если приложение еще не запущено, клавиша F5 запускает отладчик и останавливается в первой точке останова. В противном случае F5 продолжает выполнение приложения до следующей точки останова.
Точки останова полезны, если вам известны строка или раздел кода, которые вы хотите подробно изучить. Дополнительные сведения о различных типах точек останова, которые можно задать, например об условных точках останова, см. в разделе Использование точек останова.
Переход по коду в отладчике с помощью пошаговых команд
Здесь мы используем в основном сочетания клавиш, так как они позволяют быстро выполнять приложение в отладчике (эквивалентные команды, например команды меню, отображаются в круглых скобках).
Во время приостановки в цикле for в методе main дважды нажмите клавишу F11 (или выберите Отладка > Шаг с заходом), чтобы перейти к вызову метода SendMessage .
После двойного нажатия клавиши F11 вы должны находиться на следующей строке кода:
Еще раз нажмите клавишу F11, чтобы выполнить шаг с заходом в метод SendMessage .
Желтый указатель перемещается в метод SendMessage .
F11 — это команда Шаг с заходом, которая выполняет приложение с переходом к следующему оператору. Клавишу F11 удобно использовать для более детальной проверки потока выполнения. (Мы также покажем другие варианты более быстрого перемещения по коду.) По умолчанию отладчик пропускает непользовательский код (дополнительные сведения см. в статье об отладке в режиме "Только мой код").
Предположим, что вы закончили изучать метод SendMessage и хотите выйти из него, но остаться в отладчике. Это можно сделать с помощью команды Шаг с выходом.
Нажмите сочетание клавиш SHIFT + F11 (или Отладка > Шаг с выходом).
Эта команда возобновляет выполнение приложения (и работу отладчика) до возврата данных текущим методом или текущей функции.
Вы должны вернуться в цикл for в методе main , приостановленный на вызове метода SendMessage .
Нажмите клавишу F11 несколько раз, пока не вернетесь к вызову метода SendMessage .
Во время приостановки на вызове метода один раз нажмите клавишу F10 (или выберите Отладка > Шаг с обходом).
Обратите внимание, что в этот раз отладчик не заходит в метод SendMessage . Клавиша F10 перемещает отладчик без захода в функции или методы в коде приложения (код продолжает выполняться). Нажав клавишу F10 (а не F11) в вызове метода SendMessage , мы пропускаем код реализации для SendMessage (пока это нас не интересует). Дополнительные сведения о различных способах перемещения по коду см. в разделе Навигация по коду в отладчике.
Переход по коду с помощью команды "Выполнение до щелкнутого"
Нажмите клавишу F5, чтобы перейти к точке останова.
В редакторе кода прокрутите вниз и наведите указатель мыши на функцию std::wcout в методе SendMessage , чтобы в левой части появилась зеленая кнопка Выполнение до щелкнутого. В подсказке для кнопки выводится "Выполнить до этого места".
Кнопка Выполнение до щелкнутого впервые появилась в Visual Studio 2017. (Если кнопка с зеленой стрелкой отсутствует, воспользуйтесь клавишей F11, чтобы переместить отладчик в нужное место.)
Отладчик перемещается к функции std::wcout .
Использование этой кнопки аналогично установке временной точки останова. Функция Выполнение до щелкнутого удобна для быстрой работы в видимой области кода приложения (можно щелкнуть в любом открытом файле).
Быстрый перезапуск приложения
Кнопка Перезапустить позволяет сэкономить время, затрачиваемое на остановку приложения и перезапуск отладчика. Отладчик приостанавливается в первой точке останова, достигнутой при выполнении кода.
Отладчик еще раз останавливается в точке останова, ранее заданной вами в цикле for .
Проверка переменных с помощью подсказок по данным
Функции, позволяющие проверять переменные, являются самыми полезными возможностями отладчика. Реализовывать эту задачу можно разными способами. Часто при попытке выполнить отладку проблемы пользователь старается выяснить, хранятся ли в переменных значения, которые требуются ему в определенное время.
При приостановке на операторе name += letters[i] наведите указатель мыши на переменную letters и увидите ее значение по умолчанию — size= .
Разверните переменную letters , чтобы просмотреть ее свойства, включая все элементы, которые она содержит.
Затем наведите указатель мыши на переменную name , чтобы просмотреть ее текущее значение — пустую строку.
Несколько раз нажмите клавишу F5 (или выберите Отладка > Продолжить), чтобы выполнить несколько итераций по циклу for , каждый раз снова приостанавливая выполнение в точке останова и наводя указатель мыши на переменную name , чтобы просмотреть ее значение.
Значение переменной изменяется при каждой итерации цикла for — f , затем fr , fre и т. д.
Часто при отладке требуется быстро проверить значения свойств в переменных, чтобы убедиться, что в них хранятся ожидаемые значения. Советы по данным — отличный способ это сделать.
Проверка переменных с помощью окон "Видимые" и "Локальные"
Взгляните на окно Видимые в нижней части редактора кода.
Если оно закрыто, откройте его во время приостановки в отладчике, выбрав Отладка > Окна > Видимые.
В окне Видимые отображаются переменные и их текущие значения. В окне Видимые отображаются все переменные, используемые в текущей или предыдущей строке (сведения о зависящем от языка поведении см. в соответствующей документации).
Затем посмотрите на окно Локальные на вкладке рядом с окном Видимые.
Разверните переменную letters , чтобы отобразить элементы, которые она содержит.
В окне Локальные показаны переменные, которые находятся в текущей области, то есть текущем контексте выполнения.
Установка контрольного значения
В основном окне редактора кода щелкните правой кнопкой мыши переменную name и выберите команду Добавить контрольное значение.
В нижней части редактора кода откроется окно Контрольное значение. В окне Контрольное значение можно указать переменную (или выражение), которую необходимо отслеживать.
Теперь у вас есть контрольное значение, заданное для переменной name , и по мере перемещения по отладчику вы можете наблюдать за изменением его значения. В отличие от других окон переменных, в окне Контрольное значение всегда отображаются просматриваемые вами переменные (они выделяются серым цветом, когда находятся вне области действия).
Просмотр стека вызовов
Во время приостановки в цикле for щелкните окно Стек вызовов, которое по умолчанию открыто в нижней правой области.
Если оно закрыто, откройте его во время приостановки в отладчике, выбрав Отладка > Окна > Стек вызовов.
Несколько раз нажмите клавишу F11, пока отладчик не приостановится в методе SendMessage . Взгляните на окно Стек вызовов.
В окне Стек вызовов показан порядок вызова методов и функций. В верхней строке приведена текущая функция (в данном приложении метод SendMessage ). Во второй строке показано, что функция SendMessage была вызвана из метода main и т. д.
Окно Стек вызовов аналогично перспективе "Отладка" в некоторых интегрированных средах разработки, например Eclipse.
Стек вызовов хорошо подходит для изучения и анализа потока выполнения приложения.
Дважды щелкните строку кода, чтобы просмотреть исходный код. При этом также изменится текущая область, проверяемая отладчиком. Это действие не перемещает отладчик.
Для выполнения других задач можно воспользоваться контекстными меню из окна Стек вызовов. Например, можно вставлять точки останова в указанные функции, перемещать отладчик с помощью функции Выполнение до текущей позиции и изучать исходный код. Дополнительные сведения см. в разделе Практическое руководство. просмотреть стек вызовов.
Изменение потока выполнения
Дважды нажмите клавишу F11, чтобы запустить функцию std::wcout .
Приостановив отладчик в вызове метода SendMessage , с помощью мыши захватите желтую стрелку (указатель выполнения) в левой части и переместите ее вверх на одну строку — обратно в std::wcout .
Нажмите клавишу F11.
Отладчик повторно выполнит функцию std::wcout (вы увидите это в выходных данных окна консоли).
Изменяя поток выполнения, можно решать множество задач, например тестировать различные пути выполнения кода или повторно выполнять код без перезапуска отладчика.
Как правило, при работе с этой функцией необходимо соблюдать осторожность — вы увидите соответствующее предупреждение во всплывающей подсказке. Могут отображаться и другие предупреждения. При перемещении указателя предыдущее состояние приложения не возвращается.
Чтобы продолжить выполнение приложения, нажмите клавишу F5.
Поздравляем с завершением этого учебника!
Следующие шаги
В этом руководстве вы узнали, как запускать отладчик, осуществлять пошаговое выполнение кода и проверять переменные. Возможно, вы захотите получить более полное представление о функциях отладчика, а также воспользоваться ссылками на дополнительные сведения.
Отладка кода в Visual Studio происходит довольно просто, если сравнивать это т процесс с другими IDE. Плюс отладчик Visual Studio обладает довольно широкими возможностями и позволяет отлаживать различные технологии, а если имеющихся средств не хватает, то можно воспользоваться дополнениями.
Отладка кода — это один из самых важных процессов. Без отладки в свет не выходит ни одно нормальное приложение. Потому что , независимо от опыта разработчика, код не всегда работает так , как нужно. А иногда и вообще работает совершенно не так. Вот тут как раз и приходит на помощь отладчик, который позволит разобраться , что не так , и найти изъяны. Можно , конечно , много часов провести за самостоятельным выявлением багов, но отладчиком все-таки быстрее и проще.
В то же время отладка кода — это не волшебная палочка, которая быстренько найдет и исправит все недочеты вашего кода. Отладка — это процесс, при котором код пошагово выполняется в некой программе, например , в Visual Studio. В процессе выполнения идет поиск точек, где вы могли допустить ошибку. А вы в это время можете анализировать свой код и вносить необходимые правки для устранения «косяков».
Работа с отладчиком , даже с таким простым , как Visual Studio, требует определенных знаний и понимания , что там внутри происходит. Умение работать с отладчиком вам в любом случае пригодится, если вы хотите связать свою жизнь с разработкой ПО. В этой статье мы ознакомим вас с процессом отладки при помощи Visual Studio.
Отладка кода в Visual Studio
- орфографические ошибки или опечатки,
- неправильно подключенные API,
- неправильное размещение последних корректировок в код,
- и др.
- ошибка компиляции;
- ошибка преобразования типа;
- код не поддерживает синтаксис;
- и др .
Как запустить отладчик Visual Studio
- Запустить саму программу Visual Studio.
- Откр ыть код приложения, который необходимо отладить.
- Потом при помощи нажатия клавиши «F5» запустить режим отладки. Также это можно сделать через меню, если нажать «Отладка», а потом «Начать отладку» .
последовательность исполнения кода;
работу памяти;
значение переменных и др.
Какая информация выводится отладчиком Visual Studio
В заключение
Отладка в Visual Studio дает возможность довольно быстро решить проблемы с вашим кодом. Да, без определенных знаний и понимания запустить и понять отладчик Visual Studio будет нелегко, но с опытом все станет понятнее. В разработке без отладки кода — путь в никуда , п отому что стабильность работы приложения — это залог его качества. И если на самом старте разработк и игнорировать этот процесс, то нет смысла идти дальше.
Мы будем очень благодарны
если под понравившемся материалом Вы нажмёте одну из кнопок социальных сетей и поделитесь с друзьями.
Класс взаимодействия с отладчиком (Debugger).
Самый часто используемый мной класс это Debugger, дающий возможность взаимодействовать с отладчиком студии и постараюсь описать ситуации использования отдельных методов этого класса.
Метод Debugger.Launch()
- Если вы находитесь в режиме отладки, то при вызове этого метода ничего происходить не будет
- Если запустить ваше приложение вне студии, то при вызове этого метода появится диалог с предложением использовать один из предложенных в списке отладчиков. При этом продолжить работу без использования отладчика невозможно.
Запустив по F5 в студии вы ничего не заметите, но запусти в проводнике увидите диалог:
В котором можете выбрать либо уже запущенную студию (у меня это 1-я строка), либо использовать новый экземпляр студии по вашему выбору.
Внимание! Если "New instance Microsoft . ", тогда весь код проекта будет не доступен. Поэтому желательно выбирать студию с отрытым вашим проектом.
- При отладке двух процессов, когда ваше приложение запускает второе приложение, которое быстро "что то делает" и закрывается. При этом вы не успеваете сделать Debug -> Attach to process.
- Допустим вы являетесь разработчиком какого то расширения или add-on для какой то системы. При запуске система подгружаете ваш модуль в память и передает ему управление. Встает вопрос, как же теперь отлаживать ситуацию в момент запуска модуля? В этом случае добавляем в код метода Debugger.Launch() и в момент запуска получаем возможность отладить процесс запуска.
P. S. Если вы пользуетесь Thread.Sleep(15000) + Attach to process, то мои вам соболезнования :)
Метод Debugger.Break()
- Если отладчик подключен, то происходит остановка при вызове методе, сравнимая остановке на breakpoint .
- Если же отладчик не подключен и вызывается метод Break(), тогда будет показано окно с выбором отладчика, но при этом закрыв его приложение продолжит работу.
На практике использовал этот метод довольна редко, но было дело, что студия "глючила" и breakpoint слетали после перезапуска. Выходом был этот метод.
Output window и класс Debug.
Мне кажется, что люди не дооценивают окно Output внутри Visual Studio убирая его с рабочего пространства, а ведь это просто идеальная консоль для вывода событий происходящих в приложении и просто спасительный круг, если вы отлаживаете сложное многопоточное приложение. Либо пытаясь распутать какие то ситуации, где требуется анализ параметров и локальных переменных, что бы понять причину неисправности. Сейчас я постараюсь продемонстрировать как использовать Output, но при этом не загромождать им место.
- Окно Output не присутствует на видимом рабочем пространстве. А находится где то снизу на вкладках, при этом программист может иногда поглядывать туда.
- Окно Output всегда видно, но имеет настолько малый размер, что в нем ничего не понятно. При сборке что то мелькает, а на вопрос "Зачем тебе оно если ничего не понятно?" получал ответ "Что бы знать, что студия не подвисла и было на что поглядеть".
- Последний вариант, программист активно пользуется им и читает, что пишется в окне. Но при этом в окне два scroll умещается 4-6 строчек, а при работе приложение внутри мелькает текст и бедняга программист пытается найти нужное место.
Если вы из пункта 3 тогда хотел бы предложить мой способ размещения окна, которым я пользуюсь и перенастраиваю везде уже так в течении 5 лет. На всё про всё уходит 5-10 минут, но бывают и такие которые годами будут пользоваться неудобным интерфейсом или способом, при этом зная, что правится проблема в считанные минуты, но человеку "Лениво разбираться" :)
Пошаговая инструкция:
- Открепляем окно Ouput и перетаскиваем его в правую часть окна, закрепляя ее на фиксаторе как на картинке:
Теперь мы будем видеть вывод через Debug.Write и настроенный Debug.Trace.
Настройка Log4net и TraceAppender к нему:
Атрибут DebuggerDisplayAttribute.
Представьте жизненную ситуацию, у вас имеется ссылка на массив из объектов и вам надо как то посмотреть значение его полей. Для этого вам потребуется нажимать на стрелочку напротив каждого элемента, что бы увидеть внутренние поля которые вам нужны. Если у вас 3-5 объектов то это можно проделать вручную, но представьте, что там 100 объектов, а вам надо найти тот, у которого определенное значение поля. В итоге либо писать отдельный код который бы отфильтровал вам объекты и оставит нужный. Или можно использовать замечательный атрибут DebuggerDisplayAttribute, который, в режиме отладки, покажет вам всю необходимую для вас информацию об объекте.
Постараюсь продемонстрировать работу на примере. Имеется код:
После запуска в массиве people у вас будут лежать объекты Man со случайными значениями поля возраст. Допустим ваша задача узнать, есть ли объекты с именем "Sergei" в массиве. Запускаем приложение встаем на точке останова, выделяем people жмем "Quick Watch" и видим, что для того, что бы узнать имя нам потребуется у каждого объекта отрывать поля:
По умолчанию отладчик выводит значение .ToString() объекта, он у нас не перегружен, поэтому ToString() выводит значение базового Object.ToString() выводящего имя класса. Поэтому я добавлю атрибут DebuggerDisplay к классу Man. Пример:
Запустился и в "Quick Watch" видим совершенно другую картину:
Как это работает?
Очень просто, для понимания строку "Name = , Age = " стоит представлять как string .Format( "Name = , Age = " , Name, Age ), где на место фигурных скобок < >будет подставлено значение поля с именем Name и Age. Так же можно использовать выражение и даже вызывать методы, как если бы мы работали с объектом напрямую.
Запустившись и увидим вот такую картинку:
- Если свойство или поле вашего класса имеет значение NULL, а вы обратитесь к его свойству открыв окно отладчика, тогда будет NullReferenceException, который отобразится строкой. Поэтому, что бы DebuggerDisplay отображал все объекты корректно, стоит обрабатывать обращение к NULL полю.
- Перед добавлением значения стоит помнить, что если обращение к свойству или методу приводит к запросу к БД или обращение к серверу, то и очевидно, что перед показом отладчик будет делать то же самое. Будьте к этому готовы.
- Все изменения с полями\свойствами\объектами вызванными внутри форматированной строки останутся, как если бы вы сами это поменяли. Будьте внимательны!
Перемещение вектора исполнения в Visual Studio.
- Имеется метод, допустим импорта чего либо, выполняющийся длительное время. В конце метода есть место, которое требуется отладить. Мы ставим breakpoint, запускаем импорт и в хоте отладки по F10 понимаем, что мы прошли место, которое надо было изучить более пристально. Как решить эту проблему? Пока что, если только перезапустить импорт и вновь дойти до этого места.
- Допустим в импорте из пункта 1. есть условие IF+ELSE внутрь IF зайти легко, а что бы выполнилось условие ELSE требуется еще какие то сложные подготовительные действия. Можно за комментировать условие IF оставить только вызов ELSE, но хардкод это не очень удобный вариант.
- Вы находитесь в методе, и хотите произвести повторную отладку, но для этого вам понадобится по новой запустить приложение, а значит затратить лишнее время на ожидание и можете банально забыть, что же вы хотели проверить.
Эти и другие ситуации можно решить очень простым способом. Произведя перемещение вектора исполнения (желтую стрелочку) на позицию доступную из текущего места, тем самым продолжить отладку с другого места..
Это обычное консольное приложение, на нем видно как я вектор исполнения перемещаю в нужное мне место и код продолжает выполняться, как если бы было сделано GOTO. При этом передвигаясь вперед или назад, это не откат назад или пропуск операций и остановка в нужном месте Все действия это реальные переходы, и вполне можно так пропустить инициализацию какой то переменно, перейти к обращению не инициализированной переменной, то получите NullReferenceException в 100% рабочем коде. Поэтому перед тем как перемещать стоит внимательно посмотреть является ли переход "Корректным". Если хотите пройти метод снова, то обязательно переводите исполнение на повторную инициализацию локальных переменных.
Правка кода в режиме отладки [Edit and continue].
Хочу рассказать о еще одной feature в Visual Studio, которая может упростить процесс написания кода, когда тебе надо написать работу с классом, но тебе не известно, что хранится в его полях. В этом случае написание сводится к череде:
- "Запуск" приложения и проход до места работы с объектом.
- Изучение значения одного из полей
- Остановка приложения, с целью внести правки или дописать код для работы с объектом.
- Повтор первого шага
- Ставлю точку останова в месте, где интересующий меня объект доступен по ссылке.
- Запускаю решение и дохожу до точки останова
- Затем уже в месте, где собираюсь писать код для работу с этим объектом начиная подсматриваю по мере необходимости его поля.
Внимание! Код который был написан не компилируется на лету, и при проходе через него возможны визуальные искажения, не стоит на это обращать внимание, так как Visual Studio оперирует данными по смещениям и размерам методов из pdb, которые были собраны до запуска.
Палочка выручалочка "Immediate Window".
За всё время пока я занимаюсь программированием под .NET Framework я ни разу не видел, что бы кто то при мне пользовался "Immediate Window" в Visual Studio, поэтому если ты слышишь про него первый раз, то обязательно добавь его на рабочее пространство и используй! А вот как, я расскажу прям сейчас.
- Появляется необходимость вызвать какой то метод доступный из текущего места.
- У локальной переменной хотим заменить значение БЕЗ перезапуска приложения
- Посмотреть результат выполнения
- Иными словами хочется вставить и исполнить какую то временную инструкцию.
Думаете это не возможно? Вы ошибаетесь - выход это "Immediate Window". Встав на точку останова вы можете писать не просто выражения, вызывать методы, но и менять значения переменных локальных и глобальных. При этом данный код будет выполняться отдельно от вашего исходного текста программы.
Пример использования:
- В самом окне работает IntelliSence поэтому проблем с именами быть не должно.
- Само окно в случае, если введенное выражение возвращает какой то сложный объект, используется продвинутый Formatter, который покажет в читабельном виде все его поля.
- Не обязательно указывать ";" после каждого выражения.
- Очень удобно использовать когда надо вывести все поля в читабельном виде.
- Стрелками "Вверх\вниз" можно подставить ранее введенные выражения.
- Можно задавать значения локальных переменных
Данное окно очень спасало, когда требовалось в режиме реального времени проверить передачу какого то хардкодного параметра методу, либо заменить значение локальной переменной на что то нужное.
Остановка по требованию или Condition breakpoints.
Breakpoint пользуются все, но стоит помнить о том, что можно указать условие срабатывания точки останова. Бывает часто, что метод вызывается N раз, и требуется на K итерации проверить какой то значение. Если по каким то причинам вы не знает про Condition breakpoints то погнали!
Допустим есть код:
Наша цель, когда i будет равно 500 остановиться и узнать полученное значение от суммы со случайным числом. Если вы садомазахист, то можете поставить точку останова и 500 раз нажимать F5. Но лучшим решением будет поставить точку останова в начале метода, выбрать "Conditions. ":
В появившемся окне в поле "условие" вводим "i == 500" и если условие указано без ошибок, то по нажатию на Enter красная точка поменяет свой вид на точку с плюсом.
Запускаем программу и видим, что мы остановились на месте, когда значение i стало 500.
Внимание! Наблюдается падение производительности приложения, когда присутствуют данные точки останова, поэтому после окончания работы следует обязательно удалять их всех, потому что даже в выключенном режиме они создают тормоза.
Удалённый отладчик Remote Debugger.
Допустим вам в какой то ситуации потребовалось отладить вашу программу на другом компьютере. Вы скачиваете на нее исходный код, устанавливаете студию и начинаете отладку. В таком случае есть возможность работать в студии, которая стоит на вашем компьютере, а к удалённому компьютеру, для отладки, подключаться через Remote Debugger Tools.
Важно знать! Что нужно ставить Remote Debugger Tools для версии вашей студии, обратную совместимость версии не гарантируется. Поэтому если у вас к примеру Visual Studio 2012, тогда нужно искать Remote Debugger для 2012.
Всю настройку описывать не буду, по адресу Remote Debugging можно получить всю интересующую информацию.
Отладка без полного исходного кода приложения
Ситуация, когда требуется у заказчика отладить какой то код или модуль, при этом у вас есть только RDP доступ к рабочей машине и все остальные порты закрыты, и никакой Remote Debugger не поможет. В этой ситуации хочешь не хочешь придётся поставить Visual Studio, благо у неё есть триальный период, но встаёт вопрос, что делать с исходными кодами? Переносить весь код вашего решения, за которое заказчик платит деньги как то стрёмно, но есть выход. В случае если требуемое место находися в отдельном модуле тогда можно ограничиться переносом его и далее делая Debug > Attach to process и расставив точки останова можно отладить его.Но допустим у вам известен файл, который надо отладить в таком случае не надо копировать весь исходный код модуля. Достаточно скопировать только файл MyModule.cs на стенд заказчика, отрываем его студией цепляемся к работающиму процессу ставим точки останова и отлаживаемся!
Читайте также: