Info : Exemple d'utilisation de GDB

L’objectif de cette annexe est d’illustrer sur un cas très simple comment utiliser gdb (ou lldb) pour déboguer son programme.

Utilisation de gdb

  1. Une fois le programme écrit, il faut obligatoirement le compiler avec l’option -g (pour inclure les informations de debug).
  2. Lancer le débogueur avec en argument notre programme (par défaut a.out).
  3. Lancer l’exécution du programme via run (ou r).
  4. Identifier les bugs ou erreurs
  5. Quitter le programme via quit (ou q)

Comment identifier les erreurs

De manière générale,le programme s’exécute jusqu’à atteindre:

  • sa terminaison
  • une erreur
  • un point d’arrêt
  • une interruption (CTRL+C)

Points d’arrêts

  • Définition: break num_ligne ou break nom_fonction (b) (plusieurs points d’arrêts peuvent être définis)
  • Suppression: delete num_point_arret
  • Voir la liste des points d’arrêt: info break
  • Suppression des points d’arrêts: delete (d)
  • Désactivation: disable x ou disable x-y
  • Activation: enable x ou enable x-y, possibilité d’ajouter once pour une seule activation
  • Arrêt si condition: break x if condition
  • Surveillance: watch variable ou watch expr
  • Reprise:
    • continue (c) reprise jusqu’au prochain point d’arrêt / erreur / terminaison
    • next (n) effectue l’instruction / fonction suivante et s’interrompt
    • step (s) effectue l’instruction suivante et s’interrompt
    • finish: permet d’aller directement à la fin de la fonction
    • Possibilité d’utiliser step x ou next x pour avancer de x lignes d’une fois.
    • Possibilité d’utiliser continue x pour ignorer le point d’arrêt courant x fois (utile pour les boucles).
    • la touche entrée permet de répéter la dernière commande

Affichage des variables

  • Pour afficher une variable locale / globale: print expr (p expr)
  • les opérateurs classiques fonctionnent ([], & , *)
  • Il est possible de formater l’affichage: p/x p/d p/u p/o p/c p/f p/a pour avoir un résultat en décimal, octal, hexadécimal…

Pile d’exécution

  • Inspection de la pile bt ou bt full
  • Déplacement dans la pile up / down

Pour aller plus loin

Vous pouvez consulter le lien suivant https://www.rocq.inria.fr/secret/Anne.Canteaut/COURS_C/gdb.html qui contient d’autres commandes.

Mise en application

Il s’agit d’un programme qui contient plusieurs erreurs (variable non initialisée, passage d’une valeur au lieu du pointeur). Nous allons illustrer comment utiliser gdb pour trouver ces erreurs.

Programme exemple

#include <stdio.h>

int somme (int n)
{
    int result = 0;
    for (unsigned int i = 0; i < n; i++)
    {
        result += i;
    }
    return result;
}

void get_from_user (int n)
{
    do
    {
        printf ("Entrer un entier (>= 0)\n");
        scanf ("%d", &n);
    } while (n < 0);
}

int main ()
{
    int value;
    get_from_user (value);
    printf ("Somme = %d\n", somme (value));
    return 0;
}

Utilisation de gdb