使用 gdb 检查调用者帧

Posted

技术标签:

【中文标题】使用 gdb 检查调用者帧【英文标题】:Inspecting caller frames with gdb 【发布时间】:2017-11-30 09:49:59 【问题描述】:

假设我有:

#include <stdlib.h>

int main()

    int a = 2, b = 3;
    if (a!=b)
        abort();

编译:

 gcc -g c.c

运行这个,我会得到一个核心转储(由于abort() 提出的SIGABRT),我可以使用它进行调试:

gdb a.out core

如何让gdb 在此上下文中打印ab 的值?

【问题讨论】:

【参考方案1】:

这是另一种专门获取ab 值的方法,方法是移至感兴趣的框架,然后info locals 将为您提供值。 a.out 是用你的代码编译的。 (第 2 帧是您感兴趣的内容,即main())。

$ gdb ./a.out core
[ removed some not-so-interesting info here ]
Reading symbols from ./a.out...done.
[New LWP 14732]
Core was generated by `./a.out'.
Program terminated with signal SIGABRT, Aborted.
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
51      ../sysdeps/unix/sysv/linux/raise.c: No such file or directory.
(gdb) bt
#0  __GI_raise (sig=sig@entry=6) at ../sysdeps/unix/sysv/linux/raise.c:51
#1  0x00007fac16269f5d in __GI_abort () at abort.c:90
#2  0x00005592862f266d in main () at f.c:7
(gdb) frame 2
#2  0x00005592862f266d in main () at f.c:7
7               abort();
(gdb) info locals
a = 2
b = 3
(gdb) q

您也可以在第 2 帧中使用 print

(gdb) print a
$1 = 2
(gdb) print b
$2 = 3

【讨论】:

谢谢。这就是我一直在寻找的。我会尝试更好地学习 gdb。【参考方案2】:

您是否使用调试符号-g 进行编译?命令应该是bt 用于回溯,您也可以使用bt full 进行完整回溯。

更多信息:https://sourceware.org/gdb/onlinedocs/gdb/Backtrace.html

【讨论】:

非常感谢! bt full 确实显示了价值!我会在接受之前稍等片刻,以防出现更细粒度的方法。

以上是关于使用 gdb 检查调用者帧的主要内容,如果未能解决你的问题,请参考以下文章

如何使用inspect从Python中的被调用者那里获取调用者的信息?

如何检查调用者是否设置了PowerShell可选参数

可以由调用者自定义的通用谓词?

写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者。

PYTHON 写函数,检查传入列表的长度,如果大于2,那么仅保留前两个长度的内容,并将新内容返回给调用者

PYTHON 写函数,检查获取传入列表或元组对象的所有奇数位索引对应的元素,并将其作为新列表返回给调用者