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


Отладка многопоточных приложений в Visual Studio

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

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

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

Потоки и процессы

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

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

Существование нескольких процессов позволяет компьютеру "одновременно" выполнять несколько задач. Существование нескольких потоков позволяет процессу разделять работу для параллельного выполнения. На многопроцессорном компьютере процессы или потоки могут работать на разных процессорах. Это позволяет выполнять реально параллельную работу.

Средства отладки многопоточных приложений

В Visual Studio доступны различные средства для отладки многопоточных приложений.

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

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

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

Пользовательский интерфейс Доступные сведения Действия, которые можно выполнять
Диалоговое окно "Присоединение к процессу" Доступные процессы для присоединения:

— Имя процесса (.exe)
— Идентификатор процесса
— Заголовок строки меню
— Тип (управляемый v4.0; управляемый v2.0, v1.1, v1.0; x86; x64; IA64)
— Имя пользователя (имя учетной записи)
— Номер сеанса
Выберите процесс для присоединения

Выберите удаленный компьютер

Измените тип транспортного протокола для подключения к удаленным компьютерам
Окно "Процессы" Присоединенные процессы:

— Имя процесса
— Идентификатор процесса
— Путь к процессу .exe
— Заголовок строки меню
— Состояние (прервано, выполняется)
— Отладка (машинный код, управляемый код и т. д.)
— Тип транспортировки (по умолчанию используется встроенный без проверки подлинности)
— Квалификатор транспортировки (удаленный компьютер)
Инструменты:

— Подключить
— Отсоединить
— Завершить

Контекстное меню:

— Подключить
— Отсоединить
— Отсоединить, когда отладка остановлена
— Завершить
Окно Потоки Потоки текущего процесса:

— Идентификатор потока
— Управляемый идентификатор
— Категория (основной поток, поток интерфейса, обработчик вызова удаленной процедуры или рабочий поток)
— Имя потока
— Место, где создан поток
— Приоритет
— Маска сходства
— Счетчик приостановок
— Имя процесса
— индикатор флага
— индикатор приостановки
Инструменты:

— Поиск
— Поиск в стеке вызовов
— Пометить только мой код
— Пометить выбранные пользовательские модули
— Group by
— Столбцы
— Развернуть/свернуть стеки вызовов
— Развернуть/ свернуть группы
— Заморозить/разморозить потоки

Контекстное меню:

— Показать потоки в источнике
— Переключиться в поток
— Заморозить выполняющийся поток
— Разморозить замороженный поток
— Пометить поток для дополнительного изучения
— Снять отметку потока
— Переименовать поток
— Отобразить и скрыть потоки

Другие действия:

— Просмотреть стек вызовов потока в подсказке
Окна исходного кода. Индикаторы потока в левом поле указывают один или несколько потоков (по умолчанию отключено, включается с помощью контекстного меню в окне Потоки) Контекстное меню:

— Переключиться в поток
— Пометить поток для дополнительного изучения
— Снять отметку потока
Панель инструментов "Место отладки" — Текущий процесс
— Приостановить приложение
— Возобновить приложение
— Приостановить и завершить работу приложения
— Текущий поток
— Переключить состояние флага текущего потока
— Показать только помеченные потоки
— Показать только текущий процесс
— Текущий кадр стека
— Переключиться в другой процесс
— Приостановить, возобновить или завершить работу приложения
— Переключиться в другой поток в текущем процессе
— Переключиться в другой кадр стека в текущем потоке
— Пометить или отменить пометку текущих потоков
— Показать только помеченные потоки
— Показать только текущий процесс
Окно Параллельные стеки — Стеки вызовов для нескольких потоков в одном окне.
— Активный кадр стека для каждого потока.
— Вызывающие и вызываемые функции и процедуры для любого метода.
— обнаружение взаимоблокировок
— фильтрация указанных потоков
— фильтрация внешних стеков кода
— Перейти к представлению задач
— Пометить или отменить пометку потока
-Зум
— копирование кадров стека
— Сохранение и экспорт всех стеков в виде изображения
Окно Контроль параллельных данных — Столбец пометок, в котором можно пометить поток, которому требуется уделить особое внимание.
— Столбец кадров, в котором символ стрелки указывает текущий выбранный кадр.
— Настраиваемый столбец, который может отображать компьютер, процесс, элемент, задачу и поток.
— Пометить или отменить пометку потока
— Отобразить только помеченные потоки
— Переключить кадры
— Сортировать столбец
— Группировать потоки
— Заморозить или разморозить потоки
— Экспортировать данные в окно параллельных контрольных значений
Окно "Задачи" — Просмотр сведений об объектах Task, включая идентификатор задачи, состояние задачи (запланирована, запущена, ожидает, заблокирована), а также сведений о потоке, назначенном задаче
— Текущее расположение в стеке вызовов
— Делегат, переданный в задачу во время создания
— Переключиться на текущую задачу
— Пометить или отменить пометку задачи
— Заморозить или разморозить задачу
Окно Потоки GPU — Столбец пометок, в котором можно пометить поток, которому требуется уделить особое внимание.
— Столбец текущего потока, в котором желтая стрелка указывает текущий поток.
— Столбец Число потоков, в котором отображается количество потоков в одном месте.
— Столбец Строка, в котором отображается строка кода, где расположена каждая группа потоков.
— Столбец Адрес, в котором отображается адрес инструкции, где расположена каждая группа потоков.
— Столбец Расположение, который представляет расположение адреса в коде.
— Столбец Состояние, который показывает, является ли поток активным или заблокированным.
— Столбец Элемент, в котором отображается индекс для потоков в строке.
— Переключиться на другой поток
— Отобразить определенный элемент и поток
— Отобразить или скрыть столбец
— Сортировать по столбцу
— Группировать потоки
— Заморозить или разморозить потоки
— Пометить или отменить пометку потока
— Отобразить только помеченные потоки