【发布时间】:2011-04-16 18:52:50
【问题描述】:
由于无限递归,我正在调试堆栈溢出。当堆栈深度为 700 次调用时,程序会失败。
我想跳到最初调用该函数的帧。但是,gdb 一次向我显示堆栈顶部的堆栈跟踪大约 20 个条目,我想知道是否可以以某种方式直接跳到调用函数,而无需查看堆栈跟踪以查找其编号。
为此,我希望能够根据堆栈帧的名称而不是编号跳转到堆栈帧。
这可以在 gdb 中完成吗?
【问题讨论】:
标签: gdb stack-trace
由于无限递归,我正在调试堆栈溢出。当堆栈深度为 700 次调用时,程序会失败。
我想跳到最初调用该函数的帧。但是,gdb 一次向我显示堆栈顶部的堆栈跟踪大约 20 个条目,我想知道是否可以以某种方式直接跳到调用函数,而无需查看堆栈跟踪以查找其编号。
为此,我希望能够根据堆栈帧的名称而不是编号跳转到堆栈帧。
这可以在 gdb 中完成吗?
【问题讨论】:
标签: gdb stack-trace
两种选择:
up 200 将为您带来 200 帧f[rame] <caller-func> - 这将跳转到地址为caller-func 的帧。请参阅手册中的Frame Selection。
【讨论】:
frame function <caller-function-name>,指的是函数的名称,而不是当前堆栈跟踪中的帧级别
您必须使用带有减号的bt。它类似于bt,但首先打印最外面的 n 帧。
例如:bt -100
您很可能会在第一个或第二个屏幕上看到需要检查的帧。
一旦使用bt -100 对堆栈跟踪进行了虫害,就可以帮助我轻松地修复带有大量递归调用的 pboblem。
然后发出命令f <here the number of your frame you need to inspect>
【讨论】: