Ескертпе
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Жүйеге кіруді немесе каталогтарды өзгертуді байқап көруге болады.
Бұл бетке кіру үшін қатынас шегін айқындау қажет. Каталогтарды өзгертуді байқап көруге болады.
Общие сведения о потоках и процессах в обработчике отладчика см. в разделе "Потоки и процессы".
При возникновении события поток событий и процесс событий устанавливаются в поток и процесс (операционная система или виртуальная), в котором произошло событие. Их можно найти с помощью 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 ДэвидОм Соломоном и Марком Руссиновичем.