Controlando threads e processos
Para obter uma visão geral de threads e processos no mecanismo de depurador, consulte Threads e Processos.
Quando ocorre um evento, o thread de evento e o processo de evento são definidos como o thread e o processo (sistema operacional ou virtual) no qual o evento ocorreu. Eles podem ser encontrados usando GetEventThread e GetEventProcess, respectivamente.
Threads e processos implícitos
Na depuração do modo kernel, o mecanismo do depurador usará o processo implícito para determinar qual espaço de endereço virtual usar ao executar a tradução de endereço virtual para físico , por exemplo, nos métodos VirtualToPhysical e ReadVirtual. Quando ocorre um evento, o processo implícito é definido como o processo atual.
O processo implícito pode ser alterado usando SetImplicitProcessDataOffset. Para determinar o processo implícito, use GetImplicitProcessDataOffset.
Nota Ao definir pontos de interrupção durante uma sessão de depuração de kernel dinâmico, o mecanismo do depurador passará o endereço virtual do ponto de interrupção para o destino e o destino definirá o ponto de interrupção. Nesse caso, somente o contexto de processo do destino é usado ao manipular o ponto de interrupção; o valor do processo implícito é irrelevante.
Na depuração do modo kernel, o mecanismo do depurador usará o thread implícito para determinar alguns dos registros do destino. Isso inclui a pilha do processador (consulte GetStackOffset), o deslocamento de quadro (consulte GetFrameOffset) e o deslocamento de instrução (consulte GetInstructionOffset). Quando ocorre um evento, o thread implícito é definido como o thread atual.
O thread implícito pode ser alterado usando SetImplicitThreadDataOffset. Para determinar o thread implícito, use GetImplicitThreadDataOffset.
Nem todos os registros são determinados pelo thread implícito. Alguns registros permanecerão os mesmos quando o thread implícito for alterado.
Aviso O processo implícito e o thread implícito são independentes. Se o thread implícito não pertencer ao processo implícito, o estado do usuário e da sessão do thread implícito estará no espaço de endereço virtual errado e as tentativas de acessar essas informações causarão erros ou fornecerão resultados incorretos. Esse problema não ocorre ao acessar a memória do kernel, pois os endereços de memória do kernel são constantes em todos os espaços de endereço virtual. Portanto, as informações para o thread implícito localizado na memória do kernel podem ser acessadas independentemente do processo implícito.
Tópicos
A ID do thread do mecanismo é usada pelo mecanismo do depurador para identificar cada thread do sistema operacional e cada thread virtual para um destino.
Enquanto um destino é interrompido, cada thread também tem um índice relativo ao processo ao qual ele pertence. Para qualquer processo, o índice do primeiro thread no processo é zero e o índice do último thread é o número de threads no processo menos um. O número de threads no processo atual pode ser encontrado usando GetNumberThreads. O número total de threads em todos os processos no destino atual pode ser encontrado usando GetTotalNumberThreads.
A ID do thread do mecanismo e a ID do thread do sistema para um ou mais threads no processo atual podem ser encontradas em seu índice usando GetThreadIdsByIndex.
O mecanismo mantém várias informações sobre cada thread. Essas informações podem ser consultadas para o thread atual e podem ser usadas para localizar a ID do thread do mecanismo para um thread.
ID do thread do sistema (somente depuração no modo de usuário)
A ID do thread do sistema do thread atual pode ser encontrada usando GetCurrentThreadSystemId. Para uma determinada ID de thread do sistema, a ID de thread do mecanismo correspondente pode ser encontrada usando GetThreadIdBySystemId.
bloco de ambiente de thread (TEB)
O endereço do TEB para o thread atual pode ser encontrado usando GetCurrentThreadTeb. Para um determinado endereço TEB, a ID de thread do mecanismo correspondente pode ser encontrada usando GetThreadIdByTeb. Na depuração do modo kernel, o TEB de um thread (virtual) é o TEB do thread do sistema que estava em execução no processador correspondente quando o último evento ocorreu.
deslocamento de dados
Na depuração no modo de usuário, o deslocamento de dados de um thread (sistema) é o local do TEB para esse thread. No modo kernel, a depuração do deslocamento de dados de um thread (virtual) é a estrutura KTHREAD para o thread do sistema que estava em execução no processador correspondente quando o último evento ocorreu. O deslocamento de dados do thread atual pode ser encontrado usando GetCurrentThreadDataOffset. Para um determinado deslocamento de dados, a ID de thread do mecanismo correspondente pode ser encontrada usando GetThreadIdByDataOffset.
identificador do sistema
O identificador do sistema do thread atual pode ser encontrado usando GetCurrentThreadHandle. Para um determinado identificador do sistema, a ID de thread do mecanismo correspondente pode ser encontrada usando GetThreadIdByHandle. Na depuração do modo kernel, um identificador artificial é criado para cada processo (virtual). Esse identificador só pode ser usado com consultas de API do mecanismo de depurador.
Processos
A ID do processo do mecanismo é usada pelo mecanismo do depurador para identificar cada processo do sistema operacional e cada processo virtual para um destino.
Enquanto um destino é interrompido, cada processo tem um índice relativo ao destino. O índice do primeiro processo no destino é zero e o índice do último processo é o número de processos no destino menos um. O número de processos no destino atual pode ser encontrado usando GetNumberProcesses.
A ID do processo do mecanismo e a ID do processo do sistema para um ou mais threads no destino atual podem ser encontradas em seu índice usando GetProcessIdsByIndex.
O mecanismo mantém várias informações sobre cada processo. Essas informações podem ser consultadas para o processo atual e podem ser usadas para localizar a ID do processo do mecanismo para um processo.
ID do processo do sistema (somente depuração no modo de usuário)
A ID do processo do sistema do processo atual pode ser encontrada usando GetCurrentProcessSystemId. Para uma determinada ID de processo do sistema, a ID do processo do mecanismo correspondente pode ser encontrada usando GetProcessIdBySystemId.
PEB (process environment block)
O endereço do PEB para o processo atual pode ser encontrado usando GetCurrentProcessPeb. Para um determinado endereço PEB, a ID do processo do mecanismo correspondente pode ser encontrada usando GetProcessIdByPeb. Na depuração do modo kernel, o PEB do processo (virtual) é o PEB do processo do sistema que estava em execução quando o último evento ocorreu.
deslocamento de dados
Na depuração no modo de usuário, o deslocamento de dados de um processo (sistema) é o local do PEB desse processo. Na depuração do modo kernel, o deslocamento de dados do processo (virtual) é a estrutura KPROCESS para o processo do sistema que estava em execução quando o último evento ocorreu. O deslocamento de dados do processo atual pode ser encontrado usando GetCurrentProcessDataOffset. Para um determinado deslocamento de dados, a ID do processo do mecanismo correspondente pode ser encontrada usando GetProcessIdByDataOffset.
identificador do sistema
O identificador do sistema do processo atual pode ser encontrado usando GetCurrentProcessHandle. Para um determinado identificador do sistema, a ID do processo do mecanismo correspondente pode ser encontrada usando GetProcessIdByHandle. Na depuração do modo kernel, um identificador artificial é criado para o processo (virtual). Esse identificador só pode ser usado com consultas do mecanismo de depurador.
Eventos
Na depuração do modo de usuário ativo, sempre que um thread é criado ou encerrado em um destino, os eventos de depuração create-thread e exit-thread são gerados. Esses eventos resultam em chamadas para os métodos de retorno de chamada IDebugEventCallbacks::CreateThread e IDebugEventCallbacks::ExitThread .
Na depuração do modo de usuário ativo, sempre que um processo é criado ou encerrado em um destino, os eventos de depuração create-process e exit-process são gerados. Esses eventos resultam em chamadas para os métodos de retorno de chamada IDebugEventCallbacks::CreateProcess e IDebugEventCallbacks::ExitProcess .
Para obter mais informações sobre eventos, consulte Eventos de monitoramento.
Informações adicionais
Para obter mais informações sobre threads e processos, incluindo as estruturas TEB, KTHREAD, PEB e KPROCESS, consulte Microsoft Windows Internals de David Solomon e Mark Russinovich.