Risques liés à la définition de points d’arrêt
Lorsque vous définissez des points d’arrêt en spécifiant une adresse mémoire ou un symbole plus un décalage, vous ne devez pas placer ce point d’arrêt au milieu d’une instruction.
Par exemple, considérez le code désassemblé suivant.
770000f1 5e pop esi
770000f2 5b pop ebx
770000f3 c9 leave
770000f4 c21000 ret 0x10
770000f7 837ddc00 cmp dword ptr [ebp-0x24],0x0
Les trois premières instructions ne font qu’un seul octet. Toutefois, la quatrième instruction a une longueur de trois octets. (Il comprend des octets 0x770000F4, 0x770000F5 et 0x770000F6.) Si vous souhaitez placer un point d’arrêt sur cette instruction à l’aide de la commande bp, bu ou ba , vous devez spécifier l’adresse 0x770000F4.
Si vous placez un point d’arrêt dans l’adresse 0x770000F5 à l’aide de la commande ba , le processeur place un point d’arrêt à cet emplacement. Mais ce point d’arrêt ne serait jamais déclenché, car le processeur considère 0x770000F4 comme l’adresse réelle de l’instruction.
Si vous placez un point d’arrêt dans l’adresse 0x770000F5 à l’aide des commandes bp ou bu , le débogueur écrit un point d’arrêt à cet emplacement. Toutefois, ce point d’arrêt peut endommager la cible en raison de la façon dont le débogueur crée des points d’arrêt :
Le débogueur enregistre le contenu de 0x770000F5 et remplace cette mémoire par une instruction de point d’arrêt.
Si vous essayez d’afficher cette mémoire dans le débogueur, celui-ci n’affiche pas l’instruction de point d’arrêt qu’il a écrite. Au lieu de cela, le débogueur affiche la mémoire qui « doit » être là. Autrement dit, le débogueur affiche la mémoire d’origine ou les modifications apportées à cette mémoire depuis l’insertion du point d’arrêt.
Si vous utilisez la commande BC pour supprimer le point d’arrêt, le débogueur restaure la mémoire d’origine à son emplacement approprié.
Lorsque vous placez un point d’arrêt à 0x770000F5, le débogueur enregistre cet octet et une instruction d’arrêt est écrite ici. Toutefois, lorsque l’application s’exécute, elle atteint l’adresse 0x770000F4 et reconnaît cette adresse comme le premier octet d’une instruction multioctet. Le processeur tente ensuite de combiner 0x770000F4, 0x770000F5 et éventuellement quelques octets ultérieurs en une seule instruction. Cette combinaison peut créer une variété de comportements, dont aucun n’est souhaitable.
Par conséquent, lorsque vous placez des points d’arrêt à l’aide d’une commande bp, bu ou ba , veillez à toujours placer les points d’arrêt à la bonne adresse. Si vous utilisez l’interface graphique WinDbg pour ajouter des points d’arrêt, vous n’avez pas à vous soucier de cette situation, car l’adresse correcte est choisie automatiquement.
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)