Jak w GDB mogę przejść bezpośrednio do najwyższej ramki stosu wywołań?

9

Mam program C, który segreguje błędy po zejściu głęboko w nieskończony rekurencyjny bałagan. Śledzenie wstecz procesu w GDB jest bezużyteczne, ponieważ ramka stosu wywołań ma głębokość co najmniej 1000 ramek, a powtarzane wywołania funkcji są serią czterech typowych rekurencyjnych wywołań funkcji (więc punkty przerwania wydają się bezużyteczne). Powtarzane wywołania śledzenia wstecznego po prostu odczytują cztery nazwy funkcji w kółko. Przyszło mi do głowy, że „podniesienie”, „podniesienie”, „podniesienie” ... sprawi, że będę wyżej, więc mogłem zobaczyć, gdzie ten wzorzec zaczął się pojawiać, ale wydaje się, że bardziej efektywne byłoby zacząć od najwyższego wezwania zamiast tego układaj ramkę i zmniejszaj, ponieważ moje przeczucie polega na tym, że nieskończona rekurencja rozpoczyna się na wczesnym etapie procesu. Jeśli stos wywołań miałby w sumie N ramek, wiem, że mógłbym to zrobić

gdb>> up N

aby dostać się na szczyt stosu (n-ta ramka), ale problem polega na tym, że nie znam N. Czy istnieje polecenie znalezienia całkowitej liczby ramek na stosie wywołań? Lub czy istnieje przydatne wbudowane polecenie GDB do przeskakiwania do najwyższej ramki? Przyszło mi do głowy, że najwyższa ramka powinna być funkcją główną () - czy mogę wykorzystać tę wiedzę, aby dostać się do najwyższej ramki?

dandrews
źródło

Odpowiedzi:

9

W moich testach użycie „w górę” z bardzo dużą liczbą spowodowało wyświetlenie najwyższej ramki, np

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

źródło
1
Nie działa, jeśli rozmiar stosu jest większy niż 99999
The Vivandiere
Ta odpowiedź działała dla mnie, wystarczyło użyć większej liczby.
tesch1
23

Możesz podać „bt” z liczbą ujemną, aby rozpocząć od najwyższej ramki:

bt -20

Następnie możesz użyć „ramki” (lub „f”), aby bezpośrednio przejść do żądanej ramki.

BlakBat
źródło
1

fr 0przeniesie Cię do najwyższej ramki stosu. froznacza ramę.

Vivandiere
źródło
2
to zły kierunek
tesch1
@ tesch1 wystarczy, ale gdb backtrace pokazuje dno na górze :)
The Vivandiere