如何根据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>

+0

太棒了。一直在寻找一种方法来做到这一点。令人困惑的是,“框架”不支持这种表示法,但“bt”的确如此。 – Marenz 2014-01-31 17:09:49