Як в GDB можна перейти безпосередньо до верхньої рамки стека викликів?


9

У мене є програма C, яка провалюється, коли спускається вглиб нескінченного рекурсивного безладу. Зворотний шлях процесу в GDB марний, оскільки кадр стека викликів має глибину не менше 1000 кадрів, а повторювані виклики функцій - це серія з чотирьох загальноприйнятих рекурсивних викликів функцій (тому точки перерви здаються марними). Повторні дзвінки для зворотного зв'язку просто зчитують чотири назви функцій, знову і знову. Мені прийшло в голову, що виконання «вгору», «вгору», «вгору» ... підніме мене вище, тому я міг бачити, де вперше почала виникати ця закономірність, але, здається, було б ефективніше починати з самого верхнього дзвінка стек-кадр і замість цього відійдіть, тому що я вважаю, що нескінченна рекурсія починається на початку процесу. Якщо стек викликів мав N кадрів, я знаю, що міг би просто зробити

gdb>> up N

щоб дістатися до вершини стека (N-й кадр), але проблема полягає в тому, що я не знаю N. Чи є команда для пошуку загальної кількості кадрів у стеку викликів? Або є гладка вбудована команда GDB для переходу на верхній кадр? Мені прийшло в голову, що найвищий кадр повинен бути основною () функцією - чи можу я використовувати ці знання, щоб дійти до самого верхнього кадру?

Відповіді:


9

У моїх тестах використання 'up' з дуже великою кількістю призвело до відображення самого верхнього кадру, наприклад

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

1
Не працює, якщо розмір стека перевищує 99999
The Vivandiere

Ця відповідь працювала для мене, просто потрібно було використовувати більшу кількість.
tesch1

23

Ви можете вказати "bt" з від'ємним числом, щоб почати з верхнього кадру:

bt -20

Потім ви можете використовувати "frame" (або "f"), щоб безпосередньо перейти до потрібного кадру.


1

fr 0приведе вас до найвищої рами стека. frпідставки для рами.


2
це неправильний напрямок
tesch1

@ tesch1 досить справедливо, але gdb backtrace показує тобі знизу вгорі :)
The Vivandiere
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.