Utilisation du Debugger sur Dev/C++ et sur CodeBlocks

Lorsqu’on essaie de localiser des erreurs (des bugs en Anglais) dans un programme parfois on utilise des printf pour afficher le contenu des variables et ainsi déceler où sont les erreurs mais certaines erreurs sont difficiles à trouver de cette manière; d’où l’utisation d’un debugger.

 

Un debugger permet de mettre des breakpoint (point d’arret) où le programme s’arrêtera à ces breakpoint, d’executer le programme instruction par instruction, de voir le contenu des variables lors de l’execution du programme , … et ainsi de rendre la localisation d’erreurs un peu plus simple.

En debuggant l’exemple du programme C donné à la fin de cette page et en executant pas à pas la function lireFichier() on peut voir que telle que la function est ecrite pourquoi le dernier étudiant sera affiche 2 fois (après avoir lu avec un fread() l’enregistrement du dernier étudiant feof() retourne toujours 0 et le prochain fread() retourne 0 car il n’y a plus rien à lire et c’est uniquement le prochain feof() qui retourne 1; c.a.d il faut faire un fread() lorsqu’om atteint EOF pour que feof() retourne 1).

 

 

Debugger sous Dev/C++

Créer un nouveau projet C en utilisant le code donne en Exemple.

Après cela choisir sur menu "Project-Project Options" - la fenetre "Project Options" apparait

Clicker sur la tab "Compiler" et plus bas sur la tab "Linker"

Selectionner sur l'option "Generate debugging information -g3" comme Yes (voir fig ci-dessous).

 

Selectionner dans le menu "Execute-Compile current file" pour compiler le programme. 

Ensuite en bas a droite clicker sur la tab "Debug" (figure ci-dessous)

 

Appuyer sur les numeros de lignes dans la fenêtre principale pour mettre un breakpoint (point d’arret), celui-ci apparaitra en rouge.

Pour commencer à executer le programme, selectionner dans le menu "Execute-Debug". Le programme s’execute et s’arrêtera au breakpoint lorsque l’execution arrive à l’instruction selectionné comme breakpoint et cette ligne apparait en couleur blue (voir figure ci-dessous).

 

Clicker sur "into Function" pour éxecuter les instructions de la function. Clicker sur "Next Line" pour executer les instructions en séquence. La prochaine instruction à s’executer sera montrée en couleur bleu.

Maintenant on peut mettre en watch les variables dont on veut voir et surveiller les valeurs. Pour cela clicker sur "Add Watch" et entrer le nom de la variable à mettre en watch dans la fenêtre "New variable watch". La variable sera montrée a droite de la fenêtre principale (voir figure ci-dessous où les variables n et etd ont été mise en watch).

 

 

Utilisation du debugger sous CodeBlocks

Créer un nouveau projet C en utilisant le code donné en Exemple (fin de cette page).

Après cela choisir dans le menu "Project-Project build options" et la fenêtre "project build options" aparait. Clicker sur le tab "Compiler setting" et selectionner "Debugging-produce debug symbols [-g]" (figure suivante).

 

Selectionner dans le menu "Build-Build" pour compiler le programme.

Selectionner dans le menu "Debug-Toggle breakpoint" et clicker sur le numéro de ligne de l’instruction où on veut mettre un breakpoint (fig. ci-dessous).

 

Aller au menu "Debug-Start/Continue" pour commencer l’execution du programme. Le programme s’arrêtera au breakpoint. Selectionner "Debug-Step into" pour executer les instructions à l’interieur d’une function, "Debug-Next line" pour executer l’instruction de la prochaine ligne (fig. suivante).

 

Les variables mis en watch sont montrées à droite de la fenêtre principale (fig. suivante).

 

 

Exemple: Creation et Lecture d’un fichier binaire

#include <stdio.h>

#include <stdlib.h>

 

typedef struct

{

  int mat;

  char nom[21];

  char prenom[21];

  int livrEmp[3];

} Etudiant;

 

 

 

int   creerFichier()

{

   FILE *fp;

   Etudiant etd;

   int i, n;

 

    fp = fopen("Etud.dat", "wb");

 

   if (fp == NULL)

   {

        return -1;

   }

 

 

   do

  {

     printf("Donner N > 0\n");

    scanf("%d", &n);

  } while (n <= 0);

 

   for (i=0; i<3; i++)

            etd.livrEmp[i] = 0;

 

   for(i = 1; i<=n; i++)

  {

      printf("Veuillez entrer matricule, nom et prenom de l'etudiant %d ...\n", i);

      scanf("%d %s %s", &etd.mat, etd.nom, etd.prenom); 

      fwrite(&etd, sizeof(etd), 1, fp);

   }

 

   fclose(fp);

   return 0;

}

 

 

 

   int lireFichier()

  {

     FILE *fp;

     Etudiant etd;

     int n;

 

    fp = fopen("Etud.dat", "rb"); 

    if (fp == NULL) 

   {

      return -1; 

   }

 

   while( !feof(fp))

  { 

          n = fread(&etd, sizeof(etd), 1, fp);

         printf("%-5d %-20s %-20s %-3d %-3d %-3d\n", etd.mat, etd.nom, etd.prenom, etd.livrEmp[0], etd.livrEmp[1], etd.livrEmp[2]);

   }

 

   fclose(fp);

   return 0; 

}

 

 

 

int main()

{

 

   if (creerFichier() == -1)

  {

       printf("Erreur: Fichier Etud.dat N'a pas ete cree ...\n");

       return 1;

  }

 

  if (lireFichier() == -1)

  { 

      printf("Erreur: Fichier Etud.dat Ne peut pas etre lue ...\n");

     return 1;

  }

 

  system("pause");

  return 0;

}