【问题标题】:How can I jump to a frame in a stack trace according to the function name in gdb?如何根据 gdb 中的函数名跳转到堆栈跟踪中的帧?
【发布时间】:2011-04-16 18:52:50
【问题描述】:

由于无限递归,我正在调试堆栈溢出。当堆栈深度为 700 次调用时,程序会失败。

我想跳到最初调用该函数的帧。但是,gdb 一次向我显示堆栈顶部的堆栈跟踪大约 20 个条目,我想知道是否可以以某种方式直接跳到调用函数,而无需查看堆栈跟踪以查找其编号。

为此,我希望能够根据堆栈帧的名称而不是编号跳转到堆栈帧。

这可以在 gdb 中完成吗?

【问题讨论】:

    标签: gdb stack-trace


    【解决方案1】:

    两种选择:

    • up 200 将为您带来 200 帧
    • 如果您知道递归例程的初始调用者,您可以执行f[rame] <caller-func> - 这将跳转到地址为caller-func 的帧。

    请参阅手册中的Frame Selection

    【讨论】:

    • 注意,正如链接中提到的,您也可以使用frame function <caller-function-name>,指的是函数的名称,而不是当前堆栈跟踪中的帧级别
    【解决方案2】:

    您必须使用带有减号的bt。它类似于bt,但首先打印最外面的 n 帧。
    例如:
    bt -100

    您很可能会在第一个或第二个屏幕上看到需要检查的帧。
    一旦使用bt -100 对堆栈跟踪进行了虫害,就可以帮助我轻松地修复带有大量递归调用的 pboblem。

    然后发出命令
    f <here the number of your frame you need to inspect>

    【讨论】:

    • 太棒了。一直在寻找一种方法来做到这一点。令人困惑的是,“frame”始终不支持这种表示法,但“bt”却支持。
    猜你喜欢
    • 2020-07-06
    • 1970-01-01
    • 2017-04-01
    • 2011-01-03
    • 2018-07-13
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多