Atelier Compilation Et Débogage
Atelier Compilation Et Débogage
Atelier Compilation Et Débogage
1. Objectifs
− Initiation à l'utilisation de quelques outils de développement avec le langage C sous
Linux.
− Développement en C sous Linux à partir d'un terminal (en mode console).
NB: l'utilisation de tout IDE tel que codeblocks est strictement interdite.
2. Pré-requis
Pour réaliser cet atelier, on doit disposer d’une machine virtuelle Linux Ubuntu.
3. Outils de Développement
GCC (GNU Compiler Collection) est une suite de logiciels libres de compilation utilisé dans le
monde Linux dès qu’on veut transcrire du code source en langage machine. Il est le plus
répandu des compilateurs. La suite gère le C et ses dérivés mais aussi le Java ou encore le
Fortran.
GDB (Gnu DeBugger) est un debugger puissant dont l'interface est totalement en ligne de
commande, c'est-à-dire avec une invite en texte. Il est tellement apprécié qu'on le trouve
aussi encapsulé dans des interfaces graphiques comme XXGDB ou DDD. GDB est publié sous
la licence GNU et est gratuit. Il permet la localisation des erreurs en spécifiant des points
d’arrêt. GDB vérifie aussi le bon fonctionnement du programme ligne par ligne en consultant
les états et le contenu des variables.
1
Projet C 2P/3B ESPRIT 2019-2020
4. Préparation de l'Environnement
Démarrer la machine virtuelle Linux Ubuntu.
Vérifier l’existence des outils GCC, Make et GDB dans le système d'exploitation à l’aide des
commandes suivantes:
gcc - - version
make - - version
gdb - - version
Si les outils GCC, Make et GDB ne sont pas installés par défaut, alors taper la commande
suivante:
2
Projet C 2P/3B ESPRIT 2019-2020
Si l'éditeur nano n'est pas installé, alors taper dans un terminal la commande suivante:
#include <stdio.h>
int main() {
int a;
int b;
printf("\nSaisie du Premier Nombre: ");
scanf("%d", &a);
do {
printf("\nsaisie du Second Nombre: ");
scanf("%d", &b);
} while(b == 0);
printf("\n%d + %d= %d", a, b, a + b);
printf("\n%d - %d= %d", a, b, a - b);
printf("\n%d / %d = %f\n", a, b, (float) a / b);
return (0);
3
Projet C 2P/3B ESPRIT 2019-2020
Dans le même terminal, taper la commande qui permet de compiler le fichier main.c:
main.c est le fichier source et programme est le binaire (exécutable) résultant de l'opération
de compilation.
Afin de lancer l'exécution du fichier binaire issu de la compilation du code source main.c,
taper dans le même terminal la commande:
./programme
4
Projet C 2P/3B ESPRIT 2019-2020
Éditer le fichier fonctions.h et copier dedans les prototypes des fonctions implémentés dans
fonctions.c:
#ifndef FONCTIONS_H_
#define FONCTIONS_H_
int sommer(int a, int b);
int soustraire(int a, int b);
float diviser(int a, int b);
#endif
5
Projet C 2P/3B ESPRIT 2019-2020
Les lignes vertes sont ajoutées pour éviter le problème d’inclusion circulaire.
Il ne faut pas oublier d'ajouter #include ''fontions.h'' dans main.c et d'évoquer les fonctions
de ce module.
gcc -c main.c
gcc -c fonctions.c
La dernière phase après la compilation est de lier les fichiers objets en un seul fichier
binaire exécutable (prog) moyennant l'option –o:
./prog
Le fichier makefile est celui dans lequel on met les commandes qui seront exécutées par
l'outil make. Il est constitué des descriptions et des relations entre les fichiers sources et les
fichiers objets ainsi que des relations entre les fichiers objets et l'exécutable (règles). Une
règle est constituée des composantes suivantes:
Cible : dépendances
<tab> commande
6
Projet C 2P/3B ESPRIT 2019-2020
touch makefile
nano makefile
prog:fonctions.o main.o
gcc fonctions.o main.o -o prog
main.o:main.c
gcc -c main.c
fonctions.o:fonctions.c
gcc -c fonctions.c
Il faut ajouter une tabulation et non pas un espace avant chaque commande gcc du fichier
makefile
make
./prog
8. Exécution et Débogage
Éditer à nouveau le fichier makefile contenant les règles de compilation:
nano makefile
prog:fonctions.o main.o
gcc fonctions.o main.o -o prog -g
main.o:main.c
gcc -c main.c -g
fonctions.o:fonctions.c
gcc -c fonctions.c –g
7
Projet C 2P/3B ESPRIT 2019-2020
Rééditer le fichier main.c et remplacer le code précédent par le code qui présente un bug lors
de l’exécution.
#include <stdio.h>
#include "fonctions.h"
int main() {
int a;
int b;
printf("\nSaisie du Premier Nombre: ");
scanf("%d", a);
do {
printf("\nsaisie du Second Nombre: ");
scanf("%d", b);
} while(b==0);
printf("\n%d + %d = %d", a, b, sommer(a, b));
printf("\n%d + %d = %d", a, b, soustraire(a, b));
printf("\n%d / %d = %f\n", a, b, diviser(a, b));
return (0);
}
./prog
8
Projet C 2P/3B ESPRIT 2019-2020
La seule façon de trouver les erreurs en cours d'exécution est de débogueur le binaire prog
grâce au débuggeur GDB:
gdb prog
9
Projet C 2P/3B ESPRIT 2019-2020
Une fois l'interface du GDB lancée, taper dans le prompt la commande run ou taper r.
Des informations sur l’erreur s'affichent mais elles ne sont pas précises. Dans cet
exemple, on peut dire que l'utilisation de la fonction scanf à causer l’erreur.
10
Projet C 2P/3B ESPRIT 2019-2020
On peut faire mieux en localisant la ligne causant l'erreur dans le code, il suffit de taper
la commande where dans le prompt du GDB:
11
Projet C 2P/3B ESPRIT 2019-2020
Les Breakpoints:
On peut exploiter gdb pour examiner le programme à différentes étapes de son exécution.
Pour cela, il faut introduire des points d’arrêt où l’exécution s’interrompra.
Exemple:
#include <stdio.h>
int main()
{
int x = 0;
printf("x = ");
scanf("%d", x);
return (0);
}
Commande 4: (gdb) b 6
Commande 5: (gdb) r
12
Projet C 2P/3B ESPRIT 2019-2020
13
Projet C 2P/3B ESPRIT 2019-2020
On peut également utiliser la commande list pour se remémorer l’endroit dans le code où
l’exécution a été interrompue.
Effacer un Breakpoint:
La commande clear en indiquant un numéro de ligne ou un nom de fonction permet
d'effacer le breakpoint.
Commande 7: (gdb) clear 6
La commande delete permet aussi d'effacer un breakpoint en indiquant son numéro (delete
tout court efface – après confirmation – tous les points d’arrêt).
Commande 8: (gdb) quit
14
Projet C 2P/3B ESPRIT 2019-2020
Tableau Récapitulatif:
commande rôle
nano main.c édition
gcc main.c -o programme compilation
gcc -c main.c compilation sans édition de lien
gcc main.c –o programme –g compilation avec débogage
make automatisation de la compilation
gdb programme débogage
./programme exécution
15