A debugger plays a vital role in any software development system. Nobody can write a bug-free code all at once. During the course of development, bugs are being raised and needs to be solved for further enhancement. A development system is incomplete without a debugger. Considering the open source developers community, GNU Debugger is their best choice. It is also used for commercial software development on UNIX type platforms.

Le débogueur GNU, également connu sous le nom de gdb, nous permet de parcourir le code pendant son exécution ou de comprendre ce qu’un programme essayait de faire au moment où il a planté. GDB nous aide essentiellement à accomplir quatre tâches principales pour repérer les défauts dans le code source.
- Démarrer le programme en spécifiant des arguments qui peuvent affecter le comportement général.
- Arrêter le programme sur des conditions spécifiées.
- Examiner le crash ou l’arrêt du programme.
- Modifier le code et expérimenter avec le code modifié instantanément.
Nous pouvons utiliser gdb pour déboguer des programmes écrits en C et en C++ sans trop d’efforts. À l’heure actuelle, le support pour d’autres langages de programmation comme D, Modula-2, Fortran est partiel.
Commencer avec le débogueur GNU ou GDB
GDB est invoqué en utilisant la commande gdb. En émettant la commande gdb, il affiche des informations sur la plateforme et vous place dans le prompt (gdb) comme indiqué ci-dessous.
[root@fedora20 ~]# gdb
Sortie d’exemple
GNU gdb (GDB) Fedora 7.6.50.20130731-19.fc20 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". Type "show configuration" for configuration details. For bug reporting instructions, please see: <http://www.gnu.org/software/gdb/bugs/>. Find the GDB manual and other documentation resources online at: <http://www.gnu.org/software/gdb/documentation/>. For help, type "help". Type "apropos word" to search for commands related to "word". (gdb)
Tapez help list pour afficher les différentes classes de commandes disponibles dans gdb. Tapez help suivi d’un nom de classe pour obtenir une liste des commandes de cette classe. Tapez help all pour la liste de toutes les commandes. Les abréviations des noms de commandes sont autorisées si elles sont non ambiguës. Par exemple, vous pouvez taper n au lieu de taper next ou c pour continue et ainsi de suite.
Les commandes GDB les plus couramment utilisées
Les commandes gdb couramment utilisées sont répertoriées dans le tableau suivant. Ces commandes doivent être utilisées à partir de l’invite de commande gdb (gdb).
Command
|
Description
|
run
|
Start a program execution
|
quit
|
Quit gdb
|
print expr
|
Print expression where expr may be a variable name too
|
next
|
Go to next line
|
step
|
Step into next line
|
continue
|
Continue from the current line till the end of program or next break point
|
Remarquez la différence entre les deux commandes step et next. La commande next ne pas entre dans une fonction si la prochaine ligne est un appel de fonction. Alors que la commande step peut entrer dans une fonction et voir ce qui se passe là-bas.
A sample session with GDB
Considérez le code source suivant.
// sum.c #include <stdio.h> int sum (int a, int b) { int c; c = a + b; return c; } int main() { int x, y, z; printf("\nEnter the first number: "); scanf("%d", &x); printf("Enter the second number: "); scanf("%d", &y); z = sum (x, y); printf("The sum is %d\n\n", z); return 0; }
Pour déboguer le fichier de sortie, nous devons le compiler avec l’option -g à gcc comme suit.
$ gcc -g sum.c -o sum
Le fichier de sortie sum peut être attaché à gdb de l’une des 2 manières suivantes:
1. En spécifiant le fichier de sortie comme un argument pour gdb.
$ gdb sum
2. Exécution du fichier de sortie dans gdb en utilisant la commande file.
$ gdb (gdb) file sum
La commande list liste les lignes du fichier de code source et déplace le pointeur. Donc d’abord list affichera les 10 premières lignes et ensuite list affiche les 10 suivantes, et ainsi de suite.
(gdb) list 1 #include <stdio.h> 2 3 int sum (int a, int b) { 4 int c; 5 c = a + b; 6 return c; 7 } 8 9 int main() { 10 int x, y, z;
Pour commencer l’exécution, émettez la commande run . Maintenant, le programme est exécuté normalement. Mais nous avons oublié de mettre des points d’arrêt dans le code source pour le débogage, non? Ces points d’arrêt peuvent être spécifiés pour des fonctions ou à des lignes spécifiques.
(gdb) b main
Note: J’ai utilisé une abréviation b pour break.
Après avoir défini un point d’arrêt à la fonction principale, relancer le programme arrêtera à la ligne 11. La même chose peut être réalisée si le numéro de ligne est connu à l’avance.
(gdb) b sum.c:11
Maintenant passer en revue les lignes de code en utilisant la commande suivant ou n. Il est important de noter que la commande suivant ne va pas à l’intérieur du code de la fonction à moins qu’un point d’arrêt ne soit défini sur la fonction. Essayons la commande imprimer maintenant. Définissez un point d’arrêt sur la fonction somme comme ci-dessous.
(gdb) b sum Breakpoint 1 at 0x4005aa: file sum.c, line 5. (gdb) r Starting program: /root/sum Enter the first number: 2 Enter the second number: 3 Breakpoint 1, sum (a=2, b=3) at sum.c:5 5 c = a + b; (gdb) p a $1 = 2 (gdb) p b $2 = 3 (gdb) c Continuing. The sum is 5 [Inferior 1 (process 3444) exited normally]
Si le programme en cours d’exécution nécessite des paramètres en ligne de commande, fournissez-les avec la commande exécuter comme ci-dessous.
(gdb) run . . .
Les fichiers de bibliothèque partagée associés au programme en cours d’exécution peuvent être listés comme ci-dessous.
(gdb) info share From To Syms Read Shared Object Library 0x00000035a6000b10 0x00000035a6019c70 Yes /lib64/ld-linux-x86-64.so.2 0x00000035a641f560 0x00000035a6560bb4 Yes /lib64/libc.so.6
Modification des Variables
GDB est également capable de modifier des variables tout au long de l’exécution du programme. Essayons cela. Comme mentionné ci-dessus, définissez un point d’arrêt à la ligne 16 et exécutez le programme.
(gdb) r Starting program: /root/sum Enter the first number: 1 Enter the second number: 2 Breakpoint 1, main ( ) at sum.c:16 16 printf("The sum is %d\n\n", z); (gdb) set z=4 (gdb) c Continuing. The sum is 4
Maintenant a = 1, b = 2 et le résultat devrait être z = 3. Mais ici, nous avons changé le résultat final en z = 4 dans la fonction principale. De cette façon, le débogage peut être simplifié en utilisant gdb.
Activer/Désactiver les Points d’Arrêt
Pour obtenir la liste de tous les points d’arrêt, tapez info points d’arrêt.
(gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep y 0x00000000004005c2 in main at sum.c:11
Ici, il n’y a qu’un seul point d’arrêt et il est À. Pour activer ou désactiver les points d’arrêt, spécifiez le numéro du point d’arrêt avec la commande désactiver. Pour les activer ultérieurement, utilisez la commande activer.
(gdb) disable 1 (gdb) info breakpoints Num Type Disp Enb Address What 1 breakpoint keep n 0x00000000004005c2 in main at sum.c:11
Vous pouvez également supprimer les points d’arrêt avec la commande supprimer.
Débogage des processus en cours d’exécution
De nombreux processus s’exécutent en arrière-plan dans un système GNU/Linux. Pour déboguer un processus en cours d’exécution, nous devons d’abord trouver l’identifiant de ce processus particulier. pidof la commande vous donne l’identifiant du processus.
$ pidof <process_name>
Maintenant nous devons attacher cet identifiant à gdb. Il y a 2 façons.
1. En spécifiant l’identifiant du processus avec gdb.
$ gdb -p <pid>
2. En utilisant la commande attacher depuis gdb.
(gdb) attach <pid>
C’est tout pour le moment. Ce ne sont que les bases de gdb pour bien commencer le débogage du code source et c’est bien plus que ce qui a été expliqué ci-dessus. Par exemple, nous pouvons déboguer en utilisant les informations de la pile, les variables d’environnement et bien plus encore. Essayez de jouer avec tous ces éléments…
Source:
https://www.tecmint.com/debug-source-code-in-linux-using-gdb/