Compartilhar via


Sintaxe multiprocessador

KD e WinDbg no modo kernel suportam a depuração de múltiplos processadores. Você pode executar esse tipo de depuração em qualquer plataforma multiprocessador.

Os processadores são numerados de zero a n.

Se o processador atual for o processador 0 (ou seja, se for o processador que atualmente causou a ativação do depurador), você poderá examinar os outros processadores não atuais (processadores um a n). No entanto, você não pode alterar nada nos processadores não atuais. Você só pode visualizar o estado deles.

Selecionando um processador

Você pode usar o comando .echocpunum (Mostrar Número da CPU) para exibir os números de processador do processador atual. A saída desse comando permite que você identifique imediatamente quando está trabalhando em um sistema de vários processadores pelo texto no prompt de depuração do kernel.

No exemplo a seguir, 0: antes do prompt kd> indica que você está depurando o primeiro processador do computador.

0: kd>

Use o comando ~s (Alterar Processador Atual) para alternar entre processadores, como mostra o exemplo a seguir.

0: kd> ~1s
1: kd>

Agora você está depurando o segundo processador no computador.

Talvez seja necessário alterar os processadores em um sistema multiprocessador se encontrar uma interrupção e não conseguir entender o rastreamento de pilha. A interrupção pode ter ocorrido em um processador diferente.

Especificando processadores em outros comandos

Você pode adicionar um número de processador antes de vários comandos. Esse número não é precedido por um til (~), exceto no comando ~S.

Nota Na depuração no modo de usuário, o til é usado para especificar threads. Para obter mais informações sobre essa sintaxe, consulte a Sintaxe do Thread.

As IDs do processador não precisam ser referenciadas explicitamente. Em vez disso, você pode usar uma expressão numérica que é resolvida para um inteiro que corresponde a uma ID do processador. Para indicar que a expressão deve ser interpretada como um processador, use a sintaxe a seguir.

||[Expression]

Nessa sintaxe, os colchetes são necessários e a Expressão significa qualquer expressão numérica que seja resolvida para um inteiro que corresponda a uma ID do processador.

No exemplo a seguir, o processador muda dependendo do valor de um pseudo-registro definido pelo usuário.

||[@$t0]

exemplos de

O exemplo a seguir usa o comando k (Display Stack Backtrace) para exibir um rastreamento de pilha do segundo processador.

1: kd> 2k 

O exemplo a seguir usa o comando r (Registers) para exibir o registro eax do processador três.

1: kd> 3r eax 

No entanto, o comando a seguir fornece um erro de sintaxe, pois você não pode alterar o estado de um processador diferente do processador atual.

1: kd> 3r eax=808080 

Pontos de interrupção

Durante a depuração do kernel, os comandos bp, bu, bm (Set Breakpoint) e ba (Break on Access) se aplicam a todos os processadores de um computador com vários processadores.

Por exemplo, se o processador atual for três, você poderá inserir o comando a seguir para colocar um ponto de interrupção em SomeAddress.

1: kd> bp SomeAddress 

Em seguida, qualquer processador (não apenas um processador) executado nesse endereço causa uma armadilha de ponto de interrupção.

Exibindo informações do processador

Você pode usar a extensão !running para exibir o status de cada processador no computador de destino. Para cada processador, !running também pode exibir o campo de thread atual e o próximo do PRCB (bloco de controle de processo), o estado dos 16 spinlocks enfileirados internos e um rastreio de pilha.

Você pode usar as extensões !cpuinfo e !cpuid para exibir informações sobre os próprios processadores.