Просмотр потоков и задач в окне "Параллельные стеки" (C#, Visual Basic, C++)
Окно Параллельные стеки применяется при отладке многопотоковых приложений. В нем есть несколько представлений.
Представление потоков содержит сведения о стеке вызовов для всех потоков приложения. Вы можете переходить в различные потоки и кадры стека в потоках.
Представление задач содержит сведения о связанном с задачами стеке вызовов.
- В управляемом коде в представлении Задачи отображаются стеки вызовов объектов System.Threading.Tasks.Task.
- В машинном коде в представлении Задачи отображаются стеки вызовов групп задач, параллельных алгоритмов, асинхронных агентов и упрощенных задач.
Представление метода содержит стек вызовов в выбранном методе.
Использование окна "Параллельные стеки"
Чтобы открыть окно Параллельные стеки, необходимо находиться в сеансе отладки. Выберите Отладка>Окна>Параллельные стеки.
Элементы управления панели инструментов
Окно Параллельные стеки содержит следующие элементы управления панели инструментов.
Icon | Control | Description |
---|---|---|
Поле со списком Потоки/Задачи | Переключает отображение между стеками вызова для потоков и стеками вызова для задач. Дополнительные сведения см. в разделах Представление "Задачи" и Представление "Потоки". | |
Показывать только помеченные | Отображает стеки вызовов только для потоков, которые помечены в других окнах отладки, таких как окно Потоки GPU и окно Контроль параллельных данных. | |
Переключение представления метода | Переключает представления стека и представление метода. Дополнительные сведения см. в разделе Представление "Метод". | |
Автопрокрутка к текущему кадру стека | Автоматически прокручивает граф для отображения текущего кадра стека. Этот компонент применяется при изменении текущего кадра стека из других окон или при попадании в новую точку останова в крупных графах. | |
Переключить элемент управления масштабом | Показывает или скрывает элемент управления масштаба в левой части окна. Чтобы изменить масштаб вне зависимости от видимости элемента управления масштаба, можно также нажать клавишу CTRL и повернуть колесико мыши. Или можно нажать сочетание клавиш CTRL+SHIFT++ для увеличения масштаба и CTRL+SHIFT+- для уменьшения масштаба. |
Icon | Control | Description |
---|---|---|
Поле со списком Потоки/Задачи | Переключает отображение между стеками вызова для потоков и стеками вызова для задач. Дополнительные сведения см. в разделах Представление "Задачи" и Представление "Потоки". | |
Элемент управления фильтрами | Отображает стеки вызовов только для определенного набора потоков, которые вам нужны. | |
Показывать только помеченные | Отображает стеки вызовов только для потоков, которые помечены в других окнах отладки, таких как окно Потоки GPU и окно Контроль параллельных данных. | |
Переключение представления метода | Переключает представления стека и представление метода. Дополнительные сведения см. в разделе Представление "Метод". | |
Автопрокрутка к текущему кадру стека | Автоматически прокручивает граф для отображения текущего кадра стека. Этот компонент применяется при изменении текущего кадра стека из других окон или при попадании в новую точку останова в крупных графах. | |
Переключить элемент управления масштабом | Показывает или скрывает элемент управления масштаба в левой части окна. Чтобы изменить масштаб вне зависимости от видимости элемента управления масштаба, можно также нажать клавишу CTRL и повернуть колесико мыши. Или можно нажать сочетание клавиш CTRL+SHIFT++ для увеличения масштаба и CTRL+SHIFT+- для уменьшения масштаба. |
|
Элемент управления поиском | С помощью этой функции можно легко искать кадры стека, а затем использовать стрелки для перехода между этими результатами. | |
Сохранить элемент управления | Позволяет сохранять и экспортировать содержимое из параллельного окна стека в виде изображения. | |
Показать внешний элемент управления кодом | С помощью этой функции можно отображать и скрывать стеки из внешних кодов и библиотек. |
Значки кадров стека
Следующие значки предоставляют сведения об активных и текущих кадрах стека во всех представлениях.
Icon | Description |
---|---|
Указывает текущее расположение (активный кадр стека) текущего потока. | |
Указывает текущее расположение (активный кадр стека) потока, не являющегося текущим. | |
Указывает текущий кадр стека (текущий контекст отладчика). Имя метода выделяется полужирным шрифтом везде, где оно отображается. |
Icon | Description |
---|---|
Указывает текущее расположение (активный кадр стека) текущего потока. | |
Указывает текущее расположение (активный кадр стека) потока, не являющегося текущим. | |
Указывает текущий кадр стека (текущий контекст отладчика). Имя метода выделяется полужирным шрифтом везде, где оно отображается. | |
Указывает, что текущий кадр стека имеет предупреждение о критическом состоянии, например Взаимоблокировка. | |
Указывает взаимоблокируемый узел. | |
Указывает, что текущий кадр стека содержит дополнительные сведения, такие как ожидание, ожидание блокировки, владение и т. д. | |
Указывает, что текущая задача находится в состоянии блокировки или ожидания и т. д. | |
Указывает, что текущая задача выполняется. |
Элементы контекстного меню
Следующие элементы контекстного меню доступны при щелчке правой кнопкой мыши метода в представлении Потоки или Задачи. Последние шесть элементов аналогичны элементам в окне Стек вызовов.
Пункт меню | Description |
---|---|
Параметр | Помечает выбранный элемент. |
Снять пометку | Снимает пометку с выбранного элемента. |
Заморозить | Замораживает выбранный элемент. |
Разморозить | Размораживает выбранный элемент. |
Перейти к кадру | Выполняет те же функции, то и соответствующая команда меню в окне Стек вызовов. Однако в окне Параллельные стеки один метод может находиться в нескольких кадрах. Вы можете выбрать нужный фрейм в подменю для этого элемента. Если один из кадров стека расположен в текущем потоке, этот кадр выбирается по умолчанию в подменю. |
Перейти к задаче или Перейти к потоку | Переключает представление Задача или Потоки и сохраняет выделенным тот же кадр стека. |
К исходному коду | Переходит к соответствующему расположению в окне исходного кода. |
Перейти к дизассемблированию | Переходит к соответствующему расположению в окне Дизассемблирование. |
Показать внешний код | Скрывает и показывает внешний код. |
Шестнадцатеричный вывод | Переключается между десятичным и шестнадцатеричным отображением. |
Показать потоки в исходном коде | Помечает расположение потока в окне исходного кода. |
Сведения о загрузке символов | Открывает диалоговое окно Сведения о загрузке символов. |
Параметры символов | Открывает диалоговое окно Параметры символов. |
Пункт меню | Description |
---|---|
Копировать | Скопируйте выбранный элемент. |
Выберите все кадры ниже | Выбирает все кадры в выбранном стеке. |
Параметр | Помечает выбранный элемент. |
Снять пометку | Снимает пометку с выбранного элемента. |
Заморозить | Замораживает выбранный элемент. |
Разморозить | Размораживает выбранный элемент. |
Перейти к кадру | Выполняет те же функции, то и соответствующая команда меню в окне Стек вызовов. Однако в окне Параллельные стеки один метод может находиться в нескольких кадрах. Вы можете выбрать нужный фрейм в подменю для этого элемента. Если один из кадров стека расположен в текущем потоке, этот кадр выбирается по умолчанию в подменю. |
Перейти к задаче или Перейти к потоку | Переключает представление Задача или Потоки и сохраняет выделенным тот же кадр стека. |
К исходному коду | Переходит к соответствующему расположению в окне исходного кода. |
Перейти к дизассемблированию | Переходит к соответствующему расположению в окне Дизассемблирование. |
Показать внешний код | Скрывает и показывает внешний код. |
Шестнадцатеричный вывод | Переключается между десятичным и шестнадцатеричным отображением. |
Показать потоки в исходном коде | Помечает расположение потока в окне исходного кода. |
Сведения о загрузке символов | Открывает диалоговое окно Сведения о загрузке символов. |
Параметры символов | Открывает диалоговое окно Параметры символов. |
Представление "Потоки"
В представлении Потоки кадр стека и путь вызова текущего потока выделены синим цветом. Текущее расположение потока указано желтой стрелкой.
Чтобы изменить текущий кадр стека, дважды щелкните другой метод. При этом также может измениться текущий поток в зависимости от того, входит ли выбранный метод в текущий поток или является частью другого потока.
Если граф представления Потоки слишком велик и не помещается в окне, в окне появляется элемент управления Вид с высоты птичьего полета. Вы можете поместить кадр в элемент управления и переходить к разным частям графа.
На следующем рисунке показан один поток, идущий от основного кода к управляемому, а затем — к машинному. В текущем методе находятся шесть потоков. Один из них переходит в Thread.Sleep, другой переходит в Console.WriteLine, а затем в SyncTextWriter.WriteLine.
В следующей таблице описаны основные функции представления Потоки.
Выноска | Имя элемента | Description |
---|---|---|
1 | Сегмент или узел стека вызова | Содержит последовательности методов для одного потока или нескольких. Если кадр не имеет линий со стрелками, то он представляет собой единый путь вызова для потоков. |
2 | Синее выделение | Указывает путь вызова текущего потока. |
3 | Линии со стрелками | Соединяют узлы и показывают единый путь вызова для потоков. |
4 | Заголовок узла | Показывает количество процессов и потоков для узла. |
5 | Способ | Представляет один или несколько кадров стека одного метода. |
6 | Всплывающая подсказка для метода | Отображается при наведении указателя мыши на метод. В представлении Потоки в подсказке отображаются все потоки в виде таблицы, похожей на таблицу окна Потоки. |
На следующем рисунке показан один поток, идущий от основного кода к управляемому, а затем — к машинному. Пять потоков находятся в текущем методе. Один продолжает работать в ServerClass.InstanceMethod, а другой продолжает работать в Worker.Thread.Start, а затем в StartupHook.Initialize.AnonymousMethod.
В следующей таблице описаны основные функции представления Потоки.
Выноска | Имя элемента | Description |
---|---|---|
1 | Сегмент или узел стека вызова | Содержит последовательности методов для одного потока или нескольких. Если кадр не имеет линий со стрелками, то он представляет собой единый путь вызова для потоков. |
2 | Синее выделение | Указывает путь вызова текущего потока. |
3 | Линии со стрелками | Соединяют узлы и показывают единый путь вызова для потоков. |
4 | Заголовок узла | Показывает количество процессов и потоков, имени потока и идентификатора потока для узла. |
5 | Способ | Представляет один или несколько кадров стека одного метода. |
6 | Всплывающая подсказка для метода | Отображается при наведении указателя мыши на метод. В представлении Потоки в подсказке отображаются все потоки в виде таблицы, похожей на таблицу окна Потоки. |
Представление задач
Если для выражения параллелизма приложение использует объекты System.Threading.Tasks.Task (управляемый код) или объекты task_handle
(машинный код), можно использовать представление Задачи. Представление Задачи отображает стеки вызова задач вместо потоков.
В представлении Задачи
- Стеки вызовов потоков, не выполняющие задачи, не отображаются.
- Стеки вызовов потоков, выполняющие задачи, визуально отделяются в верхней и нижней частях для отображения наиболее релевантных кадров, относящихся к задачам.
- Когда несколько задач расположено в одном потоке, стеки вызовов этих задач отображаются в отдельных узлах.
Чтобы просмотреть весь стек вызовов, вернитесь в представление Потоки. Для этого щелкните кадр стека правой кнопкой мыши и выберите команду Перейти к потоку.
На следующем рисунке показано представление Потоки в верхней части и соответствующее представление Задачи в нижней части.
Наведите указатель мыши на метод, чтобы отобразить подсказку с дополнительными сведениями. В представлении Задачи подсказка отображает все задачи в виде таблицы, похожей на таблицу окна Задачи.
На следующем рисунке показана подсказка для метода в представлении Потоки в верхней части и соответствующее представление Задачи в нижней части.
Представление метода
Из представления Потокиили Задачи можно прикрепить график для текущего метода. Для этого следует щелкнуть значок Переключить представление метода на панели инструментов. Представление "Методы" показывает все методы для всех потоков, которые вызывают текущий метод или вызываются им. На следующем рисунке показано отображение одной и той же информации в представлении Потоки слева и в представлении "Методы" справа.
Переключение на новый кадр стека делает этот метод текущим методом, и в представлении "Методы"отображаются все вызывающие и вызываемые объекты нового метода. Из-за этого некоторые потоки могут появиться на представлении или исчезнуть из него (в зависимости от того, отображается ли этот метод в их стеках вызова). Чтобы вернуться в представление стека вызовов, еще наз щелкните значок Представление "Методы" на панели инструментов.
Руководство по отладке потоков и задач с параллельными стеками видео
В этих видео учебниках показано, как использовать представления потоков и задач окна Параллельных стеков в Visual Studio 2022 для отладки многопоточных приложений.