GNU/Linux >> Tutoriels Linux >  >> Linux

Comment déboguer le programme C en utilisant gdb en 6 étapes simples

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.

Linux
  1. Comment déboguer un script bash ?

  2. Comment activer la journalisation de débogage NFS à l'aide de rpcdebug

  3. Comment obtenir l'adresse MAC de votre machine à l'aide d'un programme C ?

  4. Comment déboguer le noyau Linux avec GDB et QEMU ?

  5. Comment définir une variable d'environnement dans GDB à l'aide de la commande shell ?

Comment thématiser GNOME Shell 3.16 (en cinq étapes simples)

Comment suivre l'exécution d'un programme à l'aide de la commande Linux Strace

Comment compiler C, C++ et Java à l'aide de Terminal sous Linux

Comment utiliser GDB pour déboguer des programmes dans Ubuntu 20.04

Comment créer un texte de courbe dans GIMP en 5 étapes simples [Tutoriel pour débutants GIMP]

Astuces Ubuntu :comment gérer des projets simples à l'aide de notes Tomboy