Partilhar via


Alterar contextos

Na depuração no modo kernel, há muitos processos, threads e, às vezes, sessões de usuário que estão sendo executadas ao mesmo tempo. Portanto, frases como "endereço virtual 0x80002000" ou "o registro eax" são ambíguas. Você deve especificar o contexto em que essas frases podem ser compreendidas.

O depurador tem cinco contextos diferentes que você pode definir enquanto está depurando:

  1. O contexto da sessão indica a sessão de usuário padrão.

  2. O contexto do processo determina como o depurador interpreta endereços virtuais.

  3. O contexto de endereço de modo de usuário quase nunca é definido diretamente. Esse contexto é definido automaticamente quando você altera o contexto do processo.

  4. O contexto de registro determina como o depurador interpreta os registros e também controla os resultados de um rastreamento de pilha. Esse contexto também é conhecido como o contexto de thread, embora esse termo não seja completamente preciso. Um contexto explícito também é um tipo de contexto de registro. Se você especificar um contexto explícito, esse contexto será usado em vez do contexto de registro atual.

  5. O contexto local determina como o depurador interpreta as variáveis locais. Esse contexto também é conhecido como o escopo.

Contexto da sessão

Várias sessões de logon podem ser executadas ao mesmo tempo. Cada sessão de logon tem seus próprios processos.

A extensão !session exibe todas as sessões de logon ou altera o contexto da sessão atual.

O contexto da sessão é usado pelas extensões !sprocess e !spoolused quando o número da sessão é inserido como "-2".

Quando o contexto da sessão é alterado, o contexto do processo é alterado automaticamente para o processo ativo dessa sessão.

Contexto do processo

Cada processo tem seu próprio diretório de página que registra como os endereços virtuais são mapeados para endereços físicos. Quando o thread em um processo está em execução, o sistema operacional Windows usa esse diretório de página para interpretar endereços virtuais.

Durante a depuração no modo de usuário, o processo atual determina o contexto do processo. Os endereços virtuais usados em comandos do depurador, extensões e janelas de informações de depuração são interpretados usando o diretório de página do processo atual.

Durante a depuração no modo kernel, você pode definir o contexto do processo usando o comando .process (Definir Contexto do Processo). Use esse comando para selecionar qual diretório de página do processo é usado para interpretar endereços virtuais. Depois de definir o contexto do processo, você pode usar esse contexto em qualquer comando que tem endereços. Você pode até mesmo definir pontos de interrupção nesse endereço. Ao incluir uma opção /i no comando .process para especificar a depuração invasiva, você também pode usar o depurador do kernel para definir pontos de interrupção no espaço do usuário.

Você também pode definir pontos de interrupção no modo de usuário do depurador do kernel usando um ponto de interrupção específico do processo em uma função de espaço do kernel. Defina pontos de interrupção estratégicos e aguarde o contexto apropriado ser exibido.

O contexto de endereço no modo de usuário faz parte do contexto do processo. Geralmente, você não precisa definir o contexto de endereço no modo de usuário diretamente. Se você definir o contexto do processo, o contexto de endereço no modo de usuário mudará automaticamente para a base do diretório da tabela de página relevante para o processo.

Quando você define o contexto do processo durante a depuração no modo kernel, esse contexto é mantido até que outro comando .process altere o contexto. O contexto de endereço no modo de usuário também é mantido até que um comando .process ou .context o altere. Esses contextos não são alterados quando o computador de destino é executado e não são afetados por alterações no contexto de registro ou no contexto local.

Contexto de registro

Cada thread tem seus próprios valores de registro. Esses valores são armazenados nos registradores da CPU quando o thread está sendo executado e são armazenados na memória quando outro thread está sendo executado.

Durante a depuração no modo de usuário, o thread atual geralmente determina o contexto de registro. Qualquer referência a registros em comandos do depurador, extensões e janelas de informações de depuração é interpretada de acordo com os registros do thread atual.

Você poderá alterar o contexto de registro para um valor diferente do thread atual enquanto estiver executando a depuração no modo de usuário usando um dos seguintes comandos:

.cxr (Exibir Registro de Contexto)

.ecxr (Exibir Registro de Contexto de Exceção)

Durante a depuração no modo kernel, você pode controlar o contexto de registro usando diversos comandos do depurador, incluindo:

.thread (Definir contexto de registro)

.cxr (Exibir Registro de Contexto)

.trap (Exibir quadro de interceptação)

Esses comandos não alteram os valores dos registros de CPU. Em vez disso, o depurador recupera o contexto de registro especificado de seu local na memória. Na verdade, o depurador pode recuperar apenas os valores de registro salvos. (Outros valores são definidos dinamicamente e não são salvos. Os valores salvos são suficientes para recriar um rastreamento de pilha.

Depois que o contexto de registro é definido, o novo contexto é usado para os comandos que usam valores de registro, como k (Exibir Backtrace da Pilha) e r (Registros).

No entanto, quando você estiver depurando computadores com multiprocessadores, alguns comandos permitirão que você especifique um processador. (Para obter mais informações sobre esses comandos, confira Sintaxe do multiprocessador.) Se você especificar um processador para um comando, o comando usará o contexto de registro do thread ativo no processador especificado em vez do contexto de registro atual, mesmo se o processador especificado for o processador atualmente ativo.

Além disso, se o contexto de registro não corresponder à configuração atual do modo do processador, esses comandos produzirão uma saída incorreta ou sem sentido. Para evitar os erros de saída, os comandos que dependem do estado do registro falham até você alterar o modo do processador para corresponder ao contexto de registro. Para alterar o modo do processador, use o comando .effmach (Computador Efetivo).

Alterar o contexto de registro também pode alterar o contexto local. Dessa forma, o contexto de registro pode afetar a exibição de variáveis locais.

Se ocorrer qualquer execução, definição de etapas ou rastreamento de aplicativo, o contexto de registro será imediatamente redefinido para corresponder à posição do contador de programa. No modo de usuário, o contexto de registro também será redefinido se o processo ou thread atual for alterado.

O contexto de registro afeta os rastreamentos de pilha, porque o rastreamento de pilha começa no local para o qual o registro de ponteiro de pilha (esp em um processador com base em x86) aponta. Se o contexto de registro estiver definido como um valor inválido ou inacessível, os rastreamentos de pilha não poderão ser obtidos.

Você pode aplicar um ponto de interrupção do processador (ponto de interrupção de dados) a um contexto de registro específico usando o comando .apply_dbp (Aplicar Ponto de Interrupção de Dados ao Contexto).

Contexto local

Quando um programa está sendo executado, o significado de variáveis locais depende da localização do contador de programa, porque o escopo dessas variáveis se estende apenas à função em que elas são definidas.

Quando você está executando a depuração no modo de usuário ou no modo kernel, o depurador usa o escopo da função atual (o quadro atual na pilha) como o contexto local. Para alterar esse contexto, use o comando .frame (Definir Contexto Local) ou clique duas vezes no quadro desejado na janela Chamadas.

Na depuração no modo de usuário, o contexto local é sempre um quadro no rastreamento de pilha do thread atual. Na depuração no modo kernel, o contexto local é sempre um quadro no rastreamento de pilha do thread do contexto de registro atual.

Você pode usar apenas um quadro de pilha por vez para o contexto local. Não é possível acessar variáveis locais em outros quadros.

O contexto local será redefinido se ocorrer qualquer um dos seguintes eventos:

  • Qualquer execução, definição de etapas ou rastreamento de programas

  • O uso do delimitador de thread (~) em qualquer comando

  • Qualquer alteração no contexto de registro

A extensão !for_each_frame permite que você execute um único comando repetidamente, uma vez para cada quadro na pilha. Esse comando altera o contexto local de cada quadro, executa o comando especificado e retorna o contexto local ao seu valor original.