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

dan*_*ews 10 c gdb debug

我有一个 C 程序,它在深入陷入无限递归混乱之后对错误进行分段。在 GDB 中回溯过程是没有用的,因为调用堆栈帧至少有1000 帧深,并且重复的函数调用是一系列四个常见的递归函数调用(因此断点似乎没有用)。对 backtrace 的重复调用只是一遍又一遍地读出四个函数名称。我突然想到,做 'up' 'up' 'up'... 会让我更上一层楼,所以我可以看到这种模式首先开始发生的地方,但似乎从最顶层的调用开始会更有效堆栈帧并逐步下降,因为我的直觉是无限递归在过程的早期开始。如果调用堆栈总共有 N 帧,我知道我可以做

gdb>> up N
Run Code Online (Sandbox Code Playgroud)

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

Bla*_*Bat 26

您可以使用负数指定 'bt' 以从最顶层帧开始:

BT -20

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


小智 10

在我的测试中,使用 'up' 和非常大的数字会导致显示最顶层的框架,例如

(gdb) up 99999
#58 0x0000000000442fb4 in main ()
Run Code Online (Sandbox Code Playgroud)