Alterando contextos

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

O depurador tem cinco contextos diferentes que você pode definir durante a depuração:

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

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

  3. O contexto de endereço do 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 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 variáveis locais. Esse contexto também é conhecido como escopo.

Contexto de 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 de 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 qualquer thread dentro de 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 do modo de usuário, o processo atual determina o contexto do processo. Os endereços virtuais usados em comandos, extensões e janelas de informações de depuração do depurador são interpretados usando o diretório de página do processo atual.

Durante a depuração do modo kernel, você pode definir o contexto do processo usando o comando .process (Definir Contexto do Processo). Use este 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 usa endereços. Você pode até mesmo definir pontos de interrupção neste endereço. Ao incluir uma opção /i no comando .process para especificar a depuração invasiva, você também pode usar o depurador de kernel para definir pontos de interrupção no espaço do usuário.

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

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

Quando você define o contexto do processo durante a depuração do modo kernel, esse contexto de processo é 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.

Registrar Contexto

Cada thread tem seus próprios valores de registro. Esses valores são armazenados nos registros de CPU quando o thread está em execução e são armazenados na memória quando outro thread está em execução.

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

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

.cxr (Registro de Contexto de Exibição)

.ecxr (exibir registro de contexto de exceção)

Durante a depuração do modo kernel, você pode controlar o contexto de registro usando uma variedade de comandos de depurador, incluindo os seguintes comandos:

.thread (definir contexto de registro)

.cxr (Registro de Contexto de Exibição)

.trap (Quadro de Interceptação de Exibiçã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 de registro é usado para todos os comandos que usam valores de registro, como k (Exibir Backtrace de Pilha) e r (Registros).

No entanto, quando você está depurando computadores multiprocessadores, alguns comandos permitem que você especifique um processador. (Para obter mais informações sobre esses comandos, consulte Sintaxe 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 que o processador especificado seja o processador ativo no momento.

Além disso, se o contexto de registro não corresponder à configuração atual do modo de 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 de registro falham até que você altere o modo de processador para corresponder ao contexto de registro. Para alterar o modo de processador, use o comando .effmach (Effective Machine),

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

Se ocorrer qualquer execução, etapa ou rastreamento do aplicativo, o contexto de registro será redefinido imediatamente para corresponder à posição do contador do 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, pois o rastreamento de pilha começa no local para o qual o registro do ponteiro de pilha (esp em um processador baseado 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á em execução, o significado das variáveis locais depende da localização do contador do programa, pois o escopo dessas variáveis se estende apenas à função na qual elas são definidas.

Quando você está executando a depuração do modo de usuário ou do 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 do modo de usuário, o contexto local é sempre um quadro dentro do rastreamento de pilha do thread atual. Na depuração do modo kernel, o contexto local é sempre um quadro dentro do rastreamento de pilha do thread do contexto de registro atual.

Você pode usar apenas um período de pilha por vez para o contexto local. Variáveis locais em outros quadros não podem ser acessadas.

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

  • Qualquer execução, etapa ou rastreamento do programa

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

  • Qualquer alteração no contexto de registro

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