Подтвердить что ты не робот

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

Я отлаживаю переполнение стека из-за бесконечной рекурсии. Программа выходит из строя, когда стек имеет глубину 700 вызовов.

Я хочу перейти к кадру, в котором была вызвана функция. Однако gdb показывает мне трассировку стека от вершины стека примерно по 20 записей за раз, и мне интересно, могу ли я как-то пропустить прямо к вызывающей функции, не просматривая трассировку стека, чтобы найти ее номер.

С этой целью я хочу иметь возможность перейти к фрейму стека на основе его имени вместо его номера.

Можно ли это сделать в gdb?

4b9b3361

Ответ 1

Два варианта:

  • up 200 приведет вас к 200 кадрам
  • Если вы знаете начального вызова рекурсивной подпрограммы, вы можете сделать f[rame] <caller-func> - это перейдет к кадру адреса caller-func.

См. Выбор рамки в руководстве.

Ответ 2

Вы должны использовать bt с минусом. Он похож на bt, но сначала печатает самые внешние n кадров.
Например:
bt -100

И, скорее всего, вы увидите кадр, который вам нужно проверить на первом или втором экране.
После того, как высекали трассировку стека с помощью bt -100, мне удалось легко установить pboblem с множеством рекурсивных вызовов.

И затем выполните команду
f <here the number of your frame you need to inspect>