Partager via


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

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

Remarque Même si le terme point d’arrêt données est couramment utilisé comme synonyme de point d’arrêt processeur, il peut s’avérer trompeur. Il existe deux types fondamentaux de points d’arrêt : les points d’arrêt processeur, contrôlés par le processeur et les points d’arrêt logiciels, contrôlés par le débogueur. Les points d’arrêt processeur sont généralement définis sur les données du programme, c’est pourquoi ils sont appelés « points d’arrêt 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 peuvent également être définis sur les données du programme. Malheureusement, la littérature sur le débogage évoque souvent les points d’arrêt processeur comme « points d’arrêt données », même lorsqu’ils sont définis sur le code exécutable.

Points d’arrêt processeur

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

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

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 l’exemple du 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 de chevauchement. Dans une telle situation, que le point d’arrêt soit déclenché ou non dépend du processeur. Pour en savoir plus sur la façon dont cette situation est gérée sur un processeur spécifique, consultez le manuel d’architecture du processeur et recherchez « Registre de débogage » ou « Registre de contrôle de débogage ». Pour prendre l’exemple d’un processeur 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.

Points d’arrêt logiciels

Les points d’arrêt logiciels, contrairement aux points d’arrêt 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, celui-ci 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 provoque l’arrêt du processus dans le débogueur. Après avoir effectué les actions de votre choix, vous pouvez faire reprendre l’exécution à la cible, laquelle reprendra avec l’instruction qui se trouvait à l’origine à cet emplacement.

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

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

Les tailles de données ne sont pas toutes compatibles avec tous les types de points d’arrêt processeur. Les tailles autorisées dépendent du processeur de l’ordinateur cible. Pour en savoir plus, consultez ba (Pause sur accès).

Limites des points d’arrêt logiciels et des points d’arrêt 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 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, puis lorsque le processus cible tente d’exécuter ce code, le débogueur peut répondre de manière appropriée. Mais 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 de ces dernières. Par conséquent, la définition d’un point d’arrêt logiciel sur un emplacement de données est sans danger uniquement si vous êtes certain que cet emplacement ne sera utilisé que comme 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. Elles ne peuvent donc pas être utilisées dans un code en lecture seule ou dans tout autre code qui ne peut pas être remplacé. Pour définir un point d’arrêt dans un tel code, vous devez utiliser ba (Pause sur accès) avec l’option e (execute).

On ne peut pas créer plusieurs points d’arrêt processeur à la même adresse dont la seule différence est la commande qui est automatiquement exécutée 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 dans 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 différentes valeurs 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 principale ou son équivalent) ne peut pas être un point d’arrêt processeur.

Le nombre de points d’arrêt 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 processeur

On peut créer des points d’arrêt logiciels avec les commandes bp (Définir un point d’arrêt), bm (Définir un point d’arrêt symbole) et bu (Définir un point d’arrêt non résolu). Les points d’arrêt processeur peuvent être créés avec la commande ba (Pause sur accès). Les commandes qui désactivent, activent et modifient des 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 d’eux. Pour obtenir la liste de ces commandes, consultez les 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, en indiquant les points d’arrêt processeur avec la notation « e », « r », « w » ou « i » suivi de la taille du bloc. Cette boîte de dialogue permet de modifier n’importe quel point d’arrêt. La zone de texte Commande de cette boîte de dialogue permet de créer n’importe quel type de point d’arrêt. Si un point d’arrêt 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 Désassembleur ou dans la fenêtre Source de WinDgb, le débogueur crée un point d’arrêt logiciel non résolu.

Les points d’arrêt 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 du registre de débogage, mais cela est fortement déconseillé.