Как я могу перейти к кадру в трассировке стека в соответствии с именем функции в GDB? - PullRequest
14 голосов
/ 16 апреля 2011

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

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

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

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

Ответы [ 2 ]

19 голосов
/ 16 апреля 2011

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

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

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

19 голосов
/ 16 апреля 2011

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

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

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

...