Бөлісу құралы:


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

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

При возникновении события поток событий и процесс событий устанавливаются в поток и процесс (операционная система или виртуальная), в котором произошло событие. Их можно найти с помощью 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. При отладке в режиме ядра искусственный дескриптор создается для процесса (виртуального). Этот дескриптор можно использовать только с запросами механизма отладки.

События

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

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

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

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

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