Jak można zobaczyć zawartość stosu za pomocą GDB?

101

Jestem nowy w GDB, więc mam kilka pytań:

  • Jak mogę sprawdzić zawartość stosu? Przykład: aby zobaczyć zawartość rejestru, wpisuję info registers. Co to powinno być w przypadku stosu?

  • Jak mogę zobaczyć zawartość $0x4(%esp)? Kiedy piszę print /d $0x4(%esp), GDB wyświetla błąd.

Platforma: Linux i GDB

Peter Mortensen
źródło
możliwy duplikat użycia GDB do kontroli stosu maszyn
zatrudniony w Rosji

Odpowiedzi:

120

info frame aby pokazać informacje o ramce stosu

Aby odczytać pamięć pod podanymi adresami należy się przyjrzeć x

x/x $espfor hex x/d $espfor signed x/u $espfor unsigned itp. x używa składni formatu, możesz również spojrzeć na bieżącą instrukcję przez x/i $eipitd.

Przełącznik DIP
źródło
73

Posługiwać się:

  • bt - backtrace: pokazuje funkcje stosu i argumenty
  • info frame - pokazuje wskaźniki początku / końca stosu / args / locals
  • x/100x $sp - pokaż pamięć stosu
(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
źródło
58

Musisz użyć poleceń wyświetlania pamięci gdb. Podstawowy jest xdo zbadania . Na stronie, do której prowadzi link, znajduje się przykład, który używa

gdb> x/4xw $sp

wydrukować "cztery słowa ( w) pamięci powyżej wskaźnika stosu (tutaj, $sp) w systemie szesnastkowym ( x)". Cytat jest lekko sparafrazowany.

rozwijać
źródło