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

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

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

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

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


person Nathan Fellman    schedule 16.04.2011    source источник


Ответы (2)


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

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

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

person Nikolai Fetissov    schedule 16.04.2011

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

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

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

person Community    schedule 16.04.2011
comment
Потрясающий. Искал способ сделать это. Непонятным всегда было то, что фрейм не поддерживает эту нотацию, а bt поддерживает. - person Marenz; 31.01.2014