GDB

GDB (GNU DeBugger) est un outil très pratique permettant de faciliter le débuggage de code. Le principe est le suivant: gdb prend en paramètre un programme et l'exécutera jusqu'à ce que le programme se termine. Si le programme se termine de manière abrupte, gdb garde en mémoire l'endroit où s'est terminé l'exécution ainsi que les données. Cela permet donc de connaitre l'ensemble des appels de fonctions (et paramètres) qui ont menés à cet endroit problématique.

Commandes

Téléchargez le code source error.c, puis compilez-le.
ATTENTION: L'OPTION '-g' EST OBLIGATOIRE POUR UTILISER GDB Une fois compilé, si vous l'exécutez, vous devriez obtenir un message d'erreur. Nous allons inspecter cette erreur à l'aide de gdb. Différentes commandes existes au sein de gdb.
run
lance le programme. Si différents paramètres sont fournis à cette commandes, ceux-ci seront passés au programme que l'on veut lancer
kill
tue un programme en cours de déboggage
where
quand un programme est arrêté, affiche la pile de fonctions qui ont mené au point d'arret, ainsi que des informations sur leurs paramètres respectifs
print {expression}
affiche la valeur de l'expression qui sera évaluée en fonction du contexte courant.

Contextes

Lorsque gdb s'arrête, cet arrêt à lieu au sein d'une fonction. gdb à alors accès à l'ensemble des variables qui seraient disponibles dans cette fonction (paramètres, variables locales et variables globales). Cependant, le problème vient parfois d'autres appels de fonctions et il est dès lors nécessaire de changer de contexte. Pour ce faire, il existe différentes commandes:
up {nombre}
Remonte de {nombre} fonctions dans la pile d'appel
down {nombre}
Descend de {nombre} fonctions dans la pile d'appel

Définir un point d'arrêt

Parfois, il est très utile de pouvoir définir un point d'arrêt pour savoir ce qu'il se passe avant qu'une erreur intervienne. Un point d'arret s'appelle "breakpoint". Pour en définir un, il suffit d'utiliser la commande suivante:
br {fichier}:{ligne}
Définit un point d'arrêt au fichier {fichier}, ligne {ligne}
Il est également possible de définir plus finement des points d'arrêts en spécifiant le nom d'une fonction ou en fonction d'une condition (quand la zone mémoire x aura la valeur y), consultez la documentation pour trouver ces possibilités.

Aide

Il existe de nombreux site web donnant d'avantages d'information sur gdb. De plus, en utilisant gdb, il est toujours possible de demander de l'aide générale ((gdb) help) ou de l'aide sur une commande bien précise ((gdb) help {commande}).

Valgrind

Valgrind est un outil permettant de monitorer la mémoire d'un processus. Différentes erreurs peuvent être trouvées: utiliser une valeur non-initialisée, dépassement de tableau, fuite mémoire, ...
Lorsque le programme est compilé (à nouveau avec l'option -g pour plus de lisibilité) il faut le lancer. Ici, nous utiliserons différentes options:
--db-attach=yes
permet d'attacher un débugger quand une erreur est diagnostiquée
--leak-check=full
Recherche un maximum de fuites mémoires
--track-origins=yes
Pour chaque bout de mémoire alloué, retenir la pile d'exécution qui a mené à l'allocation de la mémoire
Une fois lancé, valgrind regardera l'utilisation mémoire du programme et lorsque qu'un problème survient, il vous demandera si vous voulez utiliser un débugger à l'endroit posant problème.

Exercice

En utilisant gdb et valgrind, essayer de corriger le programme error.c.