Utilisation de GNU Debugger (GDB)

Votre programme crash et vous ne savez pas pourquoi ? Le mieux à faire pour comprendre et d'utiliser un outil de debugage plutôt que se retaper tout votre code... Un outil assez simple est le GNU Debugger, ou GDB. Ce programme va vous permettre de générer un BackTrace de votre programme (c'est à dire la liste de tous vos appels de fonctions etc...) qui vous permettra de savoir où ça plante, si ce n'est pourquoi ça plante.
Pour utiliser le debugger, assurez-vous d'abord que le package gdb est bien installé sur votre machine. Ensuite vous devez vous assurer que votre programme exporte des informations utiles pour gdb. En général on peut obtenir ces informations en ajoutant -ggdb aux instructions de compilations de son programme. Cela permet à gcc de savoir qu'il faut qu'il laisse des informations de debuggage supplémentaires dans le programme pour permettre à gdb de s'y retrouver plus facilement.
Pour créer le BackTrace vous devrez d'abord lancer voter programme sous GDB :
$~ gdb mon_prog
Puis, dans le terminal gdb, tapez :
(gdb) handle SIGPIPE nostop (gdb) run
L'instruction "run" lancera le programme. Il ne vous reste plus qu'à reproduire le crash si il ne se fait pas de lui-même... Si Votre programme reste bloqué (genre boucle infini, attente d'une entrée, blocage etc...) tapez Ctrl-C pour revenir sous gdb. Puis tapez :
(gdb) bt full
ou bien :
(gdb) backtrace full
Vous verrez alors le BackTrace de votre programme s'afficher dans le terminal. Il se peut que des "??" apparaissent à la place des noms de fonction, c'est simplement que gdb n'a pas pu le lire... Sachez que pour obtenir les meilleures traces possibles, il faut que les librairies que vous utilisez aient été installé avec leur symboles de débugage.
Pour quitter GDB, tapez :
(gdb) quit
Il est aussi possible de se déplacer dans la pile d'appel des fonctions de votre programme. Pour cela, utilisez les commandes up et down. Il est également possible de consulter le contenu des variables en utilisation la commande print (p en abbrégé). L'exemple suivant permet d'afficher le contenue de la structure pointée par struct_p :
(gdb) print *(mon_pointeur_de_struct *)struct_p
Il ne vous reste plus qu'à repérer les erreurs relevées dans le BackTrace et aller les corriger dans votre code...
Pour plus d'informations, vous pouvez aussi consultez les wikis des distributions Ubuntu, Debian et Gentoo.