Поделиться через


Просмотр стека вызовов и использование окна стека вызовов в отладчике

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

Если символы отладки недоступны для части стека вызовов, окно стека вызовов может не отображать правильные сведения для этой части стека вызовов, отображая вместо этого:

[Frames below may be incorrect and/or missing, no symbols loaded for name.dll]

Заметка

Отображаемые диалоговые окна и команды меню могут отличаться от описанных здесь в зависимости от активных параметров или выпуска. Чтобы изменить параметры, выберите Параметры импорта и экспорта в меню инструментов. См. Сброс всех параметров. Окно стек вызовов похоже на вид отладки в некоторых средах разработки, таких как Eclipse.

Просмотр стека вызовов в отладчике

При отладке в меню отладки выберите Windows > стек вызовов или нажмите клавишу ctrl+alt+C.

Заметка

Параметр меню "Отладка > стека вызовов Windows" > доступен только во время активного сеанса отладки. Сначала запустите отладку (например, нажав клавишу F5 или выбрав Отладка > Начать отладку), а затем приостановите выполнение в точке останова перед открытием окна стека вызовов.

Снимок экрана: окно стека вызовов. Стрелка определяет кадр стека, на котором находится указатель выполнения. По умолчанию эти данные кадра стека отображаются в исходном коде, локальные, автозапуска, контрольныеи дизассембли окнах. Чтобы изменить контекст отладчика на другой кадр в стеке, переключиться на другой кадр стека.

Снимок экрана, демонстрирующий окно стека вызовов. Стрелка указывает на кадр стека, где в настоящее время расположен указатель выполнения. По умолчанию эти данные кадра стека отображаются в исходном коде, локальные, автозапуска, контрольныеи дизассембли окнах. Чтобы изменить контекст отладчика на другой кадр в стеке, переключиться на другой кадр стека.

Вы также можете просматривать кадры исключений в стеке вызовов во время отладки. Дополнительные сведения см. в разделе Просмотр стека вызовов в средствепомощи при исключениях.

Анализ стека вызовов с помощью Copilot

Вы можете получить анализ текущего состояния отладки, проводимый с использованием ИИ, в контексте окна стека вызовов. Эта функция помогает ответить на вопрос: что мой поток или приложение делают прямо сейчас? При нажатии кнопки "Анализ с помощью Copilot" текущее состояние отладки отправляется в Copilot, открывая окно чата с анализом состояния приложения, и нет необходимости вручную описывать контекст отладки.

Прежде чем использовать эту функцию, убедитесь, что Copilot включен и приложение приостановлено в отладчике.

Чтобы проанализировать стек вызовов, выполните следующие действия.

  1. Когда Copilot определяет проблему стека вызовов, например, кадр, ожидающий асинхронной задачи, или если выполнение завершается сбоем во время асинхронных операций, Copilot показывает кнопку "Анализ с помощью Copilot" рядом с соответствующим кадром в окне "Стек вызовов".
  2. Выберите "Анализ с помощью Copilot".

Снимок экрана, показывающий анализ из окна стека вызовов.

Copilot анализирует и синхронные, и асинхронные стеки вызовов, а также добавляет аннотации в соответствующие кадры. Вы можете проанализировать кадр, чтобы получить четкое объяснение:

  • Почему выполнение приостановлено
  • На чем ждёт поток
  • Как выполнение дошло до текущей точки

Благодаря этому из статического списка фреймов стек вызовов превращается в интерактивный инструмент для отладки. Вместо того, чтобы вручную воссоздавать асинхронные потоки, Copilot помогает быстро выполнить анализ поведения среды выполнения и вернуться к работе над устранением реальной проблемы.

Дополнительные сведения об отладке с помощью Copilot см. в статье Отладка приложения с помощью GitHub Copilot.

Отображение кода, отличного от пользователя, в окне "Стек вызовов"

Чтобы отобразить внешний или непользовательский код, нажмите кнопку "Показать внешний код" на панели инструментов стека вызовов или щелкните правой кнопкой мыши в окне " Стек вызовов" и выберите "Показать внешний код".

Код, не относящийся к пользовательскому, — это любой код, который не отображается при включении функции Just My Code. В управляемом коде кадры, не относящиеся к пользовательскому коду, скрыты по умолчанию. Следующая нотация отображается вместо фреймов, содержащих код, не относящийся к пользователю:

[<External Code>]

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

  • трассировка, где исключение пересекает границы фреймворка
  • понимание путей обратного вызова и путей диспетчеризации событий
  • определение того, где элемент управления возвращается из кода библиотеки в ваш код

Переключение на другой кадр стека (изменение контекста отладчика)

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

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

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

  2. Выберите , чтобы переключиться на кадр.

    Зеленая стрелка с фигурным хвостом отображается рядом с выбранным кадром стека. Указатель выполнения остается в исходном кадре, который по-прежнему отмечен желтой стрелкой. Если выбрать шагили продолжить в меню Отладка, выполнение будет продолжаться в исходном кадре, а не в выбранном кадре.

Переключите кнопку "Просмотреть все потоки" , чтобы просмотреть все связанные потоки в окне Parallel Stack. Окно Parallel Stacks визуализирует стеки вызовов для многопоточных приложений.

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

Снимок экрана: связанные потоки в окне Parallel Stacks.

Кадры стека вызовов можно найти, введя термины в поле поиска в верхнем левом углу окна Call Stack.

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

Просмотр исходного кода функции в стеке вызовов

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

Выполнить переход к определенной функции из окна стека вызовов

В окне стека вызовов выберите функцию, щелкните правой кнопкой мыши и выберите Запуск до курсора.

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

Установите точку останова на момент выхода из вызова функции

См. раздел Установите точку останова в функции стека вызовов.

Отображение вызовов к другому потоку или из другого потока

Щелкните правой кнопкой мыши окно стека вызовов: выберите Включить вызовы в/из других потоков.

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

Визуально проследите стек вызовов

В Visual Studio Enterprise (только) можно просматривать карты кода для стека вызовов во время отладки.

В окне стека вызовов откройте контекстное меню. Выберите показать стек вызовов на карте кода (CTRL + SHIFT + `).

Дополнительные сведения см. в разделе Методы Сопоставления в стеке вызовов при отладке.

показать стек вызовов на карте кода

Просмотр кода дизассембли для функции в стеке вызовов (C#, C++, Visual Basic, F#)

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

Изменение отображаемых необязательных сведений

Щелкните правой кнопкой мыши окно стека вызовов и установите или снимите флажок Показать <нужные> сведения.

Используйте эти варианты для настройки сведений о фрейме, чтобы стек выделял информацию, которая важна для вас во время расследования.

Автоматическая декомпиляция внешнего кода .NET

Начиная с Visual Studio 2022 версии 17.7, можно автокомпилировать код .NET, дважды щелкнув внешний код в окне стека вызовов. Дополнительные сведения см. в статье Создание исходного кода из сборок .NET при отладке.

Загрузка символов для модуля (C#, C++, Visual Basic, F#)

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

См. Укажите символы (.pdb) и файлы исходного кода.

Загрузка символов

  1. В окне "Стек вызовов" щелкните правой кнопкой мыши на кадре стека, для которого не загружены символы. Рамка будет затемнена.

  2. Наведите указатель на Загрузить символы, а затем выберите Серверы символов Microsoft (при наличии) или перейдите по пути к символам.

Установить путь к символам

  1. В окне стека вызовов выберите параметры символов в контекстном меню.

    Откроется диалоговое окно параметров и откроется страница символов.

  2. Выберите параметры символов .

  3. В диалоговом окне «Параметры» щелкните значок папки.

    В поле расположений файла символов (.pdb) появится курсор.

  4. Введите путь к каталогу, где находятся символы на компьютере, на котором осуществляется отладка. Для локальной и удаленной отладки это путь на локальном компьютере.

  5. Нажмите ОК, чтобы закрыть диалоговое окно "Параметры".