Points d’arrêt du processeur (ba Points d’arrêt)

Les points d’arrêt contrôlés par le processeur à la demande du débogueur sont appelés points d’arrêt du processeur ou points d’arrêt de données. Les points d’arrêt contrôlés directement par le débogueur sont appelés points d’arrêt logiciels.

Note Bien que le terme point d’arrêt de données soit couramment utilisé comme synonyme de point d’arrêt du processeur, ce terme peut être trompeur. Il existe deux types fondamentaux de points d’arrêt : les points d’arrêt du processeur, qui sont contrôlés par le processeur, et les points d’arrêt logiciels, qui sont contrôlés par le débogueur. Les points d’arrêt du processeur sont généralement définis sur les données du programme (c’est la raison pour laquelle ils sont appelés « points d’arrêt de données ») mais ils peuvent également être définis sur le code exécutable. Les points d’arrêt logiciels sont généralement définis sur le code exécutable, mais ils peuvent également être définis sur les données du programme. Malheureusement, dans la documentation de débogage, il est courant de faire référence aux points d’arrêt du processeur en tant que « points d’arrêt de données », même lorsqu’ils sont définis sur du code exécutable.

Points d’arrêt du processeur

Un point d’arrêt du processeur est déclenché lorsqu’un emplacement de mémoire spécifique est accessible. Il existe quatre types de points d’arrêt du processeur, correspondant au type d’accès à la mémoire qui le déclenche :

Type de point d’arrêt Action
e (exécuter) Déclenchée lorsque le processeur récupère une instruction à partir de l’adresse spécifiée.
r (lecture/écriture) Déclenchée lorsque le processeur lit ou écrit de la mémoire à l’adresse spécifiée.
w (écriture) Déclenchée lorsque le processeur écrit de la mémoire à l’adresse spécifiée.
i (e/s) Déclenchée lorsque le port d’E/S à l’adresse spécifiée est accessible.

Une taille est associée à chaque point d’arrêt du processeur. Par exemple, un point d’arrêt du processeur w (écriture) peut être défini à l’adresse 0x70001008 avec une taille de quatre octets. Cela permet de surveiller le bloc d’adresses de 0x70001008 à 0x7000100B inclus. Si ce bloc de mémoire est écrit dans, le point d’arrêt est 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 l’exemple donné dans le paragraphe précédent, 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 qui se chevauche. Dans une telle situation, le déclenchement du point d’arrêt dépend du processeur. Pour plus d’informations sur la façon dont cette situation est gérée sur un processeur spécifique, consultez le manuel de l’architecture du processeur et recherchez « registre de débogage » ou « registre de contrôle de débogage ». Pour prendre un type de processeur spécifique comme exemple, sur un processeur x86, un point d’arrêt de lecture ou d’écriture est déclenché chaque fois que la plage consultée chevauche la plage de points d’arrêt.

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

Le processeur fait la distinction 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 du processeur en mode utilisateur n’affecte aucun processus en mode noyau. Un point d’arrêt du processeur en mode noyau peut ou non affecter un processus en mode utilisateur, selon que le code en mode utilisateur utilise l’état de registre de débogage et qu’il existe un débogueur en mode utilisateur attaché.

Pour appliquer les points d’arrêt de données existants du processus actuel à un autre contexte de registre, utilisez la commande .apply_dbp (Appliquer le point d’arrêt des données au contexte).

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

Points d’arrêt logiciels

Les points d’arrêt logiciels, contrairement aux points d’arrêt du processeur, sont contrôlés par le débogueur. Lorsque le débogueur définit un point d’arrêt logiciel à un emplacement donné, il remplace temporairement le contenu de cet emplacement de mémoire par une instruction d’arrêt. Le débogueur mémorise le contenu d’origine de cet emplacement, de sorte que si cette mémoire est affichée dans le débogueur, le débogueur affiche le contenu d’origine de cet emplacement de mémoire, et non l’instruction d’arrêt. Lorsque le processus cible exécute le code à cet emplacement, l’instruction d’arrêt entraîne l’arrêt du processus dans le débogueur. Une fois que vous avez effectué les actions de votre choix, vous pouvez provoquer la reprise de l’exécution de la cible, et l’exécution reprendra avec l’instruction qui se trouvait à l’origine à cet emplacement.

Disponibilité des types de points d’arrêt du processeur

L’option i (e/s) est disponible uniquement pendant le débogage en mode noyau.

Toutes les tailles de données ne peuvent pas être utilisées avec tous les types de points d’arrêt du processeur. Les tailles autorisées dépendent du processeur de l’ordinateur cible. Pour plus d’informations, consultez ba (Arrêt de l’accès).

Limitations des points d’arrêt logiciels et des points d’arrêt du processeur

Il est possible de spécifier une adresse de données plutôt qu’une adresse de programme lors de l’utilisation des commandes bp ou bm /a. Toutefois, même si un emplacement de données est spécifié, ces commandes créent des points d’arrêt logiciels, et non des points d’arrêt du processeur. Lorsque le débogueur place un point d’arrêt logiciel à un emplacement donné, il remplace temporairement le contenu de cet emplacement de mémoire par une instruction d’arrêt. Cela n’endommage pas l’image exécutable, car le débogueur mémorise le contenu d’origine de cet emplacement et lorsque le processus cible tente d’exécuter ce code, le débogueur peut répondre de manière appropriée. Toutefois, lorsqu’un point d’arrêt logiciel est défini dans un emplacement de données, le remplacement résultant peut entraîner une altération des données. Par conséquent, la définition d’un point d’arrêt logiciel sur un emplacement de données n’est sécurisée que si vous êtes certain que cet emplacement sera utilisé uniquement en tant que code exécutable.

Les commandes bp, bu et bm définissent des points d’arrêt logiciels en remplaçant l’instruction du processeur par une instruction d’arrêt. Par conséquent, ils ne peuvent pas être utilisés dans du code en lecture seule ou tout autre code qui ne peut pas être remplacé. Pour définir un point d’arrêt dans ce code, vous devez utiliser ba (Break on Access) avec l’option e (execute).

Vous ne pouvez pas créer plusieurs points d’arrêt de processeur à la même adresse qui diffèrent uniquement dans la commande exécutée automatiquement lorsque le point d’arrêt est déclenché. Toutefois, vous pouvez créer plusieurs points d’arrêt à la même adresse qui diffèrent par leurs autres restrictions (par exemple, vous pouvez créer plusieurs points d’arrêt à la même adresse à l’aide de la commande ba avec des valeurs différentes des options /p, /t, /c et /C ).

Le point d’arrêt initial dans un processus en mode utilisateur (généralement défini sur la fonction main ou son équivalent) ne peut pas être un point d’arrêt du processeur.

Le nombre de points d’arrêt du processeur pris en charge dépend de l’architecture du processeur cible.

Contrôle des points d’arrêt logiciels et des points d’arrêt du processeur

Les points d’arrêt logiciels peuvent être créés avec les commandes bp (Définir un point d’arrêt), bm (Définir le point d’arrêt du symbole) et bu (Définir le point d’arrêt non résolu). Les points d’arrêt du processeur peuvent être créés avec la commande ba (Arrêter sur Access). Les commandes qui désactivent, activent et modifient les points d’arrêt s’appliquent à tous les types de points d’arrêt. Les commandes qui affichent une liste de points d’arrêt incluent tous les points d’arrêt et indiquent le type de chacun. Pour obtenir la liste de ces commandes, consultez Méthodes de contrôle des points d’arrêt.

La boîte de dialogue Points d’arrêt WinDbg affiche tous les points d’arrêt, indiquant les points d’arrêt du processeur avec la notation « e », « r », « w » ou « i » suivie de la taille du bloc. Cette boîte de dialogue peut être utilisée pour modifier n’importe quel point d’arrêt. La zone de texte Commande de cette boîte de dialogue peut être utilisée pour créer n’importe quel type de point d’arrêt. Si un point d’arrêt du processeur est souhaité, commencez l’entrée par « ba ». Lorsque vous définissez un point d’arrêt à l’aide de la souris dans la fenêtre WinDbg Désassemblement ou fenêtre Source, le débogueur crée un point d’arrêt logiciel non résolu.

Les points d’arrêt du processeur sont stockés dans les registres de débogage du processeur. Il est possible de définir un point d’arrêt en modifiant manuellement une valeur de registre de débogage, mais cela est fortement déconseillé.