【问题标题】:gdb bt gives only ??, how can I debug?gdb bt 只给出??,我该如何调试?
【发布时间】:2019-04-26 18:30:51
【问题描述】:

/var/log/message:

segfault at 0 ip 00007fcd16e5853a sp 00007ffd98e37e58 error 4 in libc-2.24.so[7fcd16dc9000+195000]

addr2line -e a.out 00007fcd16e5853a

??:0

gdb bt

Program terminated with signal SIGSEGV, Segmentation fault.
#0  0x00007fcd16e5853a in ?? ()
(gdb) bt
#0  0x00007fcd16e5853a in ?? ()
#1  0x000055f2f45fe95b in ?? ()
#2  0x000055f200000080 in ?? ()
#3  0x00007fcd068c2040 in ?? ()
#4  0x000055f2f6109c48 in ?? ()
#5  0x0000000000000000 in ?? ()

使用gcc -Wall -O0 -g构建

如何调试,还有更多方法吗?

【问题讨论】:

  • 堆栈损坏?使用例如Valgrind 或类似帮助您找到问题?
  • 你链接-g吗? gdb 说 debuginfo 已经加载了吗?
  • 哦,一旦您构建了程序,您就不会删除调试信息?
  • @Someprogrammerdude 不,我没有剥离,不知道为什么,如果我使用 valgrind 运行它,它太慢了,所以这个错误就不会出现。
  • @MaximEgorushkin 是,与 -g 链接并安装了 debuginfo

标签: c debugging gcc segmentation-fault gdb


【解决方案1】:

gdb bt

这肯定是不是你实际执行的命令。

你很可能做了这样的事情:

gdb /path/to/core
(gdb) bt

不要这样做。改为这样做:

gdb /path/to/a.out /path/to/core
(gdb) bt

如果您已经正确调用 GDB,bt 不起作用的其他可能原因:

  1. 您正在另一台机器上分析core,而不是生成它的机器。见this answer
  2. 您使用不同的标志重建了a.out。使用崩溃的 exact 二进制文件。
  3. 您在内核生成后更新了libc。将其恢复到核心生成时的最新版本。

附:这个命令

addr2line -e a.out 00007fcd16e5853a

没有意义:错误消息告诉您地址00007fcd16e5853alibc-2.24.so 中。 a.out 与该地址无关

你要使用的命令是:

addr2line -fe /path/to/libc-2.24.so 195000

附言

segfault at 0 ip 00007fcd16e5853a ...

这意味着:NULLlibc 内取消引用。最可能的原因:不检查错误返回,例如类似:

FILE *fp = fopen("/some/file", "r");
fscanf(fp, buffer, sizeof(buffer));  // Oops: didn't check for NULL.

【讨论】:

  • 谢谢,gdb 部分是正确的,我只是简化了。我会检查 libc 部分 NULL 检查
猜你喜欢
  • 2011-01-07
  • 1970-01-01
  • 1970-01-01
  • 2012-05-07
  • 1970-01-01
  • 2021-11-02
  • 2017-01-30
  • 2019-09-30
  • 1970-01-01
相关资源
最近更新 更多