Wie kann ich in GDB direkt zum obersten Call-Stack-Frame springen?


9

Ich habe ein C-Programm, das Fehler segelt, nachdem es tief in ein unendliches rekursives Durcheinander hinabgestiegen ist. Das Zurückverfolgen des Prozesses in GDB ist nutzlos, da der Aufrufstapel-Frame mindestens 1000 Frames tief ist und die wiederholten Funktionsaufrufe eine Reihe von vier allgemeinen rekursiven Funktionsaufrufen sind (Haltepunkte scheinen also nutzlos zu sein). Wiederholte Aufrufe zur Rückverfolgung lesen nur die vier Funktionsnamen immer und immer wieder aus. Mir kam der Gedanke, dass das Aufstehen von 'up' 'up' 'up' mich höher bringen würde, sodass ich sehen konnte, wo dieses Muster zum ersten Mal auftrat, aber es scheint effizienter zu sein, vom obersten Anruf aus zu beginnen Stapeln Sie den Frame und treten Sie stattdessen zurück, da ich davon ausgehe, dass die unendliche Rekursion früh im Prozess beginnt. Wenn der Aufrufstapel insgesamt N Frames hätte, könnte ich das einfach tun

gdb>> up N

um an die Spitze des Stapels (des N-ten Frames) zu gelangen, aber das Problem ist, dass ich N nicht kenne. Gibt es einen Befehl zum Ermitteln der Gesamtzahl der Frames im Aufrufstapel? Oder gibt es einen integrierten GDB-Befehl zum Springen zum obersten Frame? Mir kam der Gedanke, dass der oberste Frame die main () -Funktion sein sollte - kann ich dieses Wissen nutzen, um zum obersten Frame zu gelangen?

Antworten:


9

In meinen Tests führte die Verwendung von "up" mit einer sehr großen Anzahl dazu, dass der oberste Frame angezeigt wurde, z

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

1
Funktioniert nicht, wenn
die Stapelgröße

Diese Antwort funktionierte für mich, musste nur eine größere Zahl verwenden.
tesch1

23

Sie können 'bt' mit einer negativen Zahl angeben, um am obersten Frame zu beginnen:

BT-20

Sie können dann 'frame' (oder 'f') verwenden, um direkt zu dem gewünschten Frame zu gelangen.


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.