c - gdb bt 只给出??,我该如何调试?

标签 c debugging gcc segmentation-fault gdb

/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 不起作用的其他可能原因:

  1. 您在与生成它的机器不同的机器上分析核心。参见 this answer .
  2. 你用不同的标志重建了a.out。使用崩溃的确切二进制文件。
  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 ...

这意味着: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/

相关文章:

c - 我如何将确定数量的字符与另一个字符串连接起来?

.net - 调试混淆的 .Net 程序集

c++ - 调试器在尝试跳出 C++11 std lib 时更深入

c - 使用 OpenCV 数据结构时堆损坏

c++ - 需要帮助解决编译器错误 : error: invalid conversion from ‘int’ to ‘GIOCondition’

c - 警报处理程序中 swapcontext 后的段错误

windows - 带有自定义链接的 OCaml 编译是否应该在 Windows 中工作(通过 MinGW)?

c - 汇编错误: "operand type mismatch for ` rol'"with multiple input operands

c - 在 C 中生成离散均匀分布

node.js - 堆栈跟踪 Nodejs REST API 错误