/var/日志/消息:
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
构建
如何调试这个,还有更多的方法吗?
最佳答案
gdb bt
当然这不是您实际执行的命令。
很可能你做了这样的事情:
gdb /path/to/core
(gdb) bt
不要那样做。改为这样做:
gdb /path/to/a.out /path/to/core
(gdb) bt
如果您已经正确地调用了 GDB,那么 bt
不起作用的其他可能原因:
- 您在与生成它的机器不同的机器上分析
核心
。参见 this answer . - 你用不同的标志重建了
a.out
。使用崩溃的确切二进制文件。 - 您在核心生成后更新了
libc
。将其恢复到生成核心时的最新版本。
附言这个命令
addr2line -e a.out 00007fcd16e5853a
没有意义:错误消息告诉您地址 00007fcd16e5853a
在 libc-2.24.so
中。 a.out
与该地址没有关系。
您要使用的命令是:
addr2line -fe /path/to/libc-2.24.so 195000
附言
segfault at 0 ip 00007fcd16e5853a ...
这意味着:NULL
指针在 libc
中取消引用。最可能的原因:没有检查错误返回,例如像这样的东西:
FILE *fp = fopen("/some/file", "r");
fscanf(fp, buffer, sizeof(buffer)); // Oops: didn't check for NULL.
关于c - gdb bt 只给出??,我该如何调试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53458636/