Trace gdb
Exercice 2 – Recopier le code suivant :
int main()
{
int A = 1;
int B = 2;
int C = 3;
int *P1, *P2;
P1=&A;
P2=&C;
*P1=(*P2)++;
P1=P2;
P2=&B;
*P1-=*P2;
++*P2;
*P1*=*P2;
A=++*P2**P1;
return 0;
}
Compiler ce code et construire l’exécutable. En utilisant le débogueur gdb , placer un point d’arrêt en début de programme (fonction main) et exécuter pas à pas le programme. Faire la trace de ce programme : vous présenterez le contenu de chaque variable et pointeur à chaque instruction, ainsi que leurs adresses.
print variable
affiche le contenu d'une variable. print &variable
affiche l'adresse de la variable et pointeur
x &nom_var
On trouve la valeur des variables et leurs adresses avec
int A
Adresse de la variable A : 0x7fffffffe4bc
Valeur de A : 1
int B
Adresse de la variable B : 0x7fffffffe4b8
Valeur de B : 2
int C
Adresse de la variable B : 0x7fffffffe4b4
Valeur de B : 3
int *P1
Adresse du pointeur P1 : 0x7fffffffe4c8
int *P2
Adresse du pointeur P2: 0x7fffffffe4c0
7 P1=&A;
et 8 P2=&C;
Pour l'instruction
int *P1
commande x &P1
adresse : 0x7fffffffe4c8
valeur :4294960316
int *P2
commande x &P2
adresse : 0x7fffffffe4c0
valeur :4294960308
9 *P1=(*P2)++
Pour l'instruction (gdb) print P1
$4 = (int *) 0x7fffffffe4bc
(gdb) print P2
$5 = (int *) 0x7fffffffe4b4
(gdb) print &P2
$6 = (int **) 0x7fffffffe4c0
(gdb) print &P1
$7 = (int **) 0x7fffffffe4c8
10 P1=P2;
Pour l'instruction (gdb) print P1
$8 = (int *) 0x7fffffffe4b4
(gdb) print P2
$9 = (int *) 0x7fffffffe4b4
(gdb) print &P2
$10 = (int **) 0x7fffffffe4c0
(gdb) print &P1
$11 = (int **) 0x7fffffffe4c8
11 P2=&B;
Pour l'instruction (gdb) print P2
$14 = (int *) 0x7fffffffe4b8
(gdb) print P1
$15 = (int *) 0x7fffffffe4b4
(gdb) print &P1
$16 = (int **) 0x7fffffffe4c8
(gdb) print &P2
$17 = (int **) 0x7fffffffe4c0
12 *P1-=*P2;
Pour l'instruction (gdb) print P1
$18 = (int *) 0x7fffffffe4b4
(gdb) print P2
$19 = (int *) 0x7fffffffe4b8
(gdb) print &P1
$20 = (int **) 0x7fffffffe4c8
(gdb) print &P2
$21 = (int **) 0x7fffffffe4c0
(gdb) print A
$22 = 3
(gdb) print B
$23 = 2
(gdb) print C
$24 = 2
13 ++*P2;
Pour l'instruction (gdb) print A
$1 = 3
(gdb) print B
$2 = 3
(gdb) print C
$3 = 2
(gdb) print &A
$4 = (int *) 0x7fffffffe4bc
(gdb) print &B
$5 = (int *) 0x7fffffffe4b8
(gdb) print &C
$6 = (int *) 0x7fffffffe4b4
(gdb) print P1
$7 = (int *) 0x7fffffffe4b4
(gdb) print P2
$8 = (int *) 0x7fffffffe4b8
(gdb) print &P1
$9 = (int **) 0x7fffffffe4c8
(gdb) print &P2
$10 = (int **) 0x7fffffffe4c0
14 *P1*=*P2;
Pour l'instruction (gdb) print A
$11 = 3
(gdb) print &A
$12 = (int *) 0x7fffffffe4bc
(gdb) print B
$13 = 3
(gdb) print &B
$14 = (int *) 0x7fffffffe4b8
(gdb) print C
$15 = 6
(gdb) print &C
$16 = (int *) 0x7fffffffe4b4
(gdb) print P1
$17 = (int *) 0x7fffffffe4b4
(gdb) print &P1
$18 = (int **) 0x7fffffffe4c8
(gdb) print P2
$19 = (int *) 0x7fffffffe4b8
(gdb) print &P2
$20 = (int **) 0x7fffffffe4c0
15 A=++*P2**P1;
Pour l'instruction (gdb) print A
$21 = 24
(gdb) print &A
$22 = (int *) 0x7fffffffe4bc
(gdb) print B
$23 = 4
(gdb) print &B
$24 = (int *) 0x7fffffffe4b8
(gdb) print C
$25 = 6
(gdb) print &C
$26 = (int *) 0x7fffffffe4b4
(gdb) print P1
$27 = (int *) 0x7fffffffe4b4
(gdb) print &P1
$28 = (int **) 0x7fffffffe4c8
(gdb) print P2
$29 = (int *) 0x7fffffffe4b8
(gdb) print &P2
$30 = (int **) 0x7fffffffe4c0
16 return 0;
Pour l'instruction fin du programme il n'y a plus d'adresse mémoire ni de valeur au variable et au pointeur