В GDB, как я могу перейти прямо к верхнему фрейму стека вызовов?


9

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

gdb>> up N

чтобы добраться до вершины стека (N-й кадр), но проблема в том, что я не знаю N. Есть ли команда для нахождения общего количества кадров в стеке вызовов? Или есть плавная встроенная команда GDB для перехода на самый верхний кадр? Мне пришло в голову, что самый верхний фрейм должен быть функцией main () - могу ли я использовать эти знания, чтобы добраться до самого верхнего фрейма?

Ответы:


9

В моих тестах использование «вверх» с очень большим числом приводило к отображению самого верхнего кадра, например

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

1
Не работает, если размер стека больше 99999
Vivandiere

Этот ответ работал для меня, просто нужно было использовать большее число.
tesch1

23

Вы можете указать 'bt' с отрицательным числом, чтобы начать с самого верхнего кадра:

BT-20

Затем вы можете использовать 'frame' (или 'f'), чтобы перейти непосредственно к желаемому кадру.


1

fr 0перенесет вас в самый верхний кадр стека. frобозначает рамку.


2
это неправильное направление
tesch1

@ tesch1 достаточно справедливо, но обратная трассировка GDB показывает вам дно наверху :)
The Vivandiere
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.