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


Управление потоками и процессами

Общие сведения о потоках и процессах в подсистеме отладчика см. в разделе Потоки и процессы.

При возникновении события поток событий и процесс события задаются потоком и процессом (операционная система или виртуальная среда), в которых произошло событие. Их можно найти с помощью Командлетов GetEventThread и GetEventProcess соответственно.

Неявные потоки и процессы

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

Неявный процесс можно изменить с помощью SetImplicitProcessDataOffset. Чтобы определить неявный процесс, используйте GetImplicitProcessDataOffset.

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

При отладке в режиме ядра подсистема отладчика будет использовать неявный поток для определения некоторых регистров целевого объекта. Сюда входит стек процессора (см . Раздел GetStackOffset), смещение кадра (см. Раздел GetFrameOffset) и смещение инструкций (см. раздел GetInstructionOffset). При возникновении события для неявного потока устанавливается текущий поток.

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

Не все регистры определяются неявным потоком. Некоторые регистры останутся прежними при изменении неявного потока.

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

Потоков

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

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

Идентификатор потока подсистемы и идентификатор системного потока для одного или нескольких потоков в текущем процессе можно найти из их индекса с помощью GetThreadIdsByIndex.

Подсистема хранит несколько фрагментов информации о каждом потоке. Эти сведения могут запрашиваться для текущего потока и использоваться для поиска идентификатора потока подсистемы для потока.

идентификатор системного потока (только для отладки в пользовательском режиме)
Идентификатор системного потока текущего потока можно найти с помощью getCurrentThreadSystemId. Для заданного идентификатора системного потока соответствующий идентификатор потока подсистемы можно найти с помощью getThreadIdBySystemId.

блок среды потока (TEB)
Адрес TEB для текущего потока можно найти с помощью GetCurrentThreadTeb. Для заданного адреса TEB соответствующий идентификатор потока подсистемы можно найти с помощью getThreadIdByTeb. При отладке в режиме ядра TEB (виртуального) потока является TEB системного потока, который выполнялся на соответствующем процессоре при последнем событии.

смещение данных
При отладке в пользовательском режиме смещение данных (системного) потока — это расположение TEB для этого потока. При отладке в режиме ядра смещение данных (виртуального) потока — это структура KTHREAD для системного потока, который выполнялся на соответствующем процессоре при последнем событии. Смещение данных текущего потока можно найти с помощью getCurrentThreadDataOffset. Для заданного смещения данных соответствующий идентификатор потока подсистемы можно найти с помощью getThreadIdByDataOffset.

системный дескриптор
Системный дескриптор текущего потока можно найти с помощью getCurrentThreadHandle. Для заданного системного дескриптора соответствующий идентификатор потока подсистемы можно найти с помощью getThreadIdByHandle. При отладке в режиме ядра для каждого (виртуального) процесса создается искусственный дескриптор. Этот дескриптор можно использовать только с запросами API обработчика отладчика.

Процессов

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

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

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

Подсистема хранит несколько фрагментов информации о каждом процессе. Эти сведения могут запрашиваться для текущего процесса и использоваться для поиска идентификатора процесса подсистемы.

идентификатор системного процесса (только для отладки в пользовательском режиме)
Идентификатор системного процесса текущего процесса можно найти с помощью GetCurrentProcessSystemId. Для заданного идентификатора системного процесса соответствующий идентификатор процесса подсистемы можно найти с помощью GetProcessIdBySystemId.

блок среды обработки (PEB)
Адрес PEB для текущего процесса можно найти с помощью getCurrentProcessPeb. Для заданного PEB-адреса соответствующий идентификатор процесса подсистемы можно найти с помощью GetProcessIdByPeb. При отладке в режиме ядра PEB (виртуального) процесса является PEB системного процесса, который выполнялся при последнем событии.

смещение данных
При отладке в пользовательском режиме смещение данных (системного) процесса — это расположение PEB этого процесса. При отладке в режиме ядра смещение данных (виртуального) процесса является структурой KPROCESS для системного процесса, выполнявшегося при последнем событии. Смещение данных текущего процесса можно найти с помощью getCurrentProcessDataOffset. Для данного смещения данных соответствующий идентификатор процесса подсистемы можно найти с помощью GetProcessIdByDataOffset.

системный дескриптор
Системный дескриптор текущего процесса можно найти с помощью getCurrentProcessHandle. Для заданного системного дескриптора соответствующий идентификатор процесса подсистемы можно найти с помощью getProcessIdByHandle. При отладке в режиме ядра для (виртуального) процесса создается искусственный дескриптор. Этот дескриптор можно использовать только с запросами обработчика отладчика.

События

При динамической отладке в пользовательском режиме каждый раз, когда поток создается или выходит из целевого объекта, создаются события отладки create-thread и exit-thread. Эти события приводят к вызовам методов обратного вызова IDebugEventCallbacks::CreateThread и IDebugEventCallbacks::ExitThread .

При динамической отладке в пользовательском режиме каждый раз, когда процесс создается или завершается в целевом объекте, создаются события отладки процесса создания и выхода из процесса. Эти события приводят к вызовам методов обратного вызова IDebugEventCallbacks::CreateProcess и IDebugEventCallbacks::ExitProcess .

Дополнительные сведения о событиях см. в разделе Мониторинг событий.

Дополнительные сведения

Дополнительные сведения о потоках и процессах, включая структуры TEB, KTHREAD, PEB и KPROCESS, см. в статье Microsoft Windows Internals от Дэвида Соломона и Марка Руссиновича.