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?
Sie können 'bt' mit einer negativen Zahl angeben, um am obersten Frame zu beginnen:
Sie können dann 'frame' (oder 'f') verwenden, um direkt zu dem gewünschten Frame zu gelangen.
quelle
fr 0
bringt Sie zum obersten Stapelrahmen.fr
steht für Rahmen.quelle