Vous êtes sur la page 1sur 4

GDB petit tutoriel

Petite d emo

Compiler un programme pour le debugging Pour pouvoir lancer lex ecution dun programme sous gdb, il faut pr eparer celui-ci, en utilisant loption sp eciale -g lors de la compilation. Dans cet exemple, on va debugger le programme suivant, qui est stock e dans le chier prog.c:
#include <stdio.h> int max(int a, int b) { int c=a; if (a<b){ c=b; }; return c; } int f(int x) { return 2*x+max(x+4,2*x); } int main() { printf("%d et %d\n",f(3),f(5)); return 0; }

On compile donc le programme ` a laide de la commande:


gcc -Wall -g prog.c -o prog

et on lance gdb sur ce programme ainsi:


gdb prog << message daccueil... >> (gdb)

Ex ecuter le programme sous gdb de la commande run de gdb:

On peut ex ecuter le programme ` a laide

(gdb) run Starting program: /var/home/hirschko/Here/Teaching/Stage_C/Code/prog 13 et 20 Program exited normally.

Lex ecution se d eroule comme si le programme tournait normalement. Lorsque lutilisateur de gdb a la main, il peut choisir de terminer la session en tapant quit . 1

On peut exploiter gdb pour examiner le programme ` a di erentes etapes de son ex ecution: pour cela, il faut introduire des points darr et o` u lex ecution sinterrompra. D eterminer des points darr et Cest la commande breakpoint qui permet dindiquer des points darr et. On peut fournir un num ero de ligne dans le code source, ou bien le nom dune fonction (lex ecution sinterrompra alors ` a chaque appel ` a cette fonction). D` es lors, si on lance lex ecution, gdb interromp lex ecution du programme et redonne la main ` a lutilisateur lorsquil rencontre un point darr et:
(gdb) break f Breakpoint 1 at 0x804840b: file code_gdb.c, line 15. (gdb) run Starting program: /plume/filhot/home/hirschko/Here/Teaching/Stage_C/Mine/Doc/prog Breakpoint 1, f (x=5) at code_gdb.c:15 15 return 2*x+max(x+4,2*x);

NB: on peut egalement introduire des watchpoints, ` a laide de la commande watch , qui ont pour eet dinterrompre lex ecution lorsque la valeur dune variable est modi ee: on surveille en quelque sorte cette variable. Examiner la situation lors dun point darr et Lorsque lex ecution du programme est interrompue, on peut examiner l etat de la m emoire ` a ce moment l` a, par exemple en achant la valeur dune variable ` a laide de la commande print :
(gdb) print x $1 = 5

emorer lendroit On peut egalement utiliser la commande list pour se rem dans le code o` u lex ecution a et e interrompue:
(gdb) list 10 return c; 11 } 12 13 int f(int x) 14 { 15 return 2*x+max(x+4,2*x); 16 } 17 18 int main() 19 {

Faire evoluer le programme La commande step permet davancer pas a pas dans lex ` ecution, an de bien contr oler l evolution du programme. Elle permet de passer ` a la ligne successive dans le source:
(gdb) step max (a=9, b=10) at code_gdb.c:5 5 int c=a; (gdb) step 7 if (a<b){ (gdb) step 8 c=b; (gdb) print c $2 = 9 (gdb) step 10 return c; (gdb) print c $3 = 10

` noter quil existe aussi la commande next , qui elle ne descend pas A dans les appels de fonctions; ainsi, si lon a interrompu lex ecution juste avant un appel de la forme f(a,b), next relance le programme et linterromp apr` es lappel ` a f (dans le code de la fonction appelante), alors que step sarr ete ` a la premi` ere ligne du code d enissant la fonction f. Linstruction continue , elle, relance lex ecution jusquau prochain point darr et. Examiner la pile dex ecution: la commande backtrace permet dacher la pile dex ecution, indiquant ` a quel endroit lon se trouve au sein des di erents appels de fonctions. Ici, on est dans la fonction max, qui a et e appel ee par f, elle-m eme invoqu ee par la fonction main:
(gdb) backtrace #0 max (a=9, b=10) at code_gdb.c:10 #1 0x8048423 in f (x=5) at code_gdb.c:15 #2 0x804844f in main () at code_gdb.c:20

Eacer un point darr et: clear en indiquant un num ero de ligne ou un nom de fonction, delete en indiquant le num ero du breakpoint (delete tout court eace apr` es conrmation tous les points darr et). Remarque: pourquoi faut-il utiliser une option sp eciale de gcc an de pouvoir utiliser gdb? Parce que de nombreuses informations inutiles lors de lex ecution du programme ne sont pas mises, par d efaut: ainsi il est a priori inutile de savoir, au cours de lex ecution du programme, ` a quel endroit on se trouve dans le code source, ou bien quel est le nom de la variable quon est en train de modier. Par contre ce genre de renseignement est utile ` a gdb an que lutilisateur sy retrouve.

R esum e: quelques commandes importantes sous gdb

Entre parenth` eses, les abr eviations que lon peut utiliser ` a la place des commandes en toutes lettres. quit (q) quitter gdb run (r) lancer lex ecution break,watch,clear,delete (b,w,cl,d) introduire un point darr et, ou bien surveiller une variable step,next,continue (s,n,c) avancer dun pas (en entrant ou pas dans les sous-fonctions), relancer jusquau prochain point darr et print,backtrace,list (p,bt,l) acher la valeur dune variable, la pile dex ecution, acher lendroit o` u lon se trouve dans le code

Vous aimerez peut-être aussi