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?

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 ()

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.


Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.