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.
Na depuração em modo kernel, existem muitos processos, threads e, por vezes, sessões de utilizador a serem executadas simultaneamente. Portanto, frases como "endereço virtual 0x80002000" ou "o registro eax " são ambíguas. Você deve especificar o contexto no qual essas frases podem ser entendidas.
O depurador tem cinco contextos diferentes que você pode definir enquanto estiver depurando:
O contexto da sessão indica a sessão de usuário padrão.
O contexto do processo determina como o depurador interpreta endereços virtuais.
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.
O contexto de registro determina como o depurador interpreta os registros e também controla os resultados de um rastreamento de pilha. Este contexto também é conhecido como contexto de thread, embora esse termo não seja completamente preciso. Um contexto explícito é também um tipo de contexto de registo. Se você especificar um contexto explícito, esse contexto será usado em vez do contexto de registro atual.
O contexto local determina como o depurador interpreta as variáveis locais. Este contexto é também conhecido como âmbito de aplicação.
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 é automaticamente alterado 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 no modo de usuário, o processo atual determina o contexto do processo. Os endereços virtuais usados em comandos de 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 do modo kernel, você pode definir o contexto do processo usando o comando .process (set Process Context). 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 use 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 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 a partir do depurador do kernel, utilizando um ponto de interrupção específico para o processo em uma função no espaço do kernel. Defina pontos de interrupção estratégicos e aguarde que o contexto apropriado surja.
O contexto de endereçamento em modo de utilizador é parte do contexto do processo. Normalmente, não é necessário definir o contexto de endereço do modo de usuário diretamente. Se definir o contexto do processo, o contexto de endereço no modo de utilizador muda automaticamente para a base do 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 do processo é mantido até que outro comando .process altere o contexto. O contexto de endereço do 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 do registro ou no contexto local.
Contexto de registo
Cada thread tem seus próprios valores de registro. Esses valores são armazenados nos registradores da 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 no modo de usuário, o thread atual normalmente determina o contexto do 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ê pode 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 (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 do registro usando uma variedade de comandos do depurador, incluindo os seguintes comandos:
.thread (Definir contexto de registro)
.cxr (Registro de contexto de exibição)
.trap (Quadro de Armadilha de Exibição)
Esses comandos não alteram os valores dos registros da CPU. Em vez disso, o depurador recupera o contexto de registo especificado do 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 (Display Stack Backtrace) e r (Registers).
No entanto, quando você está depurando computadores com vários processadores, alguns comandos permitem que você especifique um processador. (Para obter mais informações sobre esses comandos, consulte 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 que o processador especificado seja o processador atualmente ativo.
Além disso, se o contexto do 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é que você altere o modo do processador para corresponder ao contexto do registro. Para alterar o modo do processador, use o comando .effmach (Effective Machine),
Alterar o contexto do registo também pode alterar o contexto local. Dessa forma, o contexto do registro pode afetar a exibição de variáveis locais.
Se ocorrer qualquer execução, avanço ou rastreamento de programa, o contexto do registro será imediatamente redefinido para alinhar à posição do contador do programa. No modo de usuário, o contexto de registro também é 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 baseado em x86) aponta. Se o contexto do registro for 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 (Apply Data Breakpoint to Context ).
Contexto Local
Quando um programa está em execução, o significado de variáveis locais depende da localização do contador do programa, porque o escopo de tais variáveis se estende apenas à função em que elas são definidas.
Quando você está executando depuração de modo de usuário ou 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 de modo de usuário, o contexto local é sempre um quadro dentro do rastreamento de pilha do thread atual. Na depuração em modo kernel, o contexto local é sempre uma moldura dentro do rastreamento de pilha da thread do contexto de registo atual.
Você pode usar apenas um quadro de pilha de cada vez para o contexto local. Variáveis locais em outros quadros não podem ser acessadas.
O contexto local é redefinido se ocorrer algum dos seguintes eventos:
Qualquer execução, revisão ou rastreamento de qualquer programa
Qualquer uso do delimitador de thread (~) em qualquer comando
Qualquer alteração ao contexto do registo
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.