#gdb #stack-trace
#gdb #трассировка стека
Вопрос:
Я отлаживаю переполнение стека из-за бесконечной рекурсии. Программа завершается с ошибкой, когда глубина стека составляет 700 вызовов.
Я хочу перейти к фрейму, в котором изначально была вызвана функция. Однако gdb показывает мне трассировку стека с вершины стека примерно по 20 записей за раз, и мне интересно, могу ли я каким-то образом перейти прямо к вызывающей функции, не просматривая трассировку стека, чтобы найти ее номер.
С этой целью я хочу иметь возможность переходить к фрейму стека на основе его имени, а не его номера.
Можно ли это сделать в gdb?
Ответ №1:
Два варианта:
up 200
отобразит 200 кадров- Если вы знаете начального вызывающего рекурсивную процедуру, вы можете сделать
f[rame] <caller-func>
— это приведет к переходу к фрейму адресаcaller-func
.
Смотрите Выбор фрейма в руководстве.
Комментарии:
1. ПРИМЕЧАНИЕ, как указано в ссылке, вы также можете использовать
frame function <caller-function-name>
, ссылаясь на имя функции, вместо ее уровня фрейма в текущей трассировке стека
Ответ №2:
Вы должны использовать bt
с минусом. Это похоже на bt
, но сначала выведите самые удаленные n кадров.
Например:
bt -100
И, скорее всего, вы увидите фрейм, который вам нужно проверить, на первом или втором экране.
Однажды выделение трассировки стека с помощью bt -100
помогло мне легко исправить проблему pboblem с большим количеством рекурсивных вызовов.
А затем выполнить команду
f <here the number of your frame you need to inspect>
Комментарии:
1. Потрясающе. Искал способ сделать это. Сбивающим с толку всегда было то, что «frame» не поддерживает эту нотацию, но «bt» поддерживает.