Wie kann ich den Stack-Frame mit GDB untersuchen?

73

Im Moment habe ich GDB verwendet, um eine Binärdatei zu zerlegen und verschiedene Register und so weiter zu überprüfen. Gibt es einen einfachen Befehl, um alles auf dem Stapel zu untersuchen? Kann dies auf alles in einer Funktion beschränkt werden?

Geh von meinem Rasen runter
quelle
3
Dies sollte Ihnen hilfreich sein : cs.nyu.edu/courses/spring07/V22.0474-001/misc/gdb-refcard.pdf . Sie können jederzeit den Befehl "frame" verwenden, um zwischen den Frames zu springen.
Dicaprio

Antworten:

72

Für den aktuellen Stapelrahmen:

  • Info-Frame listet allgemeine Informationen zum Frame auf (wo Dinge im Speicher beginnen usw.)
  • info args listet Argumente für die Funktion auf
  • info local listet lokale Variablen auf, die im Frame gespeichert sind
Michael Mrozek
quelle
91

Sie können den Inhalt des Stapels mit anzeigen x/10x $sp

Dadurch werden die obersten 10 Elemente des Stapels gedruckt.

Fließen
quelle
Welche Version von GDB ist das? Ich kann gdb nicht dazu bringen, Register als Befehlsargumente für GDB 7.7-0ubuntu3.1
nightpool
Diese Antwort zeigt Ihnen, wie Sie die Bytes im Stapelrahmen tatsächlich betrachten. Ich hatte einige Probleme, herauszufinden, wie das geht. Vielen Dank!
Dadurch werden jedoch das Element $spund die 9 Elemente danach gedruckt , dh (wenn der Stapel wie beispielsweise in x86 nach unten wächst) 9 Elemente, die vom Programm noch nicht verwendet werden. Richtig?
cYrus
@cYrus $ sp zeigt auf den oberen Rand des Stapels, dh auf die untere Adresse. Sie denken wahrscheinlich an $ bp, in dem die unterste Adresse des Stapels gespeichert ist.
Raphael
56
  • bt(oder backtrace) gibt Ihnen einen Aufrufstapel.

  • frame <args> wählt einen Frame auf dem Aufrufstapel zur Überprüfung aus

  • info frame <args>gibt Ihnen Informationen zu einem bestimmten Frame aus dem Stapel. Beim Aufruf ohne Argumente wird der aktuell ausgewählte Frame angezeigt

  • info locals kann Ihnen Informationen über lokale Variablen auf dem Stapel geben.

Dlanod
quelle
2
frame <args> wählt auch einen Frame aus. info frame <addr>wird verwendet, um den Rahmen zu untersuchen, ohne ihn auszuwählen
rostamn739