Просмотр потоков и задач в окне Параллельных стеков (C#, Visual Basic, C++)
Окно параллельных стеков полезно для отладки многопоточных приложений. В нем есть несколько представлений:
В представлении потоков отображаются сведения о стеке вызовов всех потоков в приложении. Вы можете переключаться между потоками и кадрами стека в этих потоках.
в окне «Задачи» отображается информация о стеке вызовов, ориентированной на задачи.
- В управляемом коде в представлении "Задачи " отображаются стеки вызовов объектов System.Threading.Tasks.Task.
- В машинном коде представления "Задачи" отображаются стек и вызовов групп задач, параллельных алгоритмов, асинхронных агентови упрощенных задач.
Метод Просмотр центрирует стек вызовов на выбранном методе.
Использование окна Параллельных стеков
Чтобы открыть окно параллельных стеков, необходимо находиться в сеансе отладки. Выберите Отладка>Windows>Параллельные стеки.
Элементы управления панели инструментов
В окне параллельных стеков есть следующие элементы управления панелью инструментов:
Икона | Контроль | Описание |
---|---|---|
![]() |
комбинированный список потоков/задач | Переключает представление между стеками вызовов потоков и стеками вызовов задач. Дополнительные сведения см. в представлении задач и представлении потокови. |
![]() |
Показать только помеченные | Отображает стеки вызовов только для потоков, помеченных в других окнах отладчика, таких как окно потоков GPU и окно параллельных часов. |
значок переключения представления метода ![]() |
Переключение представления метода | Переключается между представлениями стека вызовов и представлением метода . Для получения дополнительной информации см. представление метода. |
![]() |
Автоматическая прокрутка до текущего кадра стека | Автоматически прокручивает график, чтобы текущий кадр стека становился видимым. Эта функция полезна при изменении текущего кадра стека из других окон или при достижении новой точки останова в больших графах. |
![]() |
Переключатель управления масштабированием | Отображает или скрывает элемент управления масштабированием слева от окна. Независимо от видимости элемента управления масштабированием, вы также можете увеличить масштаб, нажав клавиши CTRL и щелкнув колесико мыши или нажав клавиши CTRL+SHIFT++, чтобы увеличить масштаб и CTRL+SHIFT+- уменьшить масштаб. |
Икона | Контроль | Описание |
---|---|---|
![]() |
комбинированный список потоков/задач | Переключает представление между стеками вызовов потоков и стеками вызовов задач. Дополнительные сведения см. в представлении задач и представлении потокови. |
Значок фильтра ![]() |
Контроль фильтра | Отображает стеки вызовов только для определенного набора потоков, которые вас интересуют. |
![]() |
Показать только помеченные | Отображает стеки вызовов только для потоков, помеченных в других окнах отладчика, таких как окно потоков GPU и окно параллельных часов. |
значок переключения представления метода ![]() |
Переключение представления метода | Переключается между представлениями стека вызовов и представлением метода . Для получения дополнительной информации см. представление метода. |
![]() |
Автоматическая прокрутка до текущего кадра стека | Автоматически прокручивает график, чтобы текущий кадр стека становился видимым. Эта функция полезна при изменении текущего кадра стека из других окон или при достижении новой точки останова в больших графах. |
![]() |
Переключатель управления масштабированием | Отображает или скрывает элемент управления масштабированием слева от окна. Независимо от видимости элемента управления масштабированием, вы также можете увеличить масштаб, нажав клавиши CTRL и щелкнув колесико мыши или нажав клавиши CTRL+SHIFT++, чтобы увеличить масштаб и CTRL+SHIFT+- уменьшить масштаб. |
![]() |
Элемент управления поиском | С помощью этой функции можно легко искать кадры стека, а затем использовать стрелки для перехода между этими результатами. |
значок ![]() |
Сохранить настройки управления | Позволяет сохранять и экспортировать содержимое из параллельного окна стека в виде изображения. |
![]() |
Показать внешний контроль кода | С помощью этой функции можно отображать и скрывать стеки из внешних кодов и библиотек. |
значок копилота ![]() |
Обобщение стека вызовов | Начиная с Visual Studio 2022 версии 17.13 (предварительная версия 4), вы можете выбрать Суммировать, когда Copilot установлен и активирован. Эта кнопка открывает окно чата Copilot, предварительно загруженное с соответствующим контекстом потока, что позволяет просматривать сведения, включая состояния потоков, вызовы функций и предлагаемые исправления. |
Значки кадра стека
Следующие значки содержат сведения о активных и текущих кадрах стека во всех представлениях:
Икона | Описание |
---|---|
![]() |
Указывает текущее расположение (активный кадр стека) текущего потока. |
![]() |
Указывает текущее расположение (активный кадр стека) неактивного потока. |
![]() |
Указывает текущий кадр стека (текущий контекст отладчика). Имя метода полужирное, где бы оно ни отображалось. |
Икона | Описание |
---|---|
![]() |
Указывает текущее расположение (активный кадр стека) текущего потока. |
![]() |
Указывает текущее расположение (активный кадр стека) неактивного потока. |
![]() |
Указывает текущий кадр стека (текущий контекст отладчика). Имя метода полужирное, где бы оно ни отображалось. |
![]() |
Указывает, что текущий кадр стека имеет предупреждение о критическом состоянии, например Взаимоблокировка. |
![]() |
Указывает взаимоблокируемый узел. |
Статусная информация ![]() |
Указывает, что текущий кадр стека содержит дополнительные сведения, такие как ожидание, ожидание блокировки, владение и т. д. |
![]() |
Указывает, что текущая задача находится в состоянии блокировки или ожидания и т. д. |
![]() |
Указывает выполняемую в данный момент задачу. |
Пункты контекстного меню
Следующие пункты контекстного меню доступны при щелчке правой кнопкой мыши на методе в представлении потоков или в представлении задач . Шесть последних предметов такие же, как в окне стека вызовов .
Элемент меню | Описание |
---|---|
флаг | Помечает выбранный элемент. |
снять флажок | Снимает флаг с выбранного элемента. |
замораживание | Заморозка выбранного элемента. |
оттепель | Оттаивает выбранный элемент. |
Переключитесь на кадр | Так же, как и соответствующая команда меню в окне стек вызовов. Однако в окне Параллельные стеки один метод может находиться в нескольких кадрах. Вы можете выбрать кадр, который требуется в подменю для этого элемента. Если один из кадров стека находится в текущем потоке, этот кадр выбирается по умолчанию в подменю. |
Перейти к задаче или Перейти к потоку | Переключается на задачи или потоки представления и сохраняет тот же кадр стека. |
перейти к исходному коду | Переходит в соответствующее место в окне исходного кода. |
перейти на разборку | Переходит в соответствующее расположение в окне дизассемблера. |
показать внешний код | Отображает или скрывает внешний код. |
шестнадцатеричный дисплей | Переключение между десятичным и шестнадцатеричным отображением. |
отобразить потоки в исходном коде | Помечает расположение потока в окне исходного кода. |
сведения о загрузке символов | Открывает диалоговое окно Сведения о Загрузке Символов. |
Параметры символов | Открывает диалоговое окно "Параметры символов". |
Элемент меню | Описание |
---|---|
Копировать | Скопируйте выбранный элемент. |
выберите все кадры ниже | Выбирает все кадры в выбранном стеке. |
флаг | Помечает выбранный элемент. |
снять флажок | Снимает флаг с выбранного элемента. |
замораживание | Заморозка выбранного элемента. |
оттепель | Оттаивает выбранный элемент. |
Переключитесь на кадр | Так же, как и соответствующая команда меню в окне стек вызовов. Однако в окне Параллельные стеки один метод может находиться в нескольких кадрах. Вы можете выбрать кадр, который требуется в подменю для этого элемента. Если один из кадров стека находится в текущем потоке, этот кадр выбирается по умолчанию в подменю. |
Перейти к задаче или Перейти к потоку | Переключается на задачи или потоки представления и сохраняет тот же кадр стека. |
перейти к исходному коду | Переходит в соответствующее место в окне исходного кода. |
перейти на разборку | Переходит в соответствующее расположение в окне дизассемблера. |
показать внешний код | Отображает или скрывает внешний код. |
шестнадцатеричный дисплей | Переключение между десятичным и шестнадцатеричным отображением. |
отобразить потоки в исходном коде | Помечает расположение потока в окне исходного кода. |
сведения о загрузке символов | Открывает диалоговое окно Сведения о Загрузке Символов. |
Параметры символов | Открывает диалоговое окно "Параметры символов". |
Просмотр потоков
В представлении потоки кадр стека и путь вызова текущего потока выделены синим цветом. Текущее расположение потока отображается желтой стрелкой.
Чтобы изменить текущий кадр стека, дважды щелкните другой метод. Это также может переключить текущий поток в зависимости от того, является ли выбранный метод частью текущего потока или другого потока.
Когда граф представления потоков слишком велик, чтобы поместиться в окно, в окне появляется элемент управления "Общий вид". В области управления можно переместить рамку, чтобы перейти к различным частям графа.
На следующем рисунке показан один поток, который выполняет переход от Main к переходу из управляемого кода в нативный код. Шесть потоков находятся в текущем методе. Два потока переходят в состояние Thread.Sleep, а два продолжают выполнение Console.WriteLine, а текущий поток переходит к SyncTextWriter.WriteLine.
В следующей таблице описаны основные характеристики представления потоков.
Выноска | Имя элемента | Описание |
---|---|---|
1 | Сегмент стека вызовов или узел | Содержит набор методов для единого или нескольких потоков. Если кадр не имеет стрелочных линий, подсоединённых к нему, кадр показывает весь путь вызова для потока(ов). |
2 | Синее выделение | Указывает путь вызова текущего потока. |
3 | Линии со стрелками | Подключите узлы, чтобы составить общий путь вызова для потока(ов). |
4 | Заголовок узла | Показывает количество процессов и потоков для узла. |
5 | Метод | Представляет один или несколько фреймов стека в одном методе. |
6 | Подсказка по методу | Отображается при наведении указателя мыши на метод. В представлении Потоков, подсказка отображает все потоки в таблице, аналогично окну Потоков. |
На следующем рисунке показан главный поток в переходе от управляемого кода к машинному коду. Пять потоков находятся в текущем методе. Четыре потока продолжают выполняться в контексте метода S.C, в то время как один рабочий поток продолжает переход с управляемого к родному коду, устанавливая имя на рабочем потоке.
В следующей таблице описаны основные характеристики представления потоков.
Выноска | Имя элемента | Описание |
---|---|---|
1 | Сегмент стека вызовов или узел | Содержит набор методов для единого или нескольких потоков. Если кадр не имеет стрелочных линий, подсоединённых к нему, кадр показывает весь путь вызова для потока(ов). |
2 | Синее выделение | Указывает путь вызова текущего потока. |
3 | Линии со стрелками | Подключите узлы, чтобы составить общий путь вызова для потока(ов). |
4 | Заголовок узла | Показывает количество процессов и потоков, имени потока и идентификатора потока для узла. |
5 | Метод | Представляет один или несколько фреймов стека в одном методе. |
6 | Подсказка по методу | Отображается при наведении указателя мыши на метод. В представлении Потоков, подсказка отображает все потоки в таблице, аналогично окну Потоков. |
7 | Описание потока | Созданное ИИ описание потока. Начиная с Visual Studio 2022 версии 17.13 preview 1, это описание присутствует при установке и активации Copilot. |
Просмотр задач
Если приложение использует объекты System.Threading.Tasks.Task (управляемый код) или объекты task_handle
(машинный код) для выражения параллелизма, можно использовать представление Задач. Представление "Задачи" показывает стеки вызовов задач вместо потоков.
В представлении задачи:
- Стеки вызовов потоков, которые не выполняют задачи, не отображаются.
- Стеки вызовов потоков, которые выполняют задачи, визуально обрезаются сверху и снизу, чтобы отобразить наиболее релевантные фреймы для задач.
- Если несколько задач находятся в одном потоке, стеки вызовов этих задач отображаются в отдельных узлах.
Чтобы просмотреть весь стек вызовов, вернитесь в просмотр потоков, щелкнув правой кнопкой мыши в рамке стека и выбрав Перейти к потоку.
На следующем рисунке показано представление потоков вверху и соответствующее представление задач внизу.
Наведите указатель мыши на метод, чтобы отобразить подсказку с дополнительными сведениями. В представлении задач подсказка отображает все задачи в таблице, аналогичной окну задач .
На следующем рисунке показана подсказка для метода в представлении потоков наверху и в соответствующем представлении Задач внизу.
Вид метода
В представлении Потоки или Задачи можно свести диаграмму к текущему методу, выбрав значок Включение/Выключение представления метода на панели инструментов. В представлении методов отображены все методы во всех потоках, которые либо вызывают текущий метод, либо вызываются им. На следующем рисунке показано, как те же сведения выглядят в представлении Потоков слева и в представлении методов справа.
Если вы переключитесь на новый кадр стека, этот метод станет текущим, и на панели Метода будут отображаться все вызывающие и вызываемые процедуры для нового метода. Это может привести к тому, что некоторые потоки будут отображаться или исчезать из вида в зависимости от того, присутствует ли этот метод в их стеках вызовов. Чтобы вернуться к представлению стека вызовов, снова выберите значок представления метода панели инструментов.
Видеоурок по отладке потоков и задач с использованием параллельных стеков
В этих видео учебниках показано, как использовать представления потоков и задач окна Параллельных стеков в Visual Studio 2022 для отладки многопоточных приложений.
- задачи отладки с помощью окна Параллельных стеков
- Отладка потоков с помощью окна параллельных стеков