在 GDB 中,如何直接跳转到最顶层的调用堆栈框架?

在 GDB 中,如何直接跳转到最顶层的调用堆栈框架?

我有一个 C 程序,在陷入无限递归混乱后,会出现分段错误。在 GDB 中回溯该过程是没用的,因为调用堆栈框架是至少深度为 1000 帧,重复的函数调用是一系列四个常见的递归函数调用(因此断点似乎毫无用处)。重复调用 backtrace 只会一遍又一遍地读出四个函数名称。我发现执行“up”“up”“up”... 会让我走得更高,这样我就可以看到这种模式最初出现的位置,但似乎从最顶层的调用堆栈帧开始并向下移动会更有效,因为我的直觉是无限递归在过程的早期就开始了。如果调用堆栈总共有 N 帧,我知道我可以这样做

gdb>> up N

到达堆栈顶部(第 N 帧),但问题是我不知道 N。是否有命令可以查找调用堆栈中的帧总数?或者,是否有巧妙的内置 GDB 命令可以跳转到最顶层的帧?我突然想到,最顶层的帧应该是主要的()功能——我可以利用这些知识到达最顶层的框架吗?

答案1

在我的测试中,使用非常大的数字的“up”会导致显示最上面的帧,例如

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

答案2

您可以指定“bt”为负数来从最顶层的框架开始:

BT-20

然后您可以使用“frame”(或“f”)直接转到您想要的框架。

答案3

fr 0将带您进入最顶层的堆栈框架。fr代表框架。

相关内容