c - 使用 gdb 检查调用者帧

标签 c debugging gcc gdb coredump

假设我有:

#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 的值?

最佳答案

这是另一种专门获取 a 的方法和 b通过移动到感兴趣的 frame 然后 info locals 来获取值会给你值(value)。 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

您还可以使用 print一旦第 2 帧:

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

关于c - 使用 gdb 检查调用者帧,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47570384/

相关文章:

c++ - GCC C++11 删除移动可分配类的复制分配会阻止 std::sort 编译?

c - 为什么声明一个长度为 INT_MAX 的 int 数组会产生段错误?

java - 我可以从 JNI 调用的 C 程序中调用 C 函数吗?

c - gcc C ***检测到堆栈粉碎***数组

c - 在 Windows x64 上调试 C 故障转储

c - 优化会改变强制转换的行为吗?

无法在新文本框中显示文本输入

c - K&R C 练习 1-18 无输出/调试问题

PHP - 调试要求

c++ - 如果 lt_dlopen 失败,如何获取更多信息?