Gdb
Un article de Haypo.
| Version du 10 avril 2007 à 12:41 (modifier) Haypo (Discuter | Contributions) (→Liens externes) ← Différence précédente  | 
				Version du 11 avril 2008 à 15:53 (modifier) (défaire) Haypo (Discuter | Contributions) (→Multi-threading) Différence suivante →  | 
			||
| Ligne 63 : | Ligne 63 : | ||
| * '''info threads''' : Affiche la liste des threads | * '''info threads''' : Affiche la liste des threads | ||
| * '''thread <id>''' : Passe au thread du numéro spécifié | * '''thread <id>''' : Passe au thread du numéro spécifié | ||
| + | * '''thread apply all <commande>''' : Exécute une commande pour chaque thread, exemple pratique : « thread apply all backtrace » affiche la backtrace de tous les threads | ||
| == fork() == | == fork() == | ||
Version du 11 avril 2008 à 15:53
Catégorie:Logiciel libre Catégorie:Programmation Catégorie:Sécurité
Retour à la partie programmation
gdb est un excellent débogueur issu du projet GNU. Il peut avoir de nombreux usages allant de la recherche de bug à la rétro-ingénierie.
Je vais présenter ici les commandes les plus intéressantes.
Sommaire | 
Point d'arrêt
-  Commande « break » (abrégé « b ») :
- b : Poser un point d'arrêt sur la ligne courante
 - b <fichier>:<ligne> : Poser un point d'arrêt à dans un fichier donné à une ligne précise
 - b <fonction> : Poser un point d'arrêt sur une fonction
 - b *<adresse> : Poser un point d'arrêt à une adresse mémoire donnée
 
 - condition <n> <condition> : Le point d'arrêt numéro n est levé uniquement si la condition spécifiée est vérifiée. Exemple : condition 5 curprop->tag=283. Sympa nan ?
 - info breakpoints : Affiche les points d'arrêt
 
Signaux
Les signaux peuvent être interceptés ou non. Commmandes :
- info signals : Affiche la liste des signaux et leur état (attrapé ou non)
 - handle SIG33 ignore : Ignore l'émission du signal SIG33, voir l'aide pour les détails (help handle)
 
Exécution pas à pas
- s ou step : Instruction suivante en entrant dans les fonctions.
 - n ou next : Instruction suivante, sans entrer dans les fonctions.
 - u <ligne> ou until <ligne> : Continuer l'exécution jusqu'à ce qu'on atteigne la ligne donnée (ou supérieur). Utile pour sortir d'une boucle par exemple
 - c ou continue : Continuer l'exécution
 
Afficher une valeur
-  Voyons la commande « print » :
- print tmp : Affiche le contenu de la variable tmp
 - print *0xbffffbd4 : Affiche la valeur à l'adresse 0xbffffbd4
 - print *(char *)0xbffffbd4 : Affiche le caractère à l'adresse 0xbffffbd4
 - print 1+1 : Affiche le résultat du calcul 1+1 :-)
 - print /x 10 : Affiche le nombre 10 en hexadécimal (0xa)
 - print argv[1] : Affiche la 2e valeur du tableau argv
 - print (*(char **) 0xbffffbc4)@2 : Affiche les 2 premiers éléments du tableau de chaînes de caractères commençant à l'adresse 0xbffffbc4
 - print $eax : Affiche le contenu du registre $eax
 
 -  Les commandes « info » :
- info registers : Affiche tous les registres (entiers)
 - info float : Affiche les registres flottants
 - info all-registers : Affiche vraiment tous les registres du processeur
 
 
Modifier une valeur
-  Commande « set » :
- set $eax = 4 : Assigne la valeur 4 au registre EAX
 - set $eflags = $eflags | 64 : Pose le flag ZF (Zero Flags), il doit y avoir moyen de faire ça plus facilement
 - set tmp = 77 : Assigne la valeur 77 Ã la variable tmp
 - set *(char *)0xbffffbd4 = '@' : Modifie le première caractère de la chaîne à l'adresse 0xbffffbd4
 
 
Multi-threading
Pour les programmes utilisant des threads, il est utile de connaître les commandes permettant de passer de l'un à l'autre :
- info threads : Affiche la liste des threads
 - thread <id> : Passe au thread du numéro spécifié
 - thread apply all <commande> : Exécute une commande pour chaque thread, exemple pratique : « thread apply all backtrace » affiche la backtrace de tous les threads
 
fork()
- set follow-fork-mode mode où mode est l'une de ces valeurs : parent (par défaut), child, ask
 - show follow-fork-mode
 
Informations après un plantage
Après un plantage (erreur de page, SIGSEGV, par exemple), gdb permet d'indiquer l'origine du plantage (à quoi il servirait sinon ? :-)). Utilisez pour cela la commande « where » (équivalente à « backtrace »). Notez qu'il est possible d'appeler where à n'importe quel moment, pas forcément après un plantage.
Exemple de where :
(gdb) where #0 ecore_app_args_set (argc=1, argv=0xbffffbd4) at ecore_app.c:18 #1 0x08051201 in main (argc=1, argv=0xbffffbd4) at main.c:216
Ce résultat se lit de bas en haut. La première fonction appelée est main() dans le fichier main.c (ligne 216), et on est actuellement dans ecore_app_args_set du fichier ecore_app.c (ligne 18).
Utiliser gdb en assembleur
- disassemble : Désassemble le code dans la frame courante
 - disassemble <début> <fin> : Désassemble le code qui débute à l'adresse indiquée et s'arrête exactement ou avant la fin indiquée
 - stepi : Instruction suivante (sans entrer dans les fonctions)
 - nexti : Instruction suivante en entrant dans les fonctions
 
Voir aussi
Liens externes
- Site officiel de GDB
 - Documentation de GDB en ligne
 - Macros gdb pour Python (voir aussi Python GDB macros
 - SUBTERFUGUE : tracing & sandboxing
 

