Gdb

Un article de Haypo.

Crash du vaisseau spacial de Calvin
Crash du vaisseau spacial de Calvin

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

[modifier] Articles connexes