Syntaxe multiprocesseur

KD et WinDbg en mode noyau prennent en charge le débogage de plusieurs processeurs. Vous pouvez effectuer ce type de débogage sur n’importe quelle plateforme multiprocesseur.

Les processeurs sont numérotés de zéro à n.

Si le processeur actuel est le processeur 0 (autrement dit, s’il s’agit du processeur qui a actuellement provoqué l’activité du débogueur), vous pouvez examiner les autres processeurs non actuels (processeurs un à n). Toutefois, vous ne pouvez rien changer dans les processeurs non actuels. Vous pouvez uniquement afficher leur état.

Sélection d’un processeur

Vous pouvez utiliser la commande .echocpunum (Afficher le numéro du processeur) pour afficher les numéros de processeur du processeur actuel. La sortie de cette commande vous permet de savoir immédiatement quand vous travaillez sur un système de processeur multiple par le texte de l’invite de débogage du noyau.

Dans l’exemple suivant, 0 : devant l’invite kd> indique que vous déboguez le premier processeur de l’ordinateur.

0: kd>

Utilisez la commande ~s (Modifier le processeur actuel) pour basculer entre les processeurs, comme le montre l’exemple suivant.

0: kd> ~1s
1: kd>

Vous déboguez maintenant le deuxième processeur de l’ordinateur.

Vous devrez peut-être modifier les processeurs sur un système multiprocesseur si vous rencontrez un arrêt et que vous ne pouvez pas comprendre la trace de la pile. L’arrêt peut s’être produit sur un autre processeur.

Spécification de processeurs dans d’autres commandes

Vous pouvez ajouter un numéro de processeur avant plusieurs commandes. Ce nombre n’est pas précédé d’un tilde (~), sauf dans la commande ~S .

Note Dans le débogage en mode utilisateur, le tilde est utilisé pour spécifier des threads. Pour plus d’informations sur cette syntaxe, consultez Syntaxe de thread.

Les ID de processeur n’ont pas besoin d’être mentionnés explicitement. Au lieu de cela, vous pouvez utiliser une expression numérique qui se résout en entier qui correspond à un ID de processeur. Pour indiquer que l’expression doit être interprétée comme un processeur, utilisez la syntaxe suivante.

||[Expression]

Dans cette syntaxe, les crochets sont obligatoires, et Expression représente toute expression numérique qui se résout en entier qui correspond à un ID de processeur.

Dans l’exemple suivant, le processeur change en fonction de la valeur d’un pseudo-registre défini par l’utilisateur.

||[@$t0]

Exemples

L’exemple suivant utilise la commande k (Display Stack Backtrace) pour afficher une trace de pile à partir du processeur 2.

1: kd> 2k 

L’exemple suivant utilise la commande r (Registers) pour afficher le registre eax du processeur 3.

1: kd> 3r eax 

Toutefois, la commande suivante génère une erreur de syntaxe, car vous ne pouvez pas modifier l’état d’un processeur autre que le processeur actuel.

1: kd> 3r eax=808080 

Points d’arrêt

Pendant le débogage du noyau, les commandes bp, bu, bm (Set Breakpoint) et ba (Break on Access) s’appliquent à tous les processeurs d’un ordinateur à plusieurs processeurs.

Par exemple, si le processeur actuel est trois, vous pouvez entrer la commande suivante pour placer un point d’arrêt sur SomeAddress.

1: kd> bp SomeAddress 

Ensuite, tout processeur (et pas seulement un processeur) qui s’exécute à cette adresse provoque un piège de point d’arrêt.

Affichage des informations du processeur

Vous pouvez utiliser l’extension !running pour afficher les status de chaque processeur sur l’ordinateur cible. Pour chaque processeur, !running peut également afficher les champs de thread actuel et suivant du bloc de contrôle de processus (PRCB), l’état des 16 spinlocks en file d’attente intégrés et une trace de pile.

Vous pouvez utiliser les extensions !cpuinfo et !cpuid pour afficher des informations sur les processeurs eux-mêmes.