如何根据gdb中的函数名称跳转到堆栈跟踪中的帧?
问题描述:
我正在调试由于无限递归导致的堆栈溢出。当堆栈调用700次深度时,程序失败。如何根据gdb中的函数名称跳转到堆栈跟踪中的帧?
我想跳转到最初调用函数的框架。但是,gdb向我展示了堆栈顶部的堆栈跟踪,每次大约有20个条目,我想知道如果不查看堆栈跟踪以找到其号码,我是否可以直接跳到调用函数。
为此,我希望能够根据名称而不是号码跳转到堆栈帧。
这可以在gdb中完成吗?
答
两个选项:
-
up 200
会为你带来了200幅 - 如果您知道递归过程的初始调用者,你可以做
f[rame] <caller-func>
- 这将跳转到地址caller-func
的框架。
参见手册中的Frame Selection。
答
您必须使用bt
并减号。它与bt
类似,但首先打印最外面的n个帧。
例如:bt -100
,很可能你会发现你需要在第一或第二屏幕上检查框。
一旦使用bt -100
检测到堆栈跟踪,就可以帮助我轻松地修复具有大量递归调用的问题。
,然后发出命令f <here the number of your frame you need to inspect>
太棒了。一直在寻找一种方法来做到这一点。令人困惑的是,“框架”不支持这种表示法,但“bt”的确如此。 – Marenz 2014-01-31 17:09:49