Comment utiliser le débogueur de Visual Studio /8/2015 INF145 1 Créé par Julien Galarneau Allaire, révisé par Eric Thé S.E.G.
Table des matières Créer un nouveau projet Les outils de VS : Les points d’arrêts Le mode pas-à-pas Les variables locales Les espions Les erreurs communes : Boucles infinies Lecture et écriture dans une case inaccessible d’un tableau La pile des appels de VS 1/8/2015 INF145 2
Créer un nouveau projet 1/8/2015 INF Cliquez sur : Fichier/Nouveau/Projet.. -Cliquez sur « Projet vide » -Entrez le nom du projet (judicieusement) -Choisissez le répertoire du projet intelligemment (clé USB, espace privé)
1/8/2015 INF Clique-droit sur « Fichiers sources » dans l’Explorateur de solutions -Choisir « Ajouter » -Choisir « Nouvel élément… » Créer un nouveau projet
1/8/2015 INF Cliquez sur fichier C++ (on programme en C mais l’extension est.cpp) -Nommez votre fichier (ex : « lab1_3 » pour le Labo 1, exercice 3 ) -Assurez vous que le fichier est créé dans le répertoire du projet -Cliquez sur « Ajouter » Créer un nouveau projet
Les points d’arrêts Les points d’arrêts où les « breakpoints » servent à pauser les programmes lors de l’exécution du programme. On clique à gauche de la ligne où on veut arrêter le programme (dans la marge grise de la fenêtre d’édition) Utile pour voir la trace à un certain moment de l’exécution (voir la section des variables locales). Après l’usage d’un point d’arrêt, on utilise le mode pas-à-pas Suite à un point d’arrêt, on peut utiliser la pile des appels 1/8/2015 INF145 6
Point d’arrêt et mode pas à pas 1/8/2015 INF145 7 Pas à pas
Mode pas-à-pas 1/8/2015 INF145 8 : Quand on clique sur le pas à pas détaillé : celle-ci nous amène dans la fonction (À ne PAS faire sur des fonctions que vous n’avez pas programmés. Ex : printf( ); ) : Le pas à pas principal va vous faire sauter par dessus des fonctions. Parfois utile, mais pas toujours (À faire par dessus les printf( ); ). : Le pas à pas sortant va vous faire sortir de la fonction courante (C’est rare qu’on l’utilise. On peut ainsi sortir d’un printf( ); ).
Les variables locales (tracer) Les « Variables locales » servent à suivre la trace des variables. Elles sont très utiles quand la trace du programme est complexe et qu’on ne peut pas le faire mentalement ou en utilisant une multitude d’affichages dans la console. La fenêtre de débogage « Variables locales » va automatiquement afficher les valeurs des variables directement concernées par la ligne de code en mode arrêt. 1/8/2015 INF145 9
Les variables locales (tracer) 1/8/2015 INF145 10
Les variables locales (tracer) 1/8/2015 INF Quand je mets mon « breakpoint », je vois que les 3 variables de ma fonction ne sont pas initialisées.
Les variables locales (tracer) 1/8/2015 INF Après un pas à pas détaillé, je vois que la variable « i » vient d’être initialisée avec la valeur 0 (affiché en rouge).
Les espions Les fenêtres « Espion.. » servent (entre autres) à voir: -La valeur des cases d’un tableau alloué dynamiquement -La valeur d’une condition ou d’une fonction -Valeurs des variables qui ne sont pas concernées par la ligne de code en mode arrêt (mais doivent être du même bloc) 1/8/2015 INF145 13
Les espions 1/8/2015 INF Voici comment on ouvre une (ou plusieurs) fenêtres « Espion.. ».
Les espions 1/8/2015 INF Pour tout ce qui n’apparait pas à l’aide des variables locales, on utilise les fenêtres-espions. On peut alors voir si le tableau « dessin->tab[] » est initialisé avec des 0. La case [-1][-3] ne peut être lue, car l’espace mémoire n’est pas alloué à cette adresse (débordement de tableau).
Boucles infinies Le programme est-il dans une boucle infinie? - Le programme fonctionne, mais n’arrête jamais à moins qu’on l’arrête manuellement (bouton ). 1/8/2015 INF On utilise les espions pour voir le résultat de chacune de nos conditions de la boucle. Pour sortir de la boucle, il faut qu’une de ces conditions soit FALSE. Ici nous testons un appel de fonction.
Lecture/écriture dans une case inaccessible d’un tableau Ceci se produit lorsque vous tentez d’écrire dans un espace mémoire d’un tableau qui n’est pas alloué. La source de ce problème vient souvent des boucles, vous devez donc vérifier les conditions de vos boucles « for » et « while ». Soyez vigilant avec vos conditions d’itérations. Les indices d’un tableau de 8 cases vont de [0] à [7] : 1/8/2015 INF145 17
Lecture/écriture dans une case inaccessible d’un tableau 1/8/2015 INF Le programme essaie d’écrire dans la case [8] qui n’est pas dans le tableau BON MAUVAIS et grave! MAUVAIS BON Le programme oublie d’écrire dans la case [7] qui est la dernière du tableau
La pile des appels La fenêtre « Pile des appels » ou le « call stack » sert à voir le cheminement du programme jusqu’à ce qu’un bogue se produise. On recule dans la pile en suivant les appels précédents jusqu’à ce qu’on trouve l’endroit où l’erreur survient. Si vous appelez plusieurs fois une même fonction et vous ne savez pas à quel appel elle est rendue, le « call stack » peut vous aider. 1/8/2015 INF145 19
La pile des appels 1/8/2015 INF Voici comment activer la fenêtre de la « Pile des appels ».
La pile des appels 1/8/2015 INF Avec le mode pas-à-pas, le programme c’est rendu là où la flèche se trouve. En suivant les variables locales, j’ai réalisé que ma trace ne suivait pas la logique que je voulais. Je vais donc utiliser la pile des appels pour revenir sur mes pas et voir où l’erreur survient.
1/8/2015 INF Ici, l’exécution du code est à la ligne 142 du programme. On double clique sur les lignes en dessous d’où le programme est rendu dans l’appel de la pile. Le débogueur me ramène là où la fonction a été appelée ligne 93. (Ça va être utile quand nous aurons plusieurs fichiers sources). La pile des appels