420231--Laboratoire sur le dévermineur

Note: Vous trouverez ici des sources utiles pour déverminer, et auxquelles nous ferons référence dans le cadre de ce laboratoire.

Le dévermineur

Savoir préalable

Le travail...

On dévermine un programme qui s'exécute mais dont l'exécution demande un examen plus approfondi (souvent parce que son résultat diffère de celui que nous avions prévu).

C'est pourquoi le succès de la compilation et de l'édition des liens est une condition préalable à l'utilisation du dévermineur...

Le laboratoire #3 portera sur l'utilisation d'un outil fort pratique en programmation, soit le dévermineur ("debugger"). Votre objectif est de vous familiariser avec cet outil.

Un dévermineur est un outil permettant de tracer l'exécution d'un programme et de vérifier en cours de route le contenu et la structure des objets (incluant des variables) qui y sont manipulés.

Le dévermineur intégré dans Visual C++ est très complet. Ce laboratoire vous donnera un aperçu des possibilités qu'il vous offre, et vous permettra de développer une certaine aisance à l'égard de son utilisation.

Obtenir les outils de déverminage

Afin de faire apparaître les outils de déverminage, cliquez sur un espace inutilisé de la barre d'outils avec le bouton de droite, et sélectionnez l'affichage du menu "Debug". VC vous présentera un menu listant différentes boîtes à outils pouvant être mises à votre disposition. Si les boîtes "Build MiniBar" ou "Build" ne sont pas visibles, faites en sorte de les faire apparaître (les boîtes à outils auprès desquelles une coche est indiquée sont celles qui sont affichées, et les coches apparaissent ou disparaissent lorsqu'on les sélectionne).

Points d'arrêt

Idée

Points d'arrêt

Le déverminage permet de tracer pas à pas le flot de l'exécution d'un programme.

Toutefois, on ne veut pas nécessairement tracer la totalité d'un programme; les points d'arrêt nous permettent d'exécuter le tout jusqu'à une instruction de notre choix, puis de procéder à une trace plus rigoureuse à partir de cet endroit.

Lorsqu'on sait à l'avance à partir de quelle ligne dans notre code il vaudrait mieux s'arrêter et poser un regard plus attentif, alors c'est une bonne idée d'y insérer un point d'arrêt (en anglais: "break point").

Le point d'arrêt est utilisé pour indiquer un endroit dans votre code ou vous voulez faire arrêter le flot d'exécution du programme.

Le dévermineur exécutera "normalement" un programme dans lequel se trouve au moins un point d'arrêt, mais interrompra l'exécution lorsqu'il atteindra un de ces points. Ceci vous permettra d'utiliser les fonctionnalités du dévermineur pour procéder à une investigation plus à fond du comportement de votre programme.

Un point d'arrêt peut être placé dans le code avant ou pendant l'exécution. Bien entendu, pour profiter d'un point d'arrêt, il faut que celui-ci soit placé là où l'on veut que l'exécution s'interrompe mais avant que l'instruction visée ne soit exécutée.

Insérer un point d'arrêt

Pour placer un point d'arrêt, on doit d'abord choisir la ligne où on désire voir l'exécution du programme s'interrompre, et y positionner le curseur.

On peut utiliser l'icône de la boîte à outils "Build MiniBar" pour insérer ou retirer un point d'arrêt à la ligne où le curseur se trouve.

On peut aussi cliquer à cet endroit avec le bouton de droite, ce qui produira le menu qu'on trouve à la page suivante. La commande "Insert/Remove Breakpoint" de ce menu permet d'insérer un point d'arrêt (ou de l'enlever, s'il y en avait déjà un à cet endroit).

Note propre aux fichiers offerts pour vous pratiquer:

Vous constaterez sans doute que C++ génère des appels de fonction qui vous sont presque transparents, par exemple lorsque l'instance (ou l'objet) suivant est déclaré


CCompteDeBanque compte(12345,"Joe Blow");

En traçant cette ligne bien particulière, vous serez entre autres amenés à traverser un constructeur de la classe string (à cause du paramètre "Joe Blow"), ce qui peut vous sembler apeurant au premier coup d'oeil.

Ne vous en faites pas: utilisez le bouton de la boîte à outils "Debug", et poursuivez votre travail. Vous serez amenés à comprendre ce code plus loin dans votre cheminement... une chose à la fois.

Questions pièges

Sachant qu'il est possible d'activer, de supprimer, d'activer ou de désactiver un point d'arrêt, répondez aux questions suivantes (vous trouverez les réponses en expérimentant):

  • comment désactive-t-on un point d'arrêt?
  • quelle est la différence entre désactiver et retirer un point d'arrêt?
  • le symbole d'un point d'arrêt actif est-il le même que celui d'un point d'arrêt inactif?
  • Vous pourriez trouver intéressant d'essayer la touche F9 du clavier...

    Utilisation du dévermineur

    Si vous disposez d'un programme compilé et dont l'exécution des liens a fonctionné, vous pouvez le démarrer en mode dévermineur. Pour ce faire, vous pouvez:

  • utiliser le menu Build ==> Start Debug ==> Go;
  • utiliser la touche F5;
  • utiliser le bouton de la boîte à outils "Build Minibar".
  • Question piège

    Que se passe-t-il si l'on utilise le bouton pour exécuter le programme alors que le déverminage est déjà en cours?

    Flot d'exécution lors du déverminage

    Une fois le dévermineur démarré, celui-ci s'arrêtera au premier point d'arrêt qu'il rencontrera. Une flèche jaune vous indiquera la ligne précise avant l'exécution de laquelle le flot de l'exécution a été interrompu.

    Note:

    À cette étape, si vous ne voyez pas la boîte à outils de déverminage, faites-là apparaître. Elle vous permettra de contrôler plus aisément le flot de l'exécution.

    Exercice

    Utilisez le dévermineur pour visualiser le flot d'exécution dans la fonction "Forcer_Bit()" de votre TP1. Essayez chacun des boutons du tableau suivant. Expliquez votre interprétation de l'utilité précise de chacun des fenêtres. Faites valider vos réponses par le/ la prof!

    Watch:


    Variables:


    Call Stack:


    Disassembly:


    Note:

    dans les fenêtres "Watch" ou "Variables", remarquez que lorsque vous passez d'une instruction à l'autre et qu'une variable change de contenu, elle prend la couleur rouge dans la fenêtre.

    Question piège

    Que se passe-t-il lorsqu'on fait exécuter une instruction cin pas à pas? Pourquoi?

    Inspection des variables

    On peut inspecter le contenu des variables en utilisant les fenêtres "Watch" et "Variables".

    Fenêtre Variables Fenêtre Watch

    La fenêtre "Variables" offre trois (3) onglets:

  • l'onglet "Auto" présente le contenu des variables pour lesquelles le dévermineur présume que vous aurez un intérêt particulier;
  • l'onglet "Locals" présente le contenu de toutes les variables locales à la fonction en cours de déverminage;
  • l'onglet "This" a une utilité propre aux classes, et qui ne sera pas couverte dans ce cours. Ce qui ne vous empêche pas d'expérimenter si le coeur vous en dit.
  • La fenêtre "Watch" offre plusieurs onglets. Chacun permet de garder un oeil permanent sur des variables de notre choix.

    Ayant plusieurs onglets, un programmeur en cours de déverminage peut organiser les variables l'intéressant en groupes ayant un sens les uns par rapport aux autres, sans se perdre dans une surdose d'information.

  • Pour rajouter une variable dans le "Watch", sélectionnez-la dans le code et glissez-la dans la fenêtre "Watch".
  • Pour supprimer une variable du "Watch", sélectionnez-la et appuyez sur <Suppr>.
  • Vous pouvez faire afficher le contenu des variables sous forme hexadécimale en cliquant du bouton de droite sur la fenêtre désirée et en choisissant "Hexadecimal Display".

    Vous pouvez de plus modifier le contenu de la variable en double cliquant sur la valeur et en tapant la nouvelle valeur voulue.

    Inspection d'objets complexes

    Si vous inspectez une classe ou un objet complexe, un "+" apparaîtra à son côté. À l'image de l'explorateur de Windows, il est possible de cliquer sur ce symbole pour aller plus en profondeur et inspecter les membres de l'objet en question.

    Inspection à même le code

    Le dévermineur est aussi capable d'inspecter des variables à même le code (dans la mesure où vous êtes en cours de déverminage).

    En effet, si vous positionnez votre curseur au dessus d'une variable (comme dans l'image plus bas), vous verrez apparaître un phylactère présentant sa valeur selon l'exécution en cours:

    Exercices

    Prenez les fichiers du/ de la prof. Il y a une erreur... Trouvez-la à l'aide du dévermineur.

    Quelles sont les manipulations qui vous permettront de tracer à l'intérieur du constructeur de l'objet compte?