19/12/2024
Durée 110 minutes
Contrôle de connaissance sur l'utilsation de gcc et gdb /24 points
Pré-requis
Le travail va être réalisé sur linux2.local
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 de base sous linux.
vous disposez d'un accès à linux2 de la section , vous avez un login, un mot de passe et il s'agit de se connecter avec ssh
ssh login@linux2.local
X : Groupe (1 ou 2) YY: poste de travail (1 a 15)
votre login est 1gXstuYY pour les initiaux et 1gXappYY pour les cfa et vous devez connaitre votre mot de passe .
Rappel:
On appel un projet en c , un répertoire du nom du projet qui contiendra le ou les sources et l'exécutable du projet informatique.
Sur la machine linux2 , attention à bien respecter les noms des fichiers et répertoires !!! sous peine de travail nul ! L'informatique est précise.
créer un répertoire ctrlgccgdb dans le répertoire Works , surement à réaliser aussi sur votre session.
Dans ce répertoire vous allez créer un fichier texte du nom de README (Works/ctrlgccgdb/README)
Ce fichier README va contenir votre nom prénom , date et titre du contrôle ainsi que les réponses aux questions du contrôle pour votre évaluation.
1
Pour tester la machine distante (workboot ou linux2) 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
donner la commande de compilation avec gcc de ce code
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 a aucun argument 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
1
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
mettre un point d’arrêt à la ligne 12 (break point)
et relancer le code a debugger avec la commande
run un deux
regarder le contenu de la variable argv
regarder le contenu de la variable argv[0]
regarder le contenu de la variable argv[1]
regarder le contenu de la variable argv[2]
interpréter le résultat :
4
projet boucle
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
on va recompiler pour utiliser avec gdb ce code boucle.c
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.
(indice voir la question 5-3)
1