Практическое руководство. Использование окна потоков
В окне Потоки можно проверять потоки и работать с ними в отлаживаемом приложении.
В окне Потоки имеется таблица, каждая строка которой представляет поток в приложении. По умолчанию в таблице перечисляются все потоки приложения, но можно фильтровать этот список, чтобы в нем показывались только нужные потоки. В каждом столбце содержится свой тип сведений. Можно также скрывать некоторые столбцы. Если отображаются все столбцы, то в них имеются следующие сведения (слева направо):
Столбец флагов, где можно пометить поток, которому планируется уделить особое внимание. Сведения о способе пометки потока см. в разделе Практическое руководство. Установка и снятие отметки для потока.
Столбец активных потоков, в котором желтая стрелка указывает активный поток. Контур стрелки указывает поток, где выполнение было передано в отладчик.
Столбец ИД, который содержит идентификационные номера всех потоков.
Столбец Управляемый ИД, в котором содержатся управляемые идентификационные номера управляемых потоков.
Столбец Категория, в котором потоки классифицируются по категориям: потоки пользовательского интерфейса, обработчики удаленного вызова процедур (RPC) и рабочие потоки. Особая категория идентифицирует главный поток приложения.
Столбец Имя, в котором для каждого потока указывается имя, если оно имеется, или значение <No Name>.
Столбец Расположение, в котором показывается, где поток выполняется. Можно развернуть это расположение, чтобы отобразить полный стек вызова для потока.
Столбец Приоритет, в котором содержится приоритет, назначенный системой каждому потоку.
Столбец Маска сходства, который является дополнительным столбцом и обычно скрыт. В этом столбце показывается маска сходства процессора для каждого потока. В многопроцессорной системе маска сходства определяет, какой процессор в каком потоке может работать.
Столбец Счетчик приостановок, в котором содержится счетчик приостановок. Этот счетчик определяет, может ли поток выполняться. Описание счетчика приостановок см. в разделе "Замораживание и размораживание потоков" далее в этой теме.
Столбец Имя процесса, содержащий имена процессов, которым принадлежит каждый поток. Этот столбец может быть полезен при отладке нескольких процессов, но обычно он скрыт.
Открытие окна потоков в режиме приостановки или в режиме выполнения
- В меню Отладка выберите пункт Окна и затем щелкните Потоки.
Отображение или скрытие столбца
- В панели инструментов, расположенной в верхней части окна Потоки, выберите Столбцы, а затем выделите или очистите имя столбца, который требуется отобразить или скрыть.
Переключение активного потока
Выполните одно из следующих действий.
Дважды щелкните любой поток.
Щелкните правой кнопкой мыши поток и выберите пункт Переключиться на поток.
Рядом с новым активным потоком появится желтая стрелка. Серый контур стрелки указывает поток, где выполнение было передано в отладчик.
Группирование и сортировка потоков
При группировании потоков в таблице появляется заголовок для каждой группы. В заголовке содержится описание группы, например "Рабочие потоки" или "Непомеченные потоки", и элемент управления "Дерево". Потоки-элементы каждой группы отображаются под заголовком группы. Если требуется скрыть потоки-элементы в какой-либо группе, можно свернуть эту группу с помощью элемента управления "Дерево".
Поскольку группирование имеет приоритет перед сортировкой, можно, например, группировать потоки по категориям, а затем по идентификаторам внутри каждой категории.
Сортировка потоков
В панели инструментов, находящейся в верхней части окна Потоки, нажмите кнопку в верхней части любого столбца.
Теперь потоки отсортированы по значениям в этом столбце.
Если требуется изменить порядок сортировки, нажмите кнопку же еще раз.
Потоки, которые отображались вверху списка, теперь отображаются внизу.
Группирование потоков
- В панели инструментов окна Потоки нажмите список Группировать по, а затем выберите критерий, по которому требуется группировать потоки.
Сортировка потоков в группах
В панели инструментов, которая находится в верхней части окна Потоки, нажмите список Группировать по, а затем выберите критерий, по которому требуется группировать потоки.
В окне Потоки нажмите кнопку в верхней части любого столбца.
Теперь потоки отсортированы по значениям в этом столбце.
Сворачивание и разворачивание всех групп
- В панели инструментов, которая находится в верхней части окна Потоки, нажмите Развернуть группы или Свернуть группы.
Поиск конкретных потоков
В Visual Studio 2012 можно искать потоки, соответствующие указанной строке. При поиске потоков в окне Потоки отображаются все потоки, в каком-либо столбце которых найдено соответствие строке поиска. Эти сведения включают расположение потока, которое отображается вверху стека вызова в столбце Расположение. Однако по умолчанию поиск во всем стеке вызова не выполняется.
Поиск конкретных потоков
В панели инструментов, находящейся в верхней части окна Потоки, перейдите в поле Поиск и выполните одно из следующих действий:
введите строку поиска и нажмите клавишу ВВОД;
- или -
нажмите раскрывающийся список рядом с полем Поиск и выберите строку поиска из предыдущего поиска.
(Необязательно) Чтобы включить в поиск полный стек вызова, выберите Поиск в стеке вызова.
Замораживание и размораживание потоков
Если поток заморожен, то система не начнет его выполнение, даже если будут доступны все ресурсы.
В машинном коде потоки могут быть приостановлены или возобновлены путем вызова функций Windows SuspendThread и ResumeThread или функций MFC CWinThread::SuspendThread и CWinThread::ResumeThread. При вызове SuspendThread или ResumeThread изменяется счетчик приостановок, который отображается в окне Потоки. Однако замораживание или размораживание собственного потока не приводит к изменению счетчика приостановок. В машинном коде поток не может выполняться, если он является размороженным и имеет счетчик приостановок, равный нулю.
В управляемом коде замораживание или размораживание потока приводит к изменению счетчика приостановок. В управляемом коде замороженный поток имеет счетчик приостановок со значением 1. В машинном коде замороженный поток имеет счетчик приостановок со значением 0 до тех пор, пока этот поток не будет приостановлен путем вызова SuspendThread.
Примечание
При отладке вызова управляемого кода из машинного кода управляемый код выполняется в том же физическом потоке, что и вызывающий его машинный код.Приостановка выполнения или замораживание присущего данному объекту кода приводит также к замораживанию управляемого кода.
Заморозка и разморозка выполнения потока
В панели инструментов, находящейся в верхней части окна Потоки, нажмите Заморозить потоки или Разморозить потоки.
Это действие влияет только на потоки, выбранные в окне Потоки.
Отображение помеченных потоков
Поток, которому планируется уделить особое внимание, можно пометить, поставив рядом с ним значок в окне Потоки. Дополнительные сведения см. в разделе Практическое руководство. Установка и снятие отметки для потока. В окне "Потоки" можно выбрать отображение всех потоков или только помеченных потоков.
Отображение только помеченных потоков
- Нажмите кнопку флага в левом верхнем углу окна Потоки.
Отображение стека вызовов потоков и переключение между фреймами
В многопотоковых программах каждый поток имеет свой собственный стек вызовов. Окно Потоки обеспечивает удобный способ просмотра этих стеков.
Просмотр стека вызовов потока
В столбце Расположение нажмите перевернутый треугольник рядом с расположением потока.
Расположение будет развернуто, и будет отображен стек вызова для потока.
Просмотр и сворачивание стеков вызовов всех потоков
- В панели инструментов, которая находится в верхней части окна Потоки, нажмите Развернуть стеки вызовов или Свернуть стеки вызовов.
См. также
Задачи
Пошаговое руководство. Отладка многопоточных приложений