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 5 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 12 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éboguage, projet#

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

Exercice : analyse d’erreur à l’exécution#

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ébogueur. Le programme consomme cependant un peu plus de ressources. En savoir plus.

  1. Compilez le programme calcul.cpp, exécutez le et observez l’affichage.

  2. L’exécution s’est terminée avec une erreur. Ouvrez le fichier calcul.cpp; constatez 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. Dans cet exercice et le suivant, nous allons maintenant mettre en application deux techniques vues en cours pour analyser l’état du programme au moment de l’erreur.

  3. Recompilez le programme calcul.cpp en ajoutant l’option -fsanitize=address :

    g++ -g -fsanitize=address calcul.cpp -o calcul
    
  4. Exécutez le programme, et lisez le message d’erreur détaillé. Où a eu lieu l’erreur? Inutile de corriger le programme (on vous demande juste d’avoir trouvé où elle a eu lieu).

Dans ce TP, nous vous donnons les commandes de compilation directement avec g++ pour bien montrer le rôle de chacune des options. Vous pouvez aussi utiliser info-111 g++ qui ajoute plusieurs options, dont l’option -g (revoir les explications de la Semaine7). Il sera recommandé de le faire pour le travail sur le projet et les TPs suivants.

Exercice : analyse post-mortem d’erreur à l’exécution au débogueur#

Rappel: la configuration système des salles de TP ne permet pas d’y utiliser l’analyse post-mortem proposée ci-dessous. Cet exercice est donc à réaliser depuis chez vous, en utilisant le service JupyterHub@Paris-Saclay.

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. Comme dans l’exercice précédent, compilez le programme calcul.cpp, exécutez le et observez l’affichage.

  2. Notez qu’un fichier nommé core a été produit. Selon la configuration du système, ce fichier aura éventuellement un nom de la forme core.24234, ou ne sera pas créé.

  3. Recompilez le programme en ajoutant l’option -g :

    g++ -g calcul.cpp -o calcul
    
  4. Relancez le programme.

  5. Lancez le débogueur :

    gdb --tui --silent calcul
    
  6. 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?

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

    where full
    
  8. Affichez le code avec :

    list
    
  9. Déduisez-en la cause de l’erreur. Inutile de corriger le programme (on vous demande juste d’avoir trouvé l’erreur grâce au débogueur).

  10. Quittez le débogueur avec la commande

```
quit
```

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. Retrouvez 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. Utilisez les commandes start, puis step pour exécuter successivement quelques instructions jusqu’à rentrer dans la boucle for.

  3. Essayez la commande print i, puis avancez de quelques instructions. Essayez la commande display i, puis avancez de quelques instructions.

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

  5. Utilisez 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. Utilisez les commandes vues plus haut pour consulter les valeurs des variables et retrouver ce qui a déclenché l’erreur.

Travail sur le projet#