Débogage en mode Assembly
Si vous avez des fichiers sources C ou C++ pour votre application, vous pouvez utiliser le débogueur beaucoup plus efficacement si vous déboguez en mode source.
Toutefois, il existe de nombreuses fois que vous ne pouvez pas effectuer de débogage source. Vous n’avez peut-être pas les fichiers sources de votre application. Vous déboguez peut-être le code d’une autre personne. Vous n’avez peut-être pas généré vos fichiers exécutables avec des symboles .pdb complets. Et même si vous pouvez effectuer un débogage source sur votre application, vous devrez peut-être suivre les routines Microsoft Windows que votre application appelle ou qui sont utilisées pour charger votre application.
Dans ces situations, vous devez déboguer en mode assembly. En outre, le mode assembly offre de nombreuses fonctionnalités utiles qui ne sont pas présentes dans le débogage source. Le débogueur affiche automatiquement le contenu des emplacements de mémoire et s’inscrit à mesure qu’ils sont accessibles et affiche l’adresse du compteur du programme. Cet affichage fait du débogage d’assembly un outil précieux que vous pouvez utiliser avec le débogage source.
Code de désassemblement
Le débogueur analyse principalement le code exécutable binaire. Au lieu d’afficher ce code au format brut, le débogueur désassemble ce code. Autrement dit, le débogueur convertit le code du langage de l’ordinateur en langage d’assembly.
Vous pouvez afficher le code résultant (appelé code de désassemblement) de différentes façons :
La commande u (Unassemble) désassemble et affiche une section spécifiée du langage de l’ordinateur.
La commande uf (Unassemble Function) désassemble et affiche une fonction.
La commande up (Unassemble from Physical Memory) désassemble et affiche une section spécifiée du langage de l’ordinateur qui a été stockée dans la mémoire physique.
La commande your (Unassemble Real Mode BIOS) désassemble et affiche un code en mode réel 16 bits spécifié.
La commande ux (Unassemble x86 BIOS) désassemble et affiche l’instruction de code BIOS x86 définie à une adresse spécifiée.
(WinDbg uniquement) La fenêtre de désassemblement et affiche une section spécifiée du langage de l’ordinateur. cette fenêtre est automatiquement active si vous sélectionnez la commande d’ouverture automatique du désassemblement dans le menu de la fenêtre . vous pouvez également ouvrir cette fenêtre en sélectionnant Désassemble dans le menu affichage, en appuyant sur alt+7 ou en appuyant sur le bouton de désassemblement (alt+7).
L’affichage du désassemblement s’affiche dans quatre colonnes : décalage d’adresse, code binaire, langage d’assembly mnémonique et détails du langage d’assembly. L’exemple suivant montre cet affichage.
0040116b 45 inc ebp
0040116c fc cld
0040116d 8945b0 mov eax,[ebp-0x1c]
À droite de la ligne qui représente le compteur de programme actuel, l’affichage affiche les valeurs de tous les emplacements de mémoire ou registres accessibles. Si cette ligne contient une instruction de branche, la notation [br=1] ou [br=0] s’affiche. Cette notation indique une branche qui est ou n’est pas prise, respectivement.
Vous pouvez utiliser la commande .asm (Modifier les options de désassemblement) pour modifier la façon dont les instructions désassemblé sont affichées.
Dans la fenêtre Désassemblement de WinDbg, la ligne qui représente le compteur de programme actuel est mise en surbrillance. Les lignes où les points d’arrêt sont définis sont également mises en surbrillance.
Vous pouvez également utiliser les commandes suivantes pour manipuler le code d’assembly :
La commande # (Rechercher le modèle de désassemblement) recherche un modèle spécifique dans une région de mémoire. Cette commande équivaut à rechercher les quatre colonnes de l’affichage de désassemblement.
La commande (Assembler) peut prendre des instructions d’assembly et les traduire en code machine binaire.
Mode d’assembly et mode source
Le débogueur a deux modes de fonctionnement différents : le mode assembly et le mode source.
Lorsque vous parcourez une application en une seule étape, la taille d’une seule étape est une ligne de code d’assembly ou une ligne de code source, selon le mode.
Plusieurs commandes créent des affichages de données différents en fonction du mode.
Dans WinDbg, la fenêtre Désassemblement se déplace automatiquement au premier plan lorsque vous exécutez ou parcourez une application en mode assembly. En mode source, la fenêtre Source se déplace au premier plan.
Pour définir le mode, vous pouvez effectuer l’une des opérations suivantes :
Utilisez la commande l+, l- (Définir les options source) pour contrôler le mode. La commande l-t active le mode d’assembly.
(WinDbg uniquement) Désactivez la commande Mode source dans le menu Déboguer pour que le débogueur passe en mode assembly. Vous pouvez également sélectionner le bouton Hors mode source dans la barre d’outils.
Dans WinDbg, lorsque vous êtes en mode assembly, ASM apparaît dans la barre de status.
Le menu contextuel de la fenêtre Désassemblement de WinDbg inclut les instructions de mise en surbrillance de la commande de ligne source actuelle . Cette commande met en évidence toutes les instructions qui correspondent à la ligne source actuelle. Souvent, une seule ligne source correspond à plusieurs instructions d’assembly. Si le code a été optimisé, ces instructions d’assembly peuvent ne pas être consécutives. La commande Mettre en surbrillance les instructions de la ligne source actuelle vous permet de rechercher toutes les instructions qui ont été assemblées à partir de la ligne source actuelle.
Fichiers sources du langage Assembly
Si votre application a été écrite en langage d’assembly, le désassemblement produit par le débogueur peut ne pas correspondre exactement à votre code d’origine. En particulier, NO-OPs et commentaires ne seront pas présents.
Si vous souhaitez déboguer votre code en référençant les fichiers .asm d’origine, vous devez utiliser le débogage en mode source. Vous pouvez charger le fichier d’assembly comme un fichier source C ou C++. Pour plus d’informations sur ce type de débogage, consultez Débogage en mode source.