我有一个 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
代表框架。