Dans cet article, expliquons comment déboguer un programme c à l'aide du débogueur gdb en 6 étapes simples.
Écrire un exemple de programme C avec des erreurs à des fins de débogage
Pour apprendre le débogage du programme C, créons le programme C suivant qui calcule et imprime la factorielle d'un nombre. Cependant, ce programme C contient des erreurs pour notre objectif de débogage.
$ vim factorial.c # include <stdio.h> int main() { int i, num, j; printf ("Enter the number: "); scanf ("%d", &num ); for (i=1; i<num; i++) j=j*i; printf("The factorial of %d is %d\n",num,j); }
$ cc factorial.c $ ./a.out Enter the number: 3 The factorial of 3 is 12548672
Laissez-nous le déboguer tout en passant en revue les commandes les plus utiles de gdb.
Étape 1. Compiler le programme C avec l'option de débogage -g
Compilez votre programme C avec l'option -g. Cela permet au compilateur de collecter les informations de débogage.
$ cc -g factorial.c
Remarque :La commande ci-dessus crée un fichier.out qui sera utilisé pour le débogage, comme indiqué ci-dessous.
Étape 2. Lancer gdb
Lancez le débogueur C (gdb) comme indiqué ci-dessous.
$ gdb a.out
Étape 3. Configurer un point d'arrêt dans le programme C
Syntax: break line_number
Autres formats :
- break [file_name] :line_number
- break [file_name] :func_name
Place un point d'arrêt dans le programme C, là où vous suspectez des erreurs. Lors de l'exécution du programme, le débogueur s'arrête au point d'arrêt et vous invite à déboguer.
Alors avant de démarrer le programme, plaçons le point d'arrêt suivant dans notre programme.
break 10 Breakpoint 1 at 0x804846f: file factorial.c, line 10.
Étape 4. Exécutez le programme C dans le débogueur gdb
run [args]
Vous pouvez lancer l'exécution du programme à l'aide de la commande run du débogueur gdb. Vous pouvez également donner des arguments de ligne de commande au programme via run args. L'exemple de programme que nous avons utilisé ici ne nécessite aucun argument de ligne de commande, donnons donc run et démarrons l'exécution du programme.
run Starting program: /home/sathiyamoorthy/Debugging/c/a.out
Une fois que vous avez exécuté le programme C, il s'exécute jusqu'au premier point d'arrêt et vous donne l'invite de débogage.
Breakpoint 1, main () at factorial.c:10 10 j=j*i;
Vous pouvez utiliser diverses commandes gdb pour déboguer le programme C, comme expliqué dans les sections ci-dessous.
Étape 5. Impression des valeurs des variables dans le débogueur gdb
Syntax: print {variable} Examples: print i print j print num
(gdb) p i $1 = 1 (gdb) p j $2 = 3042592 (gdb) p num $3 = 3 (gdb)
Comme vous le voyez ci-dessus, dans la factorielle.c, nous n'avons pas initialisé la variable j. Ainsi, il obtient une valeur poubelle résultant en un grand nombre en tant que valeurs factorielles.
Corrigez ce problème en initialisant la variable j avec 1, compilez le programme C et exécutez-le à nouveau.
Même après ce correctif, il semble y avoir un problème dans le programme factorial.c, car il donne toujours une valeur factorielle erronée.
Placez donc le point d'arrêt sur la 10ème ligne et continuez comme expliqué dans la section suivante.
Étape 6. Continuez, en enjambant et en entrant - commandes gdb
Il existe trois types d'opérations gdb que vous pouvez choisir lorsque le programme s'arrête à un point d'arrêt. Ils continuent jusqu'au prochain point d'arrêt, intervenant ou enjambant les lignes de programme suivantes.
- c ou continuer :le débogueur continuera de s'exécuter jusqu'au prochain point d'arrêt.
- n ou next :le débogueur exécutera la ligne suivante en tant qu'instruction unique.
- s ou step :Identique à la suivante, mais ne traite pas la fonction comme une seule instruction, mais entre dans la fonction et l'exécute ligne par ligne.
En continuant ou en parcourant, vous auriez pu constater que le problème est dû au fait que nous n'avons pas utilisé le <=dans la vérification de la condition "for loop". Donc, changer cela de <à <=résoudra le problème.
raccourcis de la commande gdb
Utilisez les raccourcis suivants pour la plupart des opérations gdb fréquentes.
- l – liste
- p – imprimer
- c – continuer
- s – pas
- ENTER :appuyer sur la touche Entrée exécutera à nouveau la commande précédemment exécutée.
Diverses commandes gdb
- l commande : Utilisez la commande gdb l ou list pour imprimer le code source en mode débogage. Utilisez l line-number pour afficher un numéro de ligne spécifique (ou) l function pour afficher une fonction spécifique.
- bt :revenir en arrière – Imprimez la trace de tous les cadres de pile ou des COUNT cadres les plus internes.
- aide – Afficher l'aide pour un sujet gdb particulier — help TOPICNAME.
- quitter – Quittez le débogueur gdb.