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


9

我有一个C程序,它在深入到无限递归混乱之后会出现错误。在GDB中回溯过程是没用的,因为调用堆栈帧至少有 1000帧深,而重复的函数调用是四个常见的递归函数调用的系列(因此断点似乎无用)。重复调用backtrace只是一遍又一遍地读出四个函数名。在我看来,向上“向上”向上......会让我更高,所以我可以看到这种模式最初开始发生的地方,但似乎从最顶层的呼叫开始会更有效率堆栈框架和降低相反,因为我的预感是无限递归在过程的早期开始。如果调用堆栈总共有N帧,我知道我可以做到

gdb>> up N

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

Answers:


9

在我的测试中,使用具有非常大数字的“up”导致显示最顶部的帧,例如

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

1
如果堆栈大小大于99999则不起作用
Vivandiere 2017年

这个答案对我有用,只需要使用更大的数字。
tesch1

22

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

bt -20

然后,您可以使用'frame'(或'f')直接转到您想要的帧。


1

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


2
这是错误的方向
tesch1

@ tesch1足够公平,但gdb backtrace显示你的最低点:)
Vivandiere
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.