Exécution jusqu’à ce qu’un état spécifié soit atteint
Il existe plusieurs façons de provoquer l’exécution de la cible jusqu’à ce qu’un état spécifié soit atteint.
Utilisation d’un point d’arrêt pour contrôler l’exécution
Une méthode consiste à utiliser un point d’arrêt. Le point d’arrêt le plus simple arrête l’exécution lorsque le compteur du programme atteint une adresse spécifiée. Un point d’arrêt plus complexe peut :
être déclenché uniquement lorsque cette adresse est exécutée par un thread spécifique,
autoriser un nombre spécifié de passages à travers cette adresse avant d’être déclenché,
émettre automatiquement une commande spécifiée lorsqu’elle est déclenchée, ou
watch une adresse spécifiée dans la mémoire non exécutable, déclenchée lorsque cette mémoire est lue ou écrite dans.
Pour plus d’informations sur la définition et le contrôle des points d’arrêt, consultez Utilisation de points d’arrêt.
Une façon plus compliquée d’exécuter jusqu’à ce qu’un état spécifié soit atteint consiste à utiliser un point d’arrêt conditionnel. Ce type de point d’arrêt est défini à une certaine adresse, mais n’est déclenché que si une condition spécifiée est conservée. Pour plus d’informations, consultez Définition d’un point d’arrêt conditionnel.
Points d’arrêt et Pseudo-Registers
Pour spécifier l’état souhaité, il est souvent utile d’utiliser des pseudo-registres automatiques. Il s’agit de variables contrôlées par le débogueur qui vous permettent de référencer diverses valeurs liées à l’état cible.
Par exemple, le point d’arrêt suivant utilise le pseudo-registre $thread , qui est toujours égal à la valeur du thread actuel. Il est résolu en valeur du thread actuel lorsqu’il est utilisé dans une commande. En utilisant $thread comme argument du paramètre /t de la commande bp (Définir le point d’arrêt), vous pouvez créer un point d’arrêt qui sera déclenché chaque fois que NtOpenFile est appelé par le thread qui était actif au moment où vous avez émis la commande bp :
kd> bp /t @$thread nt!ntopenfile
Ce point d’arrêt ne sera pas déclenché lorsqu’un autre thread appelle NtOpenFile.
Pour obtenir la liste des pseudo-registres automatiques, consultez Syntaxe des pseudo-registres.
Utilisation d’un fichier de script pour contrôler l’exécution
Une autre façon d’exécuter jusqu’à ce qu’un état spécifié soit atteint consiste à créer un fichier de script qui s’appelle de manière récursive, en testant l’état souhaité dans chaque itération.
En règle générale, ce fichier de script contient les jetons .if et .else . Vous pouvez utiliser une commande telle que t (Trace) pour exécuter une seule étape, puis tester la condition en question.
Par exemple, si vous souhaitez exécuter jusqu’à ce que le registre eax contienne la valeur 0x1234, vous pouvez créer un fichier de script appelé eaxstep qui contient la ligne suivante :
.if (@eax == 1234) { .echo 1234 } .else { t "$<eaxstep" }
Exécutez ensuite la commande suivante à partir de la fenêtre Commande du débogueur :
t "$<eaxstep"
Cette commande t exécute une seule étape, puis exécute la commande entre guillemets. Cette commande est $< (Exécuter le fichier de script), qui exécute le fichier eaxstep . Le fichier de script teste la valeur de eax, exécute la commande t , puis s’appelle de manière récursive. Cela se poursuit jusqu’à ce que le registre eax soit égal à 0x1234, auquel cas la commande .echo (Echo Comment) imprime un message dans la fenêtre Commande du débogueur et l’exécution s’arrête.
Pour plus d’informations sur les fichiers de script, consultez Utilisation de fichiers de script et Utilisation des programmes de commandes du débogueur.
Résolution ambiguë des points d’arrêt
Dans les versions 10.0.25310.1001 et ultérieures du moteur de débogueur, la résolution ambiguë des points d’arrêt est désormais prise en charge. Les points d’arrêt ambigus permettent au débogueur de définir des points d’arrêt dans certains scénarios où une expression de point d’arrêt est résolue à plusieurs emplacements. Pour plus d’informations, consultez Résolution ambiguë des points d’arrêt.
Voir aussi
Utilisation des points d’arrêt
bp, bu, bm (Définir le point d’arrêt)