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 de 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 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, 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, il est courant dans la littérature de débogage 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 le 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 de 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é 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 (entrée/sortie) Déclenché lorsque le port d’E/S à l’adresse spécifiée est accessible.

Chaque point d’arrêt du processeur a une taille associée. 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 surveillerait le bloc d’adresses de 0x70001008 à 0x7000100B inclus. Si ce bloc de mémoire est écrit, 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 se chevauche, mais qui n’est pas identique à la région spécifiée. Dans l’exemple donné dans le paragraphe précédent, une seule opération d’écriture 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 ce cas, si le point d’arrêt est déclenché 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 (d’exécution) est défini sur l’adresse 0x00401003, puis une instruction à 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 s’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 d’enregistrement, 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 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 s'applique également aux 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 provoque l’arrêt du processus dans le débogueur. Une fois que vous avez effectué les actions de votre choix, vous pouvez faire reprendre l'exécution du programme, et l'exécution reprendra avec l’instruction qui était initialement à cet emplacement.

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

L’option i/o 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 sur 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 de 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 est sécurisée uniquement si vous êtes certain que cet emplacement sera utilisé uniquement 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. Par conséquent, elles ne peuvent pas être utilisées 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 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 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

Vous pouvez créer des points d’arrêt logiciels avec les commandes bp (Définir le point d’arrêt de symbole),bm (Définir le point d’arrêt du symbole) et bu (Définir un point d’arrêt non résolu). Les points d’arrêt du processeur peuvent être créés avec la commande ba (Break on Access). 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 chaque point d’arrêt. Pour obtenir la liste de ces commandes, consultez Méthodes de contrôle des points d’arrêt.

La boîte de dialogue des points d'arrêt WinDbg affiche tous les points d'arrêt et indique 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 Désassembleur WinDbg ou dans la 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é.