Recherche de site Web

GNU Debugger ou GDB : un puissant outil de débogage de code source pour les programmes Linux


Un débogueur joue un rôle essentiel dans tout système de développement logiciel. Personne ne peut écrire un code sans bug d’un seul coup. Au cours du développement, des bugs sont signalés et doivent être résolus pour une amélioration ultérieure. Un système de développement est incomplet sans débogueur. Compte tenu de la communauté des développeurs open source, GNU Debugger est leur meilleur choix. Il est également utilisé pour le développement de logiciels commerciaux sur des plateformes de type UNIX.

GNU Debugger, également connu sous le nom de gdb, nous permet de parcourir le code pendant son exécution ou ce qu'un programme essayait de faire au moment où il plante. GDB nous aide essentiellement à faire quatre choses principales pour détecter les failles dans le code source.

  1. Démarrez le programme en spécifiant les arguments pouvant affecter le comportement général.
  2. Arrêtez le programme dans des conditions spécifiées.
  3. Examinez le crash ou le moment où le programme a été arrêté.
  4. Changez le code et expérimentez instantanément le code modifié.

Nous pouvons utiliser gdb pour déboguer des programmes écrits en C et C++ sans trop d'effort. Pour l'instant, la prise en charge d'autres langages de programmation comme D, Modula-2, Fortran est partielle.

Premiers pas avec GNU Debugger ou GDB

GDB est invoqué à l'aide de la commande gdb. Lors de l'émission de gdb, il affiche des informations sur la plate-forme et vous amène à l'invite (gdb), comme indiqué ci-dessous. .

[root@fedora20 ~]# gdb
Exemple de sortie
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 connaître les différentes classes de commandes disponibles dans gdb. Tapez help suivi d'un nom de classe pour une liste de commandes de cette classe. Tapez help all pour la liste de toutes les commandes. Les abréviations de noms de commandes sont autorisées si elles sont sans ambiguïté. Par exemple, vous pouvez taper n au lieu de taper suivant ou c pour continuer et ainsi de suite.

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

Démarrer l'exécution d'un programme

quit

Quitter gdb

print expr

Imprimer l'expression où expr peut également être un nom de variable

next

Aller à la ligne suivante

step

Passez à la ligne suivante

continue

Continuer à partir de la ligne actuelle jusqu'à la fin du programme ou le prochain point d'arrêt

Notez la différence entre les deux commandes step et next. La commande next ne va pas dans la fonction si la ligne suivante est un appel de fonction. Alors que la commande step peut entrer dans la fonction interne et voir ce qui s'y passe.

Un exemple de session avec 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; 
}

Afin de déboguer le fichier de sortie, nous devons le compiler avec l'option -g vers gcc comme suit.

gcc -g sum.c -o sum

Le fichier de sortie sum peut être joint à gdb via l'une des deux manières suivantes :

1. En spécifiant le fichier de sortie comme argument de gdb.

gdb sum

2. Exécution du fichier de sortie dans gdb à l'aide de la commande file.

gdb
(gdb) file sum

La commande list répertorie les lignes du fichier de code source et déplace le pointeur. Ainsi, la première liste affichera les 10 premières lignes et la liste suivante affichera 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 démarrer l'exécution, exécutez la commande run . Maintenant, le programme s'exécute normalement. Mais nous avons oublié de mettre des points d'arrêt dans le code source pour le débogage, n'est-ce pas ? Ces points d'arrêt peuvent être spécifiés pour des fonctions ou sur des lignes spécifiées.

(gdb) b main

Remarque : j'ai utilisé une abréviation b pour break.

Après avoir défini le point d'arrêt sur la fonction principale, la réexécution du programme s'arrêtera à la ligne 11. La même chose peut être appliquée si le numéro de ligne est connu auparavant.

(gdb) b sum.c:11

Parcourez maintenant les lignes de code à l'aide de la commande suivant ou n. Il est important de noter que la commande next n'entre pas dans le code de la fonction à moins qu'un point d'arrêt ne soit défini sur la fonction. Essayons maintenant la commande print. Définissez le point d'arrêt sur la somme de la fonction 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 de ligne de commande, fournissez-les avec la commande run as.

(gdb) run   . . .

Les fichiers de bibliothèque partagés associés au programme en cours d'exécution peuvent être répertoriés sous la forme.

(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 ceci. Comme mentionné ci-dessus, définissez le 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 facilité en utilisant gdb.

Activer/Désactiver les points d'arrêt

Pour obtenir la liste de tous les points d'arrêt, saisissez points d'arrêt info.

(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 c’est To. activé désactiver les points d'arrêt spécifier le numéro du point d'arrêt avec la commande disable. Pour activer ensuite, utilisez la commande enable.

(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 delete.

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 tout d’abord trouver l’identifiant de ce processus particulier. La commande pidof vous donne le pid d'un processus.

pidof <process_name>

Nous devons maintenant attacher ce pid à gdb. Il y a 2 façons.

1. En spécifiant pid avec gdb.

gdb -p <pid>

2. Utilisation de la commande attach de gdb.

(gdb) attach <pid>

C'est tout pour le moment. Ce ne sont que des bases de gdb pour bien démarrer dans le débogage du code source et c'est bien plus que les choses expliquées 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 trucs…