Semaine 9: débogage, tests, projet

Vous trouverez ici le matériel pédagogique pour la Semaine 9, dont l’objectif premier est de lancer votre travail sur le projet. Jusqu’ici, vous avez écrit des programmes de quelques lignes; avec le projet, vous allez progressivement aborder des programmes de une à plusieurs centaines de lignes. Aussi, pour vous y préparer, nous verrons en amphi des éléments de méthodologie et des outils de débogage.

Consignes

Vous n’aurez pas de trop des quelques semaines à venir pour le projet; lancez vous à fond dès maintenant. Pour être fier de vos réalisations à venir. Pour de belles soutenances la semaine du 6 décembre. Et aussi parce que le projet est le moment où vous allez consolider et donner du sens à tout ce que nous avons vu depuis le début du semestre. Incidemment, c’est la meilleure préparation à l’examen du 13 décembre, dans moins d’un mois.

Les TPs seront des moments privilégiés des semaines à venir où vous pourrez bénéficier de toute l’aide d’un enseignant. Pour en tirer le meilleur parti, il est essentiel de l’avoir bien préparé, notamment en ayant travaillé sur le projet bien en amont; pour cette semaine:

  • Choix d’un binôme

  • Téléchargement et consultation du sujet (voir instructions sur la page web ci-dessus)

  • Début du travail en autonomie (quelques heures!)

  • Préparation des questions à l’attention de votre enseignant: quels sont les points à clarifier? les problèmes bloquants?

Cours

TD

Vous n’aurez pas de TD cette semaine; c’est autant de temps de libéré pour vous consacrer au projet.

Il y aura un dernier TD la semaine prochaine!

TP: débogage, projet

Préalable:

Le cœur du TP est le projet. Ne passez pas plus de 20 minutes sur les exercices de débogage.

Exercice: Analyse post-mortem d’erreur à l’exécution

Le but de cet exercice est de prendre en main l’utilisation du débogueur, afin de pouvoir l’utiliser seul par la suite, lorsque vous rencontrerez des problèmes avec vos programmes du projet.

  1. Compiler le programme calcul.cpp, l’exécuter et observer l’affichage.

  2. L’exécution s’est terminée avec une erreur. Ouvrir le fichier calcul.cpp; constater que l’instruction du programme ligne \(21\) n’a pas été exécutée. On sait donc que l’erreur s’est produite avant cette ligne, mais on ne sait pas où exactement elle s’est produite, ni dans quelles circonstances. Nous allons mettre maintenant en application deux techniques vues en cours pour analyser l’état du programme au moment de l’erreur.

  3. Noter qu’un fichier nommé core a été produit. Selon la configuration de la machine, ce fichier aura éventuellement un nom de la forme core.24234.

  4. Recompiler le programme en ajoutant l’option -g:

    g++ -g calcul.cpp -o calcul
    
  5. Relancer le programme.

  6. Lancer le déboggueur:

    gdb calcul
    
  7. Analyser le fichier core avec la commande ci-dessous (en remplaçant si besoin le 2e core par le nom complet du nouveau fichier core produit):

    core core
    

    À quelle ligne a eu lieu l’erreur?

  8. Afficher la pile d’appel avec la commande suivante:

    where full
    
  9. Afficher le code avec:

    list
    
  10. En déduire la cause de l’erreur. Inutile de corriger le programme (on vous demande juste d’avoir trouvé l’erreur grâce au débogueur).

  11. Quitter le débogueur avec la commande

```
quit
```

Exercice: Analyse post-mortem d’erreur à l’exécution (variante ♣)

Il est possible de compiler un programme de sorte que les erreurs d’accès à la mémoire soient mieux détectées et que la pile d’appel soit affichée directement en cas de plantage (comme avec Python) sans avoir à utiliser le déboggueur. Le programme consomme cependant un peu plus de ressources.

Détails: https://en.wikipedia.org/wiki/AddressSanitizer

  1. Recompiler le programme calcul.cpp en ajoutant l’option -fsanitize=address:

```
info-111 g++ -fsanitize=address calcul.cpp -o calcul
```
  1. Exécuter le programme, et lire le message d’erreur détaillé.

Exercice: Exécution pas-à-pas avec le débogueur ♣

Nous allons maintenant analyser le même programme en l’exécutant pas à pas.

Rappel: l'exécution pas-à-pas avec gdb n'est actuellement pas disponible sur JupyterHub. Vous ne pouvez donc faire cet exercice que en salle de TP ou si vous avez installé les logiciels chez vous.
  1. Retrouver le mode d’emploi de gdb dans les notes du cours. Une fois le débogueur lancé, consultez les questions suivantes du TP pour savoir quelles commandes du débogueur utiliser. Il est recommandé d’avoir sous les yeux à la fois l’énoncé de TP (pour savoir quelles commandes on vous demande d’utiliser) et le mode d’emploi (qui indique à quoi correspondent ces commandes).

  2. Utiliser les commandes start, puis step pour exécuter successivement quelques instructions jusqu’à rentrer dans la boucle for.

  3. Essayer la commande print i, puis avancer de quelques instructions. Essayer la commande display i, puis avancer de quelques instructions.

  4. Continuer l’exécution pas à pas jusqu’à rentrer dans la fonction max. Utiliser la commande where full pour visualiser la pile d’appel.

  5. Utiliser la commande continue pour continuer l’exécution jusqu’à la fin.

  6. L’exécution se termine avec une erreur. Cette fois la ligne au moment de l’erreur est affichée. Utiliser les commandes vues plus haut pour consulter les valeurs des variables et retrouver ce qui a déclenché l’erreur.

Travail sur le projet