Comment voir le contenu de la pile avec GDB?

95

Je suis nouveau sur GDB, j'ai donc quelques questions:

  • Comment puis-je consulter le contenu de la pile? Exemple: pour voir le contenu du registre, je tape info registers. Pour la pile, que devrait-il être?

  • Comment puis-je voir le contenu de $0x4(%esp)? Quand je tape print /d $0x4(%esp), GDB donne une erreur.

Plateforme: Linux et GDB

Peter Mortensen
la source
duplication possible de l' utilisation de GDB pour inspecter la pile de machines
Employé le

Réponses:

114

info frame pour afficher les informations sur le cadre de la pile

Pour lire la mémoire à des adresses données, vous devriez jeter un œil à x

x/x $esppour hexadécimal x/d $esppour signé x/u $esppour non signé etc. x utilise la syntaxe de format, vous pouvez également jeter un œil à l'instruction courante via x/i $eipetc.

Commutateur DIP
la source
69

Utilisation:

  • bt - backtrace: affiche les fonctions de la pile et les arguments
  • info frame - afficher les pointeurs de début / fin / args / locaux de la pile
  • x/100x $sp - afficher la mémoire de la pile
(gdb) bt
#0  zzz () at zzz.c:96
#1  0xf7d39cba in yyy (arg=arg@entry=0x0) at yyy.c:542
#2  0xf7d3a4f6 in yyyinit () at yyy.c:590
#3  0x0804ac0c in gnninit () at gnn.c:374
#4  main (argc=1, argv=0xffffd5e4) at gnn.c:389

(gdb) info frame
Stack level 0, frame at 0xffeac770:
 eip = 0x8049047 in main (goo.c:291); saved eip 0xf7f1fea1
 source language c.
 Arglist at 0xffeac768, args: argc=1, argv=0xffffd5e4
 Locals at 0xffeac768, Previous frame's sp is 0xffeac770
 Saved registers:
  ebx at 0xffeac75c, ebp at 0xffeac768, esi at 0xffeac760, edi at 0xffeac764, eip at 0xffeac76c

(gdb) x/10x $sp
0xffeac63c: 0xf7d39cba  0xf7d3c0d8  0xf7d3c21b  0x00000001
0xffeac64c: 0xf78d133f  0xffeac6f4  0xf7a14450  0xffeac678
0xffeac65c: 0x00000000  0xf7d3790e
Gaoithe
la source
56

Vous devez utiliser les commandes d'affichage de la mémoire de gdb. La base est x, pour examiner . Il y a un exemple sur la page liée qui utilise

gdb> x/4xw $sp

pour afficher "quatre mots ( w) de mémoire au-dessus du pointeur de pile (ici, $sp) en hexadécimal ( x)". La citation est légèrement paraphrasée.

se détendre
la source