使用gdb检查调用者帧

时间:2017-11-30 09:49:59

标签: c debugging gcc gdb coredump

假设我有:

#include <stdlib.h>

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

编译:

 gcc -g c.c

运行这个,我会得到一个coredump(由于SIGABRT引发的abort()),我可以调试它:

gdb a.out core

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

这是通过转移到感兴趣的框架来专门获取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