Aller au contenu

Débogage avancé/Travail pratique/Pile d'appels

Leçons de niveau 17
Une page de Wikiversité, la communauté pédagogique libre.
Début de la boite de navigation du travail pratique
Pile d'appels
Image logo représentative de la faculté
T.P. no 1
Leçon : Débogage avancé

TP de niveau 17.

Suivant :Débordement de pile
En raison de limitations techniques, la typographie souhaitable du titre, « Travail pratique : Pile d'appels
Débogage avancé/Travail pratique/Pile d'appels
 », n'a pu être restituée correctement ci-dessus.


Souvent, un bug est détecté à l'exécution d'une fonction A qui a été appelée par la fonction B qui a provoqué le bug. Il est donc important de pouvoir remonter dans la pile d'appel pour observer l'état de la fonction B.

Ce TP concerne la compréhension de la pile d'appels des fonctions dans un programme impératif. Il permet aussi de réviser quelques bases sur les débogueurs (afficher le code dans un terminal, lancer le programme, mettre un point d'arrêt, se déplacer dans la pile d'appel, terminer).

N'hésiter pas à regarder la solution en faisant les manipulations si vous souhaitez plutôt un mini-tutoriel GDB en mode terminal.

Le code à déboguer

[modifier | modifier le wikicode]

Créer un fichier bug_assert.c contenant le code suivant.

#include <assert.h>
#include <stdbool.h> // inutile pour C23
#include <stdlib.h>

int main() {
  assert(false); // echec ici

  return EXIT_SUCCESS; // la macro vaut 0
}
  1. Compiler et lancer le programme ./bug_assert. Vous devriez voir le message d'erreur dans votre terminal qui donne la ligne et le fichier du programme qui a détecté le prédicat a faux.
  2. Lancer gdb avec le programme en argument dans un terminal. Demandé à gdb d'afficher le code du programme à déboguer. Mettre un point d'arrêt sur la fonction main. Démarrer. Vous devriez être au début du main. Continuer. À l'assertion, afficher la pile d'appel et remonter dans la pile d'appel de fonction jusqu'au code source impliqué assert(false);.