gdb bt仅给出??,如何调试?

时间:2018-11-24 13:30:06

标签: c debugging gcc segmentation-fault gdb

/ 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

构建

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

1 个答案:

答案 0 :(得分:1)

  

gdb bt

当然不是您实际执行的命令。

您很有可能做了这样的事情:

gdb /path/to/core
(gdb) bt

不要做 。改为这样做:

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

如果您已经正确调用了GDB,则bt无法正常工作的其他可能原因:

  1. 您正在与生产core的另一台机器上分析a.out。参见this answer
  2. 您用不同的标志重建了libc。使用崩溃的 exact 二进制文件。
  3. 生成核心后,您已经更新了addr2line -e a.out 00007fcd16e5853a。将其还原到生产内核时的最新版本。

P.S。该命令

  

00007fcd16e5853a

没有任何意义:错误消息告诉您地址libc-2.24.soa.out中。 addr2line -fe /path/to/libc-2.24.so 195000 与该地址没有任何关系。

您要使用的命令是:

segfault at 0 ip 00007fcd16e5853a ...

P.P.S。

  

NULL

这意味着:libc中的FILE *fp = fopen("/some/file", "r"); fscanf(fp, buffer, sizeof(buffer)); // Oops: didn't check for NULL. 指针取消引用。最可能的原因:不检查错误返回,例如像这样:

loop_count = 1
for i in range(mystery_int):
    for x in range(1,mystery_int):
        print(x*loop_count, end=" ")
    print (loop_count)
    loop_count+=1