Contenu | Rechercher | Menus

Débuggage avec gdb

Description

gdb, acronyme de GNU DeBugger, est un programme qui, comme son nom l'indique, permet de débugger un programme (langages C et C++ principalement, ainsi que d'autres : fortran 77, etc..). Il permet donc de traquer les bugs/erreurs se trouvant dans tout programme.

Cet outil, indispensable à tout programmeur, bien que très performant n'est disponible qu'avec une interface en ligne de commande. Heureusement, il existe des interfaces graphiques qui facilitent le débuggage.

Installation

Installez les paquets build-essential gdb

Si vous développez en utilisant une bibliothèque particulière, vous pouvez éventuellement installer le paquet de débuggage, dont le nom finit par -dbg, en plus du paquet de développement (dont le nom finit par -dev).

Utilisation basique

Compilation du programme pour le débuggage

Pour que gdb puisse débugger un programme, il a besoin des informations de débuggage, qui peuvent être ajoutées en ajoutant l'option -g au compilateur.

Exemple :

gcc -g toto.c -o toto

Lancement de gdb

Un fois le programme compilé, invoquez gdb comme ceci :

gdb toto

Dans l'interface de gdb, vous pouvez lancer le programme avec run et quitter le débogueur avec quit. À tout moment, vous pouvez interrompre le programme avec le raccourci clavier Ctrl+C dans le terminal. La commande where vous permettra alors de voir la pile des appels. Pour reprendre l'exécution du programme, tapez continue.

Si vous souhaitez changer l'exécutable ciblé par gdb, exec monexecutable peut vous être utile.

La commande start lance le programme et s'arrête à la première ligne : la commande "n" permet ensuite de faire du pas-à-pas.

Si le programme a des paramètres d'entrée, il faut les ajouter à la suite de run (ou start).

Résumé des principales commandes

commande effet
run lance le programme (s'arrête au prochain point d'arrêt)
continue relance le programme (s'arrête au prochain point d'arrêt)
~~~ ~~~
break yyy.c:xx place un point d'arrêt à la ligne xx du fichier yyy.c
info breakpoints liste les points d'arrêts
delete efface les points d'arrêts
~~~ ~~~
next exécute une instruction (ne rentre pas dans les fonctions)
step exécute une instruction (rentre potentiellement dans les fonctions)
finish exécute les instructions jusqu'à la sortie de la fonction
until xx exécute les instructions jusqu'à la ligne xx

Utilisation avancée

Placer des points d'arrêt (breakpoints)

Si vous soupçonnez une fonction particulière de faire bugger votre programme, vous pouvez placer un breakpoint (point d'arrêt) avant le lancement de cette fonction. Pour ce faire, utilisez la commande break mafonction (sans les parenthèses).

Si la fonction désirée est située dans une classe ou un namespace (espace de noms) niveau_englobant, elle est accessible depuis niveau_englobant::mafonction.

Pour afficher la liste des points d'arrêt, utilisez info breakpoints. Vous remarquerez que chaque point d'arrêt est identifié par un numéro :

(gdb) info breakpoints
Num Type           Disp Enb Address    What
1   breakpoint     keep y   0x08049850 in thor::GameApp::catchEvents()
                                       at src/gameapp.cpp:104

Ici, il a pour identifiant 1. S'il ne vous intéresse plus, vous pouvez le supprimer avec la commande delete 1.

Plus généralement, on peut placer un point d'arrêt à la ligne xx en écrivant break xx

Pour aller au prochain point d'arrêt, écrire continue.

Afficher la valeur d'une variable

Il est possible d'afficher la valeur d'une variable une fois que le programme a été interrompu, grâce à la commande print mavariable. La même remarque concernant les classes et les espaces de nom s'applique ici.

Interfaces graphiques

Il existe de multiples interfaces graphiques pour gdb qui facilitent grandement le débuggage en affichant le code source, créant des schémas représentant les variables, etc. En voici quelques-unes :

  • Nemiver: interface de gdb s'intégrant bien à Gnome
  • Kdbg: interface de gdb s'intégrant bien à KDE
  • ddd: interface graphique très complète pour de nombreux debuggers dont gdb
  • xxgdb: interface de gdb pour X
  • cgdb: interface de type ncurses
  • gdb-mode pour emacs

Aussi, quelques environnements de développement incluent une interface graphique pour gdb ; c'est le cas d'Anjuta, d'Eclipse ou encore de KDevelop.

Concurrents

Enfin signalons le concurrent idb (d'intel, non libre) qui a un mode "gdb" (même syntaxe) et qui affiche correctement les tableaux, ce qui n'est pas le cas de gdb pour le fortran. Il s'installe en même temps que le compilateur ifort.

Pas besoin de compiler avec ifort pour déboguer avec idb.

Liens



Le contenu de ce wiki est sous licence : CC BY-SA v3.0