Gdb
Un article de Haypo.
Version du 27 avril 2010 à 10:54 (modifier) Haypo (Discuter | Contributions) (→Voir aussi) ← Différence précédente |
Version actuelle (1 juillet 2013 à 23:08) (modifier) (défaire) Haypo (Discuter | Contributions) (→Afficher une valeur) |
||
(4 révisions intermédiaires masquées) | |||
Ligne 46 : | Ligne 46 : | ||
** '''print (*(char **) 0xbffffbc4)@2''' : Affiche les 2 premiers éléments du tableau de chaînes de caractères commençant à l'adresse 0xbffffbc4 | ** '''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 | ** '''print $eax''' : Affiche le contenu du registre $eax | ||
+ | ** '''ptype var''' : Affiche le type d'une variable | ||
* Les commandes « '''info''' » : | * Les commandes « '''info''' » : | ||
** '''info registers''' : Affiche tous les registres (entiers) | ** '''info registers''' : Affiche tous les registres (entiers) | ||
Ligne 58 : | Ligne 59 : | ||
** '''set tmp = 77''' : Assigne la valeur 77 à la variable tmp | ** '''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 | ** '''set *(char *)0xbffffbd4 = '@'''' : Modifie le première caractère de la chaîne à l'adresse 0xbffffbd4 | ||
+ | |||
+ | == Afficher le code == | ||
+ | |||
+ | [http://sourceware.org/gdb/onlinedocs/gdb/TUI.html gdb: Text User Interface (TUI)] | ||
+ | |||
+ | * CTRL+x CTRL+a: afficher/cacher le code source | ||
== Multi-threading == | == Multi-threading == | ||
Ligne 87 : | Ligne 94 : | ||
* '''stepi''' : Instruction suivante (sans entrer dans les fonctions) | * '''stepi''' : Instruction suivante (sans entrer dans les fonctions) | ||
* '''nexti''' : Instruction suivante en entrant 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 == | == Voir aussi == |
Version actuelle
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 |
[modifier] 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
[modifier] 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
[modifier] 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
[modifier] 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
- ptype var : Affiche le type d'une variable
- 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] 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
[modifier] Afficher le code
gdb: Text User Interface (TUI)
- CTRL+x CTRL+a: afficher/cacher le code source
[modifier] 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
[modifier] fork()
- set follow-fork-mode mode où mode est l'une de ces valeurs : parent (par défaut), child, ask
- show follow-fork-mode
[modifier] 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).
[modifier] 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
[modifier] Autres
Pagination :
- set pagination on : activer la pagination
- set pagination off : desactiver la pagination
Générer un fichier core :
- generate-core-file
[modifier] Voir aussi
[modifier] 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