ba (Break on Access)

La commande ba définit un point d’arrêt processeur (souvent appelé, de manière moins précise, un point d’arrêt de données). Ce point d’arrêt est déclenché lorsque la mémoire spécifiée est accédée.

Mode Utilisateur

[~Thread] ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

Mode Noyau

ba[ID] Access Size [Options] [Address [Passes]] ["CommandString"]

Paramètres

Thread
Spécifie le fil d’exécution auquel le point d’arrêt s’applique. Pour plus d’informations sur la syntaxe, consultez la syntaxe des threads. Vous pouvez spécifier des threads uniquement en mode utilisateur.

Identifiant
Spécifie un numéro optionnel qui identifie le point d’arrêt. Si vous ne spécifiez pas ID, le premier numéro de point d’arrêt disponible est utilisé. Vous ne pouvez pas ajouter d’espace entre ba et le numéro d’ID. Chaque processeur supporte uniquement un nombre limité de points d’arrêt processeur, mais il n’y a pas de restriction sur la valeur du numéro ID. Si vous mettez ID entre crochets ([]), ID peut inclure n’importe quelle expression. Pour plus d’informations sur la syntaxe, consultez la syntaxe d’expression numérique.

Accès
Spécifie le type d’accès qui satisfait le point d’arrêt. Ce paramètre peut prendre les valeurs suivantes.

Option Action

e (exécution)

Faites un clic droit dans le débogueur lorsque le CPU récupère une instruction de l’adresse spécifiée.

r (lecture/écriture)

Provoque une interruption dans le débogueur lorsque le CPU lit ou écrit à l’adresse spécifiée.

w (écriture)

Provoque une interruption dans le débogueur lorsque le CPU écrit à l’adresse spécifiée.

i (i/o)

(Uniquement en mode noyau, uniquement sur les systèmes à base de x86) Provoque une interruption dans le débogueur lorsque le port I/O à l’adresse spécifiée est accédé.

Taille
Spécifie la taille de l’emplacement, en octets, à surveiller pour l’accès. Sur un processeur basé sur x86, ce paramètre peut être de 1, 2 ou 4. Cependant, si Accès est égal à e, Taille doit être égal à 1.

Sur un processeur basé sur x64, ce paramètre peut être de 1, 2, 4 ou 8. Cependant, si Accès est égal à e, Taille doit être égal à 1.

Options Spécifie les options de point d’arrêt. Vous pouvez utiliser n’importe lequel des options suivantes, sauf indication contraire :

/1
Crée un point d’arrêt « one-shot ». Après que ce point d’arrêt soit déclenché, le point d’arrêt est définitivement retiré de la liste des points d’arrêt.

/pEProcess
(Uniquement en mode noyau) Spécifie un processus associé à ce point d’arrêt. EProcess doit être l’adresse réelle de la structure EPROCESS, et non le PID. Le point d’arrêt n’est déclenché que s’il est rencontré dans le contexte de ce processus.

/tEThread
(Uniquement en mode noyau) Spécifie un fil associé à ce point d’arrêt. EThread doit être l’adresse réelle de la structure ETHREAD, et non l’ID du thread. Le point d’arrêt n’est déclenché que s’il est rencontré dans le contexte de ce thread. Si vous utilisez /pEProcess et /tEThread, vous pouvez les saisir dans n’importe quel ordre.

/cMaxCallStackDepth
Provoque l’activité du point d’arrêt uniquement lorsque la profondeur de la pile des appels est inférieure à MaxCallStackDepth. Vous ne pouvez pas combiner cette option avec /C.

/CMinCallStackDepth
Provoque l’activité du point d’arrêt uniquement lorsque la profondeur de la pile des appels est supérieure à MinCallStackDepth. Vous ne pouvez pas combiner cette option avec /c.

/w dx object expression Définit un point d’arrêt conditionnel basé sur la valeur booléenne retournée par l’expression d’objet dx. L’argument est une expression du modèle de données (dx) qui évalue à vrai (condition correspondante – interruption) ou à faux (condition non correspondante – pas d’interruption).

Cet exemple définit un point d’arrêt conditionnel basé sur la valeur de globalVariable. Cela permet un point d’arrêt d’accès, par exemple, pour vérifier la valeur qui a été écrite lors de la détermination si le débogueur doit s’interrompre.

ba w 4 /w "mymodule!globalVariable == 4" mymodule!globalVariable

Cet exemple montre comment définir un point d’arrêt en utilisant JavaScript.

ba w 4 /w "@$scriptContents.myFunc(mymodule!globalVariable)" mymodule!globalVariable

Pour plus d’informations sur les objets de débogage, consultez dx (Afficher l’Expression du Modèle d’Objet de Débogage).

Pour plus d’informations sur les points d’arrêt conditionnels, consultez la mise en place d’un point d’arrêt conditionnel.

Adresse
Spécifie toute adresse valide. Si l’application accède à la mémoire à cette adresse, le débogueur arrête l’exécution et affiche les valeurs actuelles de tous les registres et drapeaux. Cette adresse doit être un décalage et alignée de manière appropriée pour correspondre au paramètre Size. (Par exemple, si Size est 4, Address doit être un multiple de 4.) Si vous omettez Address, le pointeur d’instruction actuel est utilisé. Pour plus d’informations sur la syntaxe, consultez la syntaxe d’adresse et de plage d’adresses.

Pass
Pour plus d’informations sur la syntaxe, consultez la syntaxe d’adresse et de plage d’adresses. Spécifie le nombre de fois où le point d’arrêt est contourné jusqu’à ce qu’il soit activé. Ce nombre peut être n’importe quelle valeur 16 bits. Le nombre de fois que le compteur de programme passe par ce point sans se rompre est d’une unité inférieure à la valeur de ce nombre. Par conséquent, omettre ce nombre revient à le définir égal à 1. Notez également que ce nombre compte seulement les fois où l’application s’exécute passé ce point. Passer à pas ou tracer au-delà de ce point ne compte pas. Après avoir atteint le nombre total, vous pouvez réinitialiser ce nombre uniquement en effaçant et en réinitialisant le point d’arrêt.

CommandString
Spécifie une liste de commandes à exécuter chaque fois que le point d’arrêt est rencontré le nombre de fois spécifié. Ces commandes ne sont exécutées que si le point d’arrêt est atteint après avoir émis une commande g (Go), et non après une commande t (Trace) ou p (Step). Les commandes de débogueur dans CommandString peuvent inclure des paramètres.

Vous devez encadrer cette chaîne de commandes entre guillemets, et vous devriez séparer plusieurs commandes par des points-virgules. Vous pouvez utiliser des caractères de contrôle C standard (tels que \n et \"). Les points-virgules contenus dans des guillemets de deuxième niveau (\") sont interprétés comme faisant partie de la chaîne de caractères intégrée.

Ce paramètre est facultatif.

Environnement

Élément Description
Modes mode utilisateur, mode noyau
Targets uniquement en débogage
Plateformes all

Informations supplémentaires

en direct Pour plus d’informations sur les points d’arrêt processeur, consultez les Points d’Arrêt Processeur (points d’arrêt ba). Pour plus d’informations et d’exemples sur l’utilisation des points d’arrêt, d’autres commandes de points d’arrêt et des méthodes de contrôle des points d’arrêt, et des informations sur la façon de définir des points d’arrêt dans l’espace utilisateur à partir d’un débogueur de noyau, consultez l’Utilisation des Points d’Arrêt. Pour plus d’informations sur les points d’arrêt conditionnels, consultez la mise en place d’un point d’arrêt conditionnel.

Notes

Le débogueur utilise le numéro ID pour faire référence au point d’arrêt dans les commandes bc (Clear Breakpoint), bd (Disable Breakpoint) et be (Enable Breakpoint) ultérieures.

Utilisez la commande bl (Liste des Points d’Arrêt) pour répertorier tous les points d’arrêt existants, leurs numéros ID et leur statut.

Utilisez la commande .bpcmds (Afficher les Commandes de Point d’Arrêt) pour lister tous les points d’arrêt existants, leurs numéros ID et les commandes qui ont été utilisées pour les créer.

Chaque point d’arrêt processeur a une taille associée. Par exemple, un point d’arrêt processeur w (écriture) pourrait être défini à l’adresse 0x70001008 avec une taille de quatre octets. Ceci surveillerait le bloc d’adresses de 0x70001008 à 0x7000100B, inclus. Si ce bloc de mémoire est écrit, le point d’arrêt sera déclenché.

Il peut arriver que le processeur effectue une opération sur une région de mémoire qui chevauche, mais n’est pas identique à, la région spécifiée. Dans cet exemple, une opération d’écriture unique qui inclut la plage 0x70001000 à 0x7000100F, ou une opération d’écriture qui inclut uniquement l’octet à 0x70001009, serait une opération de chevauchement. Dans une telle situation, que le point d’arrêt soit déclenché ou non dépend du processeur. Vous devriez consulter le manuel du processeur pour des détails spécifiques. Pour prendre un cas spécifique, sur un processeur x86, un point d’arrêt de lecture ou d’écriture est déclenché chaque fois que la plage accédée chevauche la plage du point d’arrêt.

De même, si un point d’arrêt e (exécution) est défini à l’adresse 0x00401003, et qu’une instruction de deux octets couvrant les adresses 0x00401002 et 0x00401003 est exécutée, le résultat dépend du processeur. Encore une fois, consultez le manuel d’architecture du processeur pour les détails.

Le processeur distingue entre les points d’arrêt définis par un débogueur en mode utilisateur et les points d’arrêt définis par un débogueur en mode noyau. Un point d’arrêt processeur en mode utilisateur n’affecte aucun processus en mode noyau. Un point d’arrêt processeur en mode noyau peut ou non affecter un processus en mode utilisateur, selon si le code en mode utilisateur utilise l’état du registre de débogage et s’il y a un débogueur en mode utilisateur attaché.

Pour appliquer les points d’arrêt de données existants du processus actuel à un contexte de registre différent, utilisez la commande .apply_dbp (Appliquer le Point d’Arrêt de Données au Contexte).

Sur un ordinateur multiprocesseur, chaque point d’arrêt processeur s’applique à tous les processeurs. Par exemple, si le processeur actuel est le 3 et que vous utilisez la commande ba e1 MyAddress pour mettre un point d’arrêt à MyAddress, n’importe quel processeur -- pas seulement le processeur 3 -- qui exécute à cette adresse déclenche le point d’arrêt. (Cela vaut également pour les points d’arrêt logiciels).

Vous ne pouvez pas créer plusieurs points d’arrêt processeur à la même adresse qui diffèrent uniquement dans leurs valeurs CommandString. Cependant, vous pouvez créer plusieurs points d’arrêt à la même adresse qui ont différentes restrictions (par exemple, différentes valeurs des options /p, /t, /c, and /C).

Pour plus de détails sur les points d’arrêt processeur, et des restrictions supplémentaires qui s’appliquent à eux, consultez les Points d’Arrêt Processeur (points d’arrêt ba).

Les exemples suivants montrent la commande ba. La commande suivante définit un point d’arrêt pour l’accès en lecture sur 4 octets de la variable myVar.

0:000> ba r4 myVar

La commande suivante ajoute un point d’arrêt sur tous les ports série avec des adresses de 0x3F8 à 0x3FB. Ce point d’arrêt est déclenché si quelque chose est lu ou écrit sur ces ports.

kd> ba i4 3f8