Sintaxe multiprocessador
O WinDbg no modo KD e kernel dá suporte à depuração de vários processadores. Você pode executar esse tipo de depuração em qualquer plataforma multiprocessador.
Os processadores são numerados como 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 exibir o estado deles.
Selecionando um processador
Você pode usar o comando .echocpunum (Mostrar Número da CPU) para exibir os números do processador atual. A saída desse comando permite que você informe imediatamente quando você está trabalhando em um sistema de vários processadores pelo texto no prompt de depuração do kernel.
No exemplo a seguir, 0: na frente do prompt kd> indica que você está depurando o primeiro processador no 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 processadores em um sistema multiprocessador se encontrar uma quebra 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 bloco (~), exceto no comando ~S .
Nota Na depuração no modo de usuário, o bloco é usado para especificar threads. Para obter mais informações sobre essa sintaxe, consulte Sintaxe de thread.
As IDs do processador não precisam ser referenciadas explicitamente. Em vez disso, você pode usar uma expressão numérica que resolve 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 Expression 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
O exemplo a seguir usa o comando k (Display Stack Backtrace) para exibir um rastreamento de pilha do processador dois.
1: kd> 2k
O exemplo a seguir usa o comando r (Registros) 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
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 !em execução para exibir a status de cada processador no computador de destino. Para cada processador, !running também pode exibir os campos de thread atuais e próximos do PRCB (bloco de controle de processo), o estado dos 16 spinlocks internos na fila e um rastreamento de pilha.
Você pode usar as extensões !cpuinfo e !cpuid para exibir informações sobre os próprios processadores.