Gdb
Un article de Haypo.
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)
- handle SIGPIPE nostop : Ne stoppe pas gdb lors du signal SIGPIPE, mais l'affiche
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
Afficher le code
gdb: Text User Interface (TUI)
- CTRL+x CTRL+a: afficher/cacher le code source
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
Autres
Pagination :
- set pagination on : activer la pagination
- set pagination off : desactiver la pagination
Générer un fichier core :
- generate-core-file
Voir aussi
Liens externes
- Déboguer un programme Python avec gdb
- Site officiel de GDB
- Documentation de GDB en ligne
- Macros gdb pour Python (voir aussi Python GDB macros
- SUBTERFUGUE : tracing & sandboxing