Wie kann ich in GDB direkt zum obersten Aufrufstackrahmen springen?

6560
dandrews

Ich habe ein C-Programm, das Fehler ausgleicht, nachdem es tief in ein unendliches rekursives Durcheinander gesunken ist. Das Zurückverfolgen des Prozesses in GDB ist unbrauchbar, da der Aufruf-Stack-Frame mindestens 1000 Frames tief ist und die wiederholten Funktionsaufrufe eine Serie von vier üblichen rekursiven Funktionsaufrufen sind (Haltepunkte scheinen also nutzlos). Wiederholte Aufrufe des Backtraces lesen die vier Funktionsnamen immer wieder aus. Mir kam es so vor, als würde "Up" "Up" "Up" "höher" werden, so dass ich sehen konnte, wo dieses Muster zum ersten Mal auftrat, aber es scheint effizienter zu sein, vom obersten Anruf zu beginnen Stapeln Sie Frame und treten Sie stattdessen zurück, weil ich glaube, dass die unendliche Rekursion früh im Prozess beginnt. Wenn der Aufrufstack insgesamt N Frames hätte, könnte ich das einfach tun

gdb>> up N 

an den Anfang des Stapels zu gelangen (der N-te Frame), 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 glatten integrierten GDB-Befehl, um zum obersten Frame zu springen? Ich kam mir vor, dass der oberste Frame die main () - Funktion sein sollte - kann ich dieses Wissen nutzen, um zum obersten Frame zu gelangen?

8

3 Antworten auf die Frage

19
BlakBat

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

BT -20

Sie können dann mit "frame" (oder "f") direkt zum gewünschten Frame gehen.

8

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

(gdb) up 99999 #58 0x0000000000442fb4 in main () 
Funktioniert nicht, wenn die Stapelgröße 99999 überschreitet The Vivandiere vor 7 Jahren 1
Diese Antwort hat für mich funktioniert, ich musste nur eine größere Anzahl verwenden. tesch1 vor 6 Jahren 0
1
The Vivandiere

fr 0bringt Sie zum obersten Stapelrahmen. frsteht für Rahmen.

das ist die falsche Richtung tesch1 vor 6 Jahren 0
@ Tesch1 fair genug, aber gdb backtrace zeigt dir den unteren Teil oben :) The Vivandiere vor 6 Jahren 0