Как я могу перейти к фрейму в трассировке стека в соответствии с именем функции в gdb?

#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» поддерживает.