Blog

#AstuceDeCode 14 : introduction à gdb

Astuce de code
Share Button

GDB est un débogueur en ligne de commande, qui fait fuir pas mal de gens justement pour cette raison. Et pourtant il n’est pas franchement compliqué à utiliser, et a en plus le mérite d’être très léger. Pour preuve je l’utilise régulièrement pour déboguer des programmes en C. Dans la suite on voit comment l’utiliser.

D’autre part GDB vous permet d’éviter de mettre des printf partout dans votre code.


 

Débloque les + belles offres tech en 10 mins

 

Première étape : la compilation

La première étape consiste à compiler votre programme avec les symboles de débogage. En fait une telle compilation est requise quelque soit le langage, essayez donc avec Java de déboguer un programme qui a été compilé sans ces options, vous verrez.

Donc si vous avez quelques fichiers C, il vous suffit d’utiliser le commutateur -g sur votre gcc comme suit :


gcc -g *.c

Maintenant si vous utilisez un outil comme CMake pour faire votre compilation, voici ce qu’il faut utiliser :


cmake -DCMAKE_BUILD_TYPE=Debug ...

A noter également que si vous voulez également déboguer les librairies appelées par votre programme vous devez compiler celles-ci avec les symboles de débogage.

Lancer gdb

Lancer gdb est on ne peut plus simple puisqu’il suffit de taper :


gdb

Ensuite vous allez vouloir charger votre exécutable. Ceci se fait avec la commande suivante :


file <chemin_de_votre_executable>

A noter qu’il faudra faire ça à chaque fois que vous recompilerez votre exécutable.

Enfin, pour lancer votre exécutable, tapez :


run <parametres_de_votre_executable>

Pour ce dernier point il convient de bien se rappeler que le nom de l’exécutable ne doit pas apparaître dans la commande run. Ainsi si vous lancez habituellement votre programme avec la commande suivante :


./foo -bar -bar2

Au niveau de gdb la commande run à taper sera :


run -bar -bar2

Analyse des core dump et autres segfaults

L’analyse des core dump et autres segfaults est très simple avec gdb. Pour ce faire quand votre crash arrive, il suffit de taper la commande suivante :


backtrace

En procédant ainsi vous aurez toute la pile d’appels, et pourrez commencer à travailler. :-)

Gestion des points d’arrêt

Comme tout débogueur, gdb permet d’insérer et supprimer des points d’arrêt. Pour ajouter un point d’arrêt, la syntaxe est la suivante :


break <filename>:<line_number>

Exemple :


break main.c:42

Cette commande vous retournera un numéro de point d’arrêt qu’on peut utiliser par la suite.

Le raccourci pour la commande de break est b. Pour ceux qui sont intéressés on peut aller beaucoup plus loin avec les points d’arrêt, la documentation est ici.

Maintenant pour supprimer un point d’arrêt il faut utiliser la commande clear comme suit :


clear <filename>:<line_number>

Exemple :


clear main.c:42

Pour ceux qui ont noté les numéros de points d’arrêt vous pouvez également utiliser la commande delete, comme suit :


delete <break_point_number>

Enfin, pour ceux qui veulent aller plus loin vous pouvez regarder ici.

Commandes utiles une fois dans un point d’arrêt

Une fois dans un point d’arrêt, la première commande à connaître est n ou next. Elle permet de passer à la ligne suivante. Si vous lui donner en paramètre un nombre elle ira à la ligne n + xx est le nombre donné en paramètre à next.

Pour aller au point d’arrêt suivant, vous pouvez utiliser la commande c ou continue.

Une autre chose indispensable à avoir pour un débogueur est la possibilité d’afficher le contenu d’une variable. Pour cela ça se fait de la manière suivante :


p <variable_name>

A noter que si vous déboguez un pointeur la syntaxe sera la même que pour le C, à savoir :


p *pointer

Vous pouvez aller plus loin en regardant ici. Il y a un autre point à connaître, dans le cas où l’affichage de votre variable serait tronqué. Ce souci se résoud avec la commande suivante :


set print elements 0

Enfin, si vous avez besoin de redéfinir la valeur d’une variable, vous devez utiliser la commande set comme suit :


set var <variable_name>=<value>

Exemple :


set var foo=42

Vous pouvez aller plus loin avec cette commande en regardant ici.

Topic plus avancé : débogage d’un programme avec fork

La fonction fork permet de créer des processus enfants. Elle est notamment très utilisée pour les démons. En effet les exécutables de ces derniers ont besoin de rendre la main immédiatement, sinon ils risqueraient d’êtres tués par un Ctrl-C.

Bref pour déboguer un tel programme il suffit de taper la commande suivante, avant lancement du programme :


set follow-fork-mode child

Pour aller plus loin

GDB est un outil très puissant, utilisés par de nombreux IDE dont Code::Blocks sous Linux. Bref même si vous l’utilisez par l’intermédiaire d’un IDE il peut être utile d’en connaître certaines commandes, ne serait-ce que pour des besoins avancés.

Vous trouverez des documentations très complètes ici et . Sachez que malgré l’aspect rebutant il est en fait assez agréable à utiliser une fois qu’on a pris le coup de main, bref la même chose que pour vim.

Débloque les + belles offres tech en 10 mins

Cet article vous a plu ? Vous aimerez sûrement aussi :

 

JulienJulien
Moi c’est Julien, ingénieur en informatique avec quelques années d’expérience. Je suis tombé dans la marmite étant petit, mon père avait acheté un Apple – avant même ma naissance (oui ça date !). Et maintenant je me passionne essentiellement pour tout ce qui est du monde Java et du système, les OS open source en particulier.

Au quotidien, je suis devops, bref je fais du dév, je discute avec les opérationnels, et je fais du conseil auprès des clients.

Son Twitter - Son LinkedIn

Share Button

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>