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?
Możesz podać „bt” z liczbą ujemną, aby rozpocząć od najwyższej ramki:
Następnie możesz użyć „ramki” (lub „f”), aby bezpośrednio przejść do żądanej ramki.
źródło
fr 0
przeniesie Cię do najwyższej ramki stosu.fr
oznacza ramę.źródło