18/11/2024
Durée 1 heure
Contrôle de connaissance sur l'utilsation de gcc et gdb /22 points
Pré-requis
Le travail va être réalisé sur workboot.freeboxos.fr port 555
Utilisation des commandes linux de base et de gcc et de gdb
Utilisation de vi (vim)
But
Validation des acquis pour réaliser du c sous linux.
Sur la machine workboot , attention à bien respecter les noms des fichiers et répertoires !!!
créer un répertoire ctrlgccgdb dans le répertoire Works de votre session.
Dans ce répertoire vous allez créer un fichier README (Works/ctrlgccgdb/README)
Ce fichier README va contenir les réponses des questions du contrôle.
1
Pour tester la machine (ici workboot) et ses outils logiciels)
Réaliser un projet bonjour , répertoire bonjour contenant le code c minimum pour faire afficher bonjour le monde
Dans ce source c vous mettrez en commentaires la ligne de commande pour compiler ce code
1
Dans un nouveau projet , que l'on va nommer projet1 (dans ctrlgccgdb/projet1)
/* projet1 controle gcc/gdb */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
printf (" la valeur de argc est de %d\n",argc);
return EXIT_SUCCESS;
}
ce qu'est \n ici
1
tester le code obtenu
./projet1
1
puis :
./projet1 un
ensuite
./projet1 un deux
est la variable argc
1
argc est une variable qui est la contraction argument compteur
Car elle nous renvoie le nombre d'arguments passer
Justifier la réponse
1
Dans un répertoire ctrlgccgdb/projet2
Vous avez vu en cours le test if (si)
/* projet2 controle gcc/gdb */
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char **argv)
{
printf (" la valeur de argc est de %d\n",argc);
if (argc==1)
{
printf("Il n'y aucun argument de passé !\n");
return EXIT_FAILURE;
}
printf("Vous m'avez donné au moins un argument\n");
return EXIT_SUCCESS;
}
Tester et expliquer le résultat de ce code
2
on va remplacer le %d par un %x
printf (" la valeur de argc est de %x\n",argc);
./projet1 un deux trois quatre cinq six sept huit neuf dix
Expliquer votre résultat
et au lieu de %x mettre %o
expliquer ce nouveau résultat
2
Quelle est l'option de compilation de gcc pour pouvoir utiliser gdb avec notre code
1
A quoi sert gdb ?
gdb projet1
1
comment avoir le listing du code depuis gdb ?
1
ensuite taper la commande dans gdb et votre projet1
run un deux
que contient la variable argc , comment voir spécifiquement cette variable
1
regarder la variable argv
regarder la variable argv[0]
regarder la varaible argv[1]
regrader la variable argv[2]
Expliquer
4
on va revoir ou voir le branchement goto en c
qui fonctionne avec des étiquettes, ici on a qu'un label (etiquette) nommée etiquette et une autre sortie
/****************************************/
/* Boucle.c */
/****************************************/
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int compteur;
compteur=0;
etiquette:
compteur=compteur+1;
if (compteur==4) goto sortie;
goto etiquette;
sortie:
printf("on sort et compteur=%d \n",compteur);
return EXIT_SUCCESS;
}
donner la commande pour compiler le code, exécuter et expliquer
1
mettre un point d'arrêt sur la ligne compteur=compteur+1;
utiliser le pas à pas et surveiller la variable compteur.
quand arrivons nous à l’étiquette sortie ?
1
Breakpoint 1, main (argc=1, argv=0x7fffffffdc48) at boucle.c:10
10 compteur=0;
(gdb) step
12 compteur=compteur+1;
(gdb) p compteur
$1 = 0
(gdb) set compteur=3
(gdb) p compteur
$2 = 3
(gdb)
Expliquer à quoi sert la commande set dans gdb
1
/****************************************/
/* Bouclelong.c */
/****************************************/
#include <stdio.h>
#include <stdlib.h>
int main (int argc, char **argv)
{
int compteur;
compteur=0;
etiquette:
compteur=compteur+1;
if (compteur==1000) goto sortie;
goto etiquette;
sortie:
printf("on sort et compteur=%d \n",compteur);
return EXIT_SUCCESS;
}
ce code bouclelong.c
nouveau projet .. bouclelong contenant bouclelong.c
avec la commande C expliquer comment vous allez pouvoir accélérer en pas à pas la fin de notre code et vérifier qu'il fonctionne.
1