La présentation est en train de télécharger. S'il vous plaît, attendez

La présentation est en train de télécharger. S'il vous plaît, attendez

Jc/md/lp-01/06Debug1 Debugging Élémentaire. jc/md/lp-01/06Debug2 Objectif du chapitre Premier contact avec les outils de mise au point Génération en vue.

Présentations similaires


Présentation au sujet: "Jc/md/lp-01/06Debug1 Debugging Élémentaire. jc/md/lp-01/06Debug2 Objectif du chapitre Premier contact avec les outils de mise au point Génération en vue."— Transcription de la présentation:

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


Télécharger ppt "Jc/md/lp-01/06Debug1 Debugging Élémentaire. jc/md/lp-01/06Debug2 Objectif du chapitre Premier contact avec les outils de mise au point Génération en vue."

Présentations similaires


Annonces Google