Partilhar via


Sintaxe do multiprocessador

KD e WinDbg de modo kernel suportam depuração de vários 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 fez com que o depurador esteja ativo), você pode examinar os outros processadores não atuais (processadores de um a n). No entanto, não é possível alterar nada nos processadores não atuais. Você só pode ver o estado deles.

Seleção de um processador

Você pode usar o comando .echocpunum (Mostrar número da CPU) para exibir os números do processador atual. A saída deste comando permite identificar de imediato quando se está a trabalhar num sistema multiprocessador através do 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 (Change Current Processor) para alternar entre processadores, como mostra o exemplo a seguir.

0: kd> ~1s
1: kd>

Agora estás a depurar o segundo processador do computador.

Você pode ter que mudar de processador em um sistema multiprocessador se encontrar uma quebra e não conseguir entender o rastreamento de pilha. A quebra 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. Este número não é precedido por um til (~), exceto no comando ~S .

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

Os IDs do processador não precisam ser mencionados explicitamente. Em vez disso, você pode usar uma expressão numérica que resolve para um inteiro que corresponde a um ID de 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 se resolve para um inteiro que corresponde a um ID de processador.

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

||[@$t0]

exemplos

O seguinte exemplo usa o comando k (Display Stack Backtrace) para mostrar o 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, porque 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) aplicam-se a todos os processadores de um computador com vários processadores.

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

1: kd> bp SomeAddress 

Em seguida, qualquer processador (não apenas o processador um) que execute nesse endereço provoca uma interrupção de execuçã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 os campos de thread atual e próximo do bloco de controle de processo (PRCB), o estado dos 16 spinlocks internos em fila e um rastreamento de pilha.

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