Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
Para obter uma visão geral de encadeamentos e processos no motor de depuração, consulte Threads and Processes.
Quando ocorre um evento, o thread de eventos e o processo de eventos 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 em modo kernel, o motor do depurador utilizará o processo implícito para determinar qual espaço de endereçamento virtual deve ser usado ao realizar a conversão de endereços de 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 do kernel ao vivo, 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, apenas o contexto do processo do destino é usado ao manipular o ponto de interrupção; o valor do processo implícito é irrelevante.
Na depuração em modo kernel, o motor de depuração utilizará a thread implícita para determinar alguns dos registos do alvo . Isso inclui a pilha do processador (consulte GetStackOffset), o deslocamento de quadro (consulte GetFrameOffset) e o deslocamento de instruções (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, utilize GetImplicitThreadDataOffset.
Nem todos os registos são determinados pelo segmento 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 para o 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, uma vez que os endereços de memória do kernel são constantes em todos os espaços de endereço virtual. Assim, as informações para o thread implícito localizado na memória do kernel podem ser acessadas independentemente do processo implícito.
Tópicos
O ID de segmento do mecanismo é utilizado pelo mecanismo do depurador para identificar cada segmento do sistema operacional e cada segmento virtual para um alvo.
Enquanto um alvo está parado, cada thread também tem um índice relativo ao processo ao qual 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.
O ID de thread do mecanismo e o ID de thread do sistema para um ou mais threads no processo atual podem ser encontrados 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 encontrar o ID do thread do mecanismo para um thread.
ID de thread do sistema (somente depuração no modo de usuário)
A ID de thread do sistema do thread atual pode ser encontrada usando GetCurrentThreadSystemId. Para um determinado ID de thread do sistema, o ID de thread do mecanismo correspondente pode ser encontrado 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, o ID de thread do mecanismo correspondente pode ser encontrado usando GetThreadIdByTeb. Na depuração em modo kernel, o TEB de um thread (virtual) é o TEB do thread do sistema que estava a correr no processador correspondente quando a última ocorrência ocorreu.
deslocamento de dados
Na depuração em modo de utilizador, o deslocamento dos dados de um thread (do sistema) é a localização do TEB para esse thread. Na depuração do modo kernel, o deslocamento de dados de um thread (virtual) é a estrutura KTHREAD para o thread do sistema que estava sendo executado no processador correspondente quando o último evento ocorreu. O deslocamento de dados do thread atual pode ser encontrado utilizando GetCurrentThreadDataOffset. Para um determinado deslocamento de dados, o ID de thread do motor correspondente pode ser encontrado usando GetThreadIdByDataOffset.
manípulo do sistema
O identificador do sistema do thread atual pode ser encontrado usando GetCurrentThreadHandle. Para um determinado identificador de sistema, o ID de thread do mecanismo correspondente pode ser encontrado 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
O de ID do processo do mecanismo de é usado pelo mecanismo do depurador para identificar cada processo do sistema operacional e cada processo virtual para um destino.
Quando um destino está parado, cada processo tem um índice relativo ao destino. O índice do primeiro processo no alvo é zero, e o índice do último processo é o número de processos no alvo menos um. O número de processos no destino atual pode ser encontrado usando GetNumberProcesses.
Os IDs do processo do motor e do sistema para uma ou mais threads no alvo atual podem ser encontrados a partir do seu índice utilizando GetProcessIdsByIndex.
O motor mantém várias informações sobre cada processo. Essas informações podem ser consultadas para o processo atual e podem ser usadas para encontrar o ID do processo do mecanismo para um processo.
ID do processo do sistema (somente depuração no modo de usuário)
O ID do sistema do processo atual pode ser encontrado usando GetCurrentProcessSystemId. Para um determinado ID de processo do sistema, o ID de processo do mecanismo correspondente pode ser encontrado usando GetProcessIdBySystemId.
bloco de ambiente de processo (PEB)
O endereço do PEB para o processo atual pode ser encontrado usando GetCurrentProcessPeb. Para um determinado endereço PEB, o ID do processo do motor correspondente pode ser encontrado usando GetProcessIdByPeb. Na depuração em modo kernel, o PEB do processo (virtual) corresponde ao PEB do processo de sistema que estava a executar quando ocorreu o último evento.
offset de dados
Na depuração em modo de usuário, o desvio de dados de um processo é o endereço do PEB desse processo. Na depuração em modo kernel, o deslocamento de dados de um processo (virtual) é a estrutura KPROCESS para o processo do sistema que estava sendo executado quando ocorreu o último evento. O deslocamento de dados do processo atual pode ser encontrado usando GetCurrentProcessDataOffset. Para um determinado offset de dados, o ID do processo do motor correspondente pode ser encontrado utilizando GetProcessIdByDataOffset.
manípulo do sistema
O identificador de sistema do processo atual pode ser encontrado usando GetCurrentProcessHandle. Para um determinado handle de sistema, o ID de processo do motor correspondente pode ser encontrado usando GetProcessIdByHandle. Na depuração em modo kernel, um identificador artificial é criado para o processo (virtual). Esse identificador só pode ser usado com consultas do mecanismo do depurador.
Eventos
Durante a depuração em modo utilizador ao vivo, sempre que um thread é criado ou termina no alvo, os eventos de depuração create-thread e exit-thread são acionados. Esses eventos resultam em chamadas para o IDebugEventCallbacks::CreateThread e IDebugEventCallbacks::ExitThread métodos de retorno de chamada.
Na depuração ao vivo em modo utilizador, sempre que um processo é criado ou termina no alvo, os eventos de criação de processo e de saída de processo são gerados. Esses eventos resultam em chamadas para os IDebugEventCallbacks::CreateProcess e IDebugEventCallbacks::ExitProcess métodos de retorno de chamada.
Para obter mais informações sobre eventos, consulte Monitorização de Eventos.
Informações adicionais
Para obter mais informações sobre threads e processos, incluindo as estruturas TEB, KTHREAD, PEB e KPROCESS, consulte Microsoft Windows Internals por David Solomon e Mark Russinovich.