Télécharger la présentation
La présentation est en train de télécharger. S'il vous plaît, attendez
Publié parEmmanuelle Michon Modifié depuis plus de 10 années
1
jc/md/lp-01/06Debug1 Debugging Élémentaire
2
jc/md/lp-01/06Debug2 Objectif du chapitre Premier contact avec les outils de mise au point Génération en vue de debug Usage des points darrêt, pas à pas Visualisations diverses –Code –Variables –Mémoire –Pile –…
3
jc/md/lp-01/06Debug3 Objectifs (1) La mise au point de programmes (debugging) nécessite lemploi de techniques particulières Platform Builder offre –Un ensemble doutils usuels Exécution du programme en pas à pas Pose ou suppression de points darrêt Visualisation des variables, de la mémoire, des registres Suivi des enchaînements de fonctions, etc. –Un outil « Kernel Tracker » pour visualiser la chronologie des exécutions
4
jc/md/lp-01/06Debug4 Objectifs (2) Pour utiliser les possibilités de mise au point, la cible doit être construite dans le mode particulier « Debug » par opposition au mode « Release » qui correspond à une version dexploitation Étude du debugger en deux phases –Visualisations diverses, Breakpoint, etc. –Kernel Tracker ultérieurement
5
jc/md/lp-01/06Debug5 Point de départ Générer une plate-forme en mode Debug Créer et générer une application avec un main et des fonctions très simples Exploration (partielle) de loutil de debug –Messages –Visualisation du code source –Breakpoint –Visualisation des variables, de la mémoire –Visualisation du code assembleur –Visualisation de la pile
6
jc/md/lp-01/06Debug6 Génération de la plate-forme « Debug » Utiliser lassistant, comme précédemment, avec éventuellement un nouveau nom Au pas 6 de lassistant, modifier les options Cocher dans les options de la liste « Debug » : « Enable Image Larger than 32 MB » Sortir de lassistant par « Finish » Sélectionner la configuration active « Debug » Générer la plate-forme (Build Platform)
7
jc/md/lp-01/06Debug7 Modification des options
8
jc/md/lp-01/06Debug8 Sélection de la taille des images
9
jc/md/lp-01/06Debug9 Sélection configuration : Debug
10
jc/md/lp-01/06Debug10 Génération de la plate-forme
11
jc/md/lp-01/06Debug11 Génération de limage
12
jc/md/lp-01/06Debug12 Exécution dune application Sans inclusion dans limage Création du.exe Téléchargement du noyau Éxécution par la commande « Run Program » Avec inclusion dans limage Création du.exe Refaire une image avec choix de loption dinsertion Téléchargement du noyau avec lapplication Exécution à partir de la cible par la méthode Windows
13
jc/md/lp-01/06Debug13 Options de génération Pour voir les options de génération avec ou sans inclusion, nous prenons une application de type WCE Application Noms de nos applications écrits en majuscules pour les distinguer facilement des applications proposées par Windows CE Nom de lapplication : BRKP Nous ajouterons le code par la suite
14
jc/md/lp-01/06Debug14 Choix de loption pour le projet
15
jc/md/lp-01/06Debug15 Inclusion application dans limage
16
jc/md/lp-01/06Debug16 Exclusion application de limage
17
jc/md/lp-01/06Debug17 Application BRKP Faire la somme et le produit de deux nombres entiers positifs avec –Une fonction somme –Une fonction produit –Des variables statiques –Des variables dynamiques –Des passages darguments Introduire des messages de contrôle
18
jc/md/lp-01/06Debug18 Messages daide à la mise au point Édition habituelle de messages de contrôle dans lapplication par des printf ou équivalents En plus, édition de messages par des macros dans la fenêtre de sortie de lémulateur, et non dans le contexte de la cible –RETAILMSG en version Retail –RETAILMSG et DEBUGMSG en version Debug
19
jc/md/lp-01/06Debug19 Macro RETAILMSG RETAILMSG(cond, printf_exp) Impression si la condition est vraie de ce quon mettrait dans un printf Impression faite par une fonction équivalente à printf mais qui écrit dans la fenêtre de sortie de lémulateur et non dans la cible émulée Exemple : RETAILMSG(1,(TEXT("Main: adresse de i= %x\n"),&i)); Équivalent dans la fenêtre de sortie à : printf("Main: adresse de i= %x\n",&i);
20
jc/md/lp-01/06Debug20 Application BRKP (1) #include "stdafx.h" //prototypes des fonctions DWORD dwSomme(DWORD dwA,DWORD dwB); DWORD dwProduit(DWORD dwA,DWORD dwB); DWORD dwValeur; //juste pour avoir une variable statique int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow)
21
jc/md/lp-01/06Debug21 Application BRKP (2) { DWORD i,j; //Visualisation des adresses dans la fenêtre de sortie RETAILMSG(1,(TEXT("Main: adresse de i= %x\n"),&i)); RETAILMSG(1,(TEXT("Main: adresse de j= %x\n"),&j)); RETAILMSG(1,(TEXT("Main: adresse de valeur= %x\n"),&dwValeur)); //Calcul de somme et produit des entiers positifs 5 et 3 i=5; j=3;
22
jc/md/lp-01/06Debug22 Application BRKP (3) RETAILMSG(1,(TEXT("Main: i=%u j=%u\n"),i,j)); dwValeur=dwSomme(i,j); RETAILMSG(1,(TEXT("Main: i+j=%u\n"),dwValeur)); printf(("Main: i=%u j=%u dwValeur =%u \n"),i,j,dwValeur); dwValeur=dwProduit(i,j); RETAILMSG(1,(TEXT("Main: i*j=%u\n"),dwValeur)); printf(("Main: i=%u j=%u dwValeur =%u \n"),i,j,dwValeur); getchar(); return 0; }
23
jc/md/lp-01/06Debug23 Application BRKP (4) DWORD dwSomme(DWORD dwA,DWORD dwB) { //Addition de A et B par une méthode archaïque DWORD dwC=0; while(dwA--) dwC++; while(dwB--) dwC++; return dwC; }
24
jc/md/lp-01/06Debug24 Application BRKP (5) DWORD dwProduit(DWORD dwA,DWORD dwB) { // Multiplication de A et B par une méthode simpliste DWORD dwC; for(dwC=0;dwB;dwB--) dwC=dwSomme(dwA,dwC); return dwC; }
25
jc/md/lp-01/06Debug25 Option de génération en mode debug
26
jc/md/lp-01/06Debug26 Configure Remote Connection
27
jc/md/lp-01/06Debug27 Configure Emulator Download Service
28
jc/md/lp-01/06Debug28 Insertion et suppression de breakpoints Les breakpoints peuvent être placés ou enlevés avant ou après le lancement de lapplication Avant lancement du noyau –Positionner le curseur souris sur une ligne du programme –Faire un click droit pour ouvrir le menu –Faire Insert/Remove Breakpoint Après lancement du noyau, il faut que le debugger soit arrêté
29
jc/md/lp-01/06Debug29 Fenêtres en debug Dans la fenêtre principale de Platform Builder la fenêtre Workspace est différente et donne accès à des commandes après chargement de la cible Dautres fenêtres sont spéciales pour le debug et accessibles par le menu View, sous-menu Debug Windows, ou par une barre de contrôle Fenêtres libres ou ancrées en fenêtre principale Mémorisation des caractéristiques des fenêtres Fermeture par licône Windows
30
jc/md/lp-01/06Debug30 Exemple : fenêtre des variables
31
jc/md/lp-01/06Debug31 Écran avec la fenêtre des variables Fenêtre nouvelle disponible pour des commandes lignes (shell) Variables Fenêtre principale
32
jc/md/lp-01/06Debug32 Groupe de fenêtres flottantes
33
jc/md/lp-01/06Debug33 Exemple de fenêtres ancrées Registres du CPU Fenêtre principale Contexte Watch Fenêtre nouvelle disponible pour des commandes lignes (shell) Fenêtre de sortie
34
jc/md/lp-01/06Debug34 Barre de commande « Debug » Ouverte comme toutes les barres de commandes par un click droit dans une barre existante et coche de la case Une série dicônes correspond à des commutateurs pour louverture ou la fermeture des fenêtres de debug Une autre série correspond à lexécution du code : Go simple (jusquà un point darrêt), pas à pas, avec saut dune fonction, etc. Les bulles daide sont explicites
35
jc/md/lp-01/06Debug35 Essai de BRKP Génération de la plate-forme Génération de lapplication Génération de limage Téléchargement du noyau avec ou sans lapplication suivant les choix Exécution du programme Fermeture de la cible Déconnexion
36
jc/md/lp-01/06Debug36 Après téléchargement de la cible
37
jc/md/lp-01/06Debug37 Cible vierge
38
jc/md/lp-01/06Debug38 Exécution par la commande shell Commande du shell s BRKP s pour start
39
jc/md/lp-01/06Debug39 Fenêtres du debugger après exécution Messages
40
jc/md/lp-01/06Debug40 Cible après exécution Attente du caractère Entrée Taper Entrée pour finir BRKP
41
jc/md/lp-01/06Debug41 Pose dun breakpoint Pose avant ou pendant la session de debug Placer le curseur sur une ligne de code Ouvrir le menu contextuel par un click droit Insérer un point darrêt, marqué par un rond rouge en marge (en fait cest un commutateur qui insère ou supprime un point darrêt) Relancer le programme sil ne lest pas Au début, on doit observer une flèche jaune superposée au premier point darrêt
42
jc/md/lp-01/06Debug42 Arrêt du debugger Icône darrêt
43
jc/md/lp-01/06Debug43 Après pose des points darrêt
44
jc/md/lp-01/06Debug44 Arrêt sur point darrêt
45
jc/md/lp-01/06Debug45 Exécution du programme en debug Chaque commande Go (menu ou icône) provoque lexécution du programme jusquà : –Rencontre dun point darrêt –Rencontre dune erreur dexécution –Fin normale du programme La commande « Run Program » charge le programme dont on donne le nom puis déclenche une commande Go Exécution contrôlée en pas à pas par diverses commandes davance
46
jc/md/lp-01/06Debug46 Avance dun pas Avance par –Le menu « Debug » –Les touches de fonction du clavier –Les icônes (dessins et bulles explicites) Plusieurs types davance –Un pas dans la fonction (Step Into) –Un pas en sautant la fonction (Step Over) –Un pas en ressortant de la fonction (Step Out) –Jusquau curseur (Run to Cursor)
47
jc/md/lp-01/06Debug47 Avance dun pas simple Avance un pas
48
jc/md/lp-01/06Debug48 Après avance dun pas simple Fenêtre des variables i à jour, j ? Messages
49
jc/md/lp-01/06Debug49 Avance dun pas avec saut Avance avec saut de la fonction pour ne pas exécuter toute la fonction en pas à pas Avance avec saut j à jour
50
jc/md/lp-01/06Debug50 Avance avec sortie de la fonction Ce type de pas (Step Out) permet de cesser lexamen dune fonction en pas à pas en retournant directement chez lappelant Utile quand on est entré par inadvertance dans une fonction déjà au point quon ne désire pas dérouler en pas à pas Utile en particulier quand on est entré dans une fonction fournie par Platform Builder pour laquelle on ne dispose pas du code source
51
jc/md/lp-01/06Debug51 Avance avec sortie Le pas simple va nous faire entrer dans la fonction printf pour laquelle nous navons pas le code source Un pas simple
52
jc/md/lp-01/06Debug52 Recherche du code source Puisque le code source nest pas sur la machine…
53
jc/md/lp-01/06Debug53 Fenêtre en mode désassemblage Le pas à pas va nous conduire dans une nouvelle fonction après une demande de localisation du code source puisque ici la fonction est aussi inconnue.
54
jc/md/lp-01/06Debug54 Entrée dans la fonction imbriquée On va sortir de cette fonction et retrouver la demande de localisation pour le printf
55
jc/md/lp-01/06Debug55 Recherche du code source Puisque le code source nest toujours pas sur la machine…
56
jc/md/lp-01/06Debug56 Sortie de la fonction Le contexte est redevenu printf
57
jc/md/lp-01/06Debug57 Suppression du désassemblage
58
jc/md/lp-01/06Debug58 Quelques pas jusquà la fonction
59
jc/md/lp-01/06Debug59 Entrée dans la fonction produit Le contexte est notre fonction dwProduit. Pourquoi 5 ? On continue en assembleur.
60
jc/md/lp-01/06Debug60 Code assembleur de dwProduit Malgré la position de la flèche jaune sur le code source, linitialisation du for nest pas commencée.
61
jc/md/lp-01/06Debug61 Debug en assembleur Après un pas, dwC est bien initialisée, on repasse en mode normal
62
jc/md/lp-01/06Debug62 Après quelques pas, dans dwSomme Le contexte est maintenant celui de la fonction dwSomme. On peut aussi voir les autres contextes.
63
jc/md/lp-01/06Debug63 Cible à ce stade
64
jc/md/lp-01/06Debug64 Visualisation des appels de fonctions Louverture de la fenêtre « Call Stack » visualise la pile des appels de fonctions.
65
jc/md/lp-01/06Debug65 Fin de lexécution Terminer le programme avec les commandes de déroulement « Go » ou davance par pas Quand on arrive sur le getchar() taper le caractère « Entrée » dans la cible. Mais à la suite de frappes au cours des manipulations, il se peut quun caractère soit déjà présent dans le tampon dentrée et alimente le getchar() ; dans ce cas on ne verra pas lattente du caractère ; il faut poursuivre les avances par pas.
66
jc/md/lp-01/06Debug66 Fin de lexécution (2) Après exécution de la dernière instruction, le système doit encore exécuter des fonctions « épilogues » pour terminer complètement le programme. Il faut donc poursuivre lavance par le debugger, normalement par des pas « Step Out » jusquà obtenir le déchargement de lapplication. On pourra alors reprendre correctement une nouvelle session de debug pour examiner dautres possibilités.
67
jc/md/lp-01/06Debug67 Cible à la fin de lexécution
68
jc/md/lp-01/06Debug68 Fin complète de lapplication Messages indiquant le déchargement de lapplication, du module console utilisé indirectement par notre code et des symboles associés. La fenêtre cible est revenue à son état initial. Plus rien à exécuter Commandes inactives
69
jc/md/lp-01/06Debug69 Nouvelle session Nouvelle commande start Commuter en debug source
70
jc/md/lp-01/06Debug70 Fenêtre « Variables » Barre « Toolbar » affichée avec le menu contextuel –Nom de la fonction –Arguments & symbolise une adresse, comme en C Clicker un + présent devant un nom offre des informations liées, adresse, valeur dune variable, champs dune structure, etc. Trois onglets –« Auto » pour les variables au fil de leur utilisation –« Locals » pour les variables locales –« This » qui correspond au pointeur « this »du C++
71
jc/md/lp-01/06Debug71 Fenêtre « Variables » (2) Affichage en hexadécimal ou en décimal Modification des valeurs des variables en sélectionnant la partie valeur à modifier et en saisissant la nouvelle valeur Modification visualisée par un affichage rouge répercutée dans les autres fenêtres Variables gérées automatiquement –Introduction de variable impossible –Suppression de variable impossible
72
jc/md/lp-01/06Debug72 Onglet « Auto » initial lpCmdLine est un pointeur sur la ligne de commande ; sa valeur est indiquée ainsi que la chaîne pointée, ici vide Premier caractère de la chaîne UNICODE, donc ici fin de chaîne
73
jc/md/lp-01/06Debug73 Onglet « Auto » après avance Variables gérées automatiquement Modification possible après sélection de ce champ
74
jc/md/lp-01/06Debug74 Onglet « Locals » Quand une variable est modifiée par une instruction, elle apparaît en rouge
75
jc/md/lp-01/06Debug75 Onglet « Locals » (2) Pas de confusion entre les variables de même nom Fenêtre du contexte de la fonction produit superposée par copier coller Fenêtre du contexte de la fonction somme après de nombreux pas
76
jc/md/lp-01/06Debug76 Fenêtres « Watch » Fenêtres dans lesquelles on choisit les variables Introduction de la variable par son nom Suppression par sélection et « Delete » Valeur modifiable et reportée dans les autres fenêtres Modifications visualisées en rouge Possibilité dintroduire une expression du style langage C directement ou par le truchement dune autre fenêtre : « QuickWatch » Gestion des variables suivant durée de vie et portée Quatre onglets équivalents
77
jc/md/lp-01/06Debug77 Exemple « Watch1 » (1) Un click droit ouvre un menu contextuel dont une entrée indique le type de la variable.
78
jc/md/lp-01/06Debug78 Exemple « Watch1 » (2) Capture juste après la deuxième sortie de la fonction dwSomme Au pas suivant dwC prendra la valeur 10
79
jc/md/lp-01/06Debug79 Exemple « Watch1 » (3)
80
jc/md/lp-01/06Debug80 Exemple « QuickWatch »
81
jc/md/lp-01/06Debug81 Visualisation de la mémoire Deux fenêtres équivalentes « Memory 1 » et « Memory 2 » Affichage à partir de ladresse fournie –numériquement en hexadécimal ou en décimal –par le nom dune variable, dune fonction Choix de laffichage par le menu contextuel en octet, demi-mot, mot Modification directe de la mémoire, avec mise à jour dans les autres fenêtres et réciproquement
82
jc/md/lp-01/06Debug82 Exemple de visualisation mémoire Adresse de i Valeur de i Adresse de dwSomme Début du code de dwSomme
83
jc/md/lp-01/06Debug83 Représentation « Little Endian » Adresse de i Valeur de i en 32 bits Modification arbitraire de i i : poids faibles dans ladresse la plus basse i : poids forts dans ladresse la plus haute
84
jc/md/lp-01/06Debug84 Fenêtre « Registers » Visualisation des registres du processeur Menu contextuel pour des options –Registres flottants –Registres multimédia Modification possible en écrivant directement dans le registre Utilisables par leur nom symbolique pour fournir –Une adresse pour un pointeur –Une valeur pour un registre de données
85
jc/md/lp-01/06Debug85 Visualisation des registres Nom symbolique EAX Nom symbolique EIP
86
jc/md/lp-01/06Debug86 « Debug » en mode assembleur Visualiser le code assembleur par le menu « View », licône, le menu contextuel ou encore la touche de fonction Toutes les commandes rencontrées dans la mise au point en langage source sappliquent, en particulier les commandes davance par pas Les fenêtres de visualisation des registres et de la pile sont particulièrement utiles
87
jc/md/lp-01/06Debug87 Exemple : arrêt sur le breakpoint Avancer par pas À suivre Activer le « Breakpoint »
88
jc/md/lp-01/06Debug88 Après de nombreux pas Dans dwProduit avant le second appel de dwSomme
89
jc/md/lp-01/06Debug89 Registres X86 ESP:Stack Pointer Register –Pointeur de pile EBP:Stack-FrameBase Pointer –Pour accéder a des données passées par la pile EIP: Instruction Pointer
90
jc/md/lp-01/06Debug90 Exemple : dwValeur=dwSomme(i,j)
91
jc/md/lp-01/06Debug91 Visualisation de la pile (1) Pile après appel de dwSomme Pile avant appel de dwSomme
92
jc/md/lp-01/06Debug92 Visualisation de la pile (2) Pile après sauvegarde de EBP puis ECX
93
jc/md/lp-01/06Debug93 Visualisation de la pile (3) On peut assez facilement suivre lévolution de la pile. Ici, à partir de ladresse donnée par le pointeur de pile : –ECX (A), EBP (1202FC00) sauvegardés par dwSomme –La partie segment de ladresse de retour placée par linstruction call dans dwProduit : call dwSomme –Les arguments dwA (5) et dwC (A) placés par dwProduit pour dwSomme –La variable locale dwC de la fonction dwProduit –Puis, même chose pour lappel de dwProduit par main
94
jc/md/lp-01/06Debug94 Complément Ce ne sont que les principales fonctionnalités du debugger de base ; il reste beaucoup de possibilités à explorer. Nous explorerons ultérieurement toute une autre série de fonctionnalités dans le « Kernel Tracker » Un dernier groupe de commandes dont certaines sont très évoluées, est fourni par des commandes lignes à saisir dans la fenêtre « Shell » Windows CE accessible par licône CE
95
jc/md/lp-01/06Debug95 Conclusion Ce chapitre a permis de prendre en main les techniques les plus classiques de mise au point
Présentations similaires
© 2024 SlidePlayer.fr Inc.
All rights reserved.