我正在尝试使用GDB排查我正在编写的代码中的段错误。当我使用backtrace
命令时,GDB不显示行号或函数名称。下面是说明我的问题很短的示例程序:为什么GDB不显示行号或函数名称?
void segfault(int *b) {
// This causes a segfault on CentOS7 Intel 64-bit
b[-1] = 5;
}
void main() {
int a[10];
segfault(a);
}
然而,当我与
gcc -ggdb -O0 test.c -o segfaulttest
编译和使用gdb segfaulttest
来运行它,当我使用gdb的回溯命令我没有得到任何行号或功能名称。我期望它在跟踪中列出main()
和segfault()
。
样本输出
Reading symbols from /home/user/test/segfaulttest...done.
(gdb) run
Starting program: /home/user/test/segfaulttest
Program received signal SIGSEGV, Segmentation fault.
0x000000050040051c in ??()
(gdb) bt
#0 0x000000050040051c in ??()
#1 0x0000000000000000 in ??()
(gdb)
我使用:
- CentOS的7(64位)
- GCC:
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
- GDB是
gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-4)
(除了:我修正了实际情况错误在我的代码中,我只是不明白为什么gdb backtrace没有显示更多信息)。
感谢您的快速,可以理解的答案。我尝试将segfault()更改为:void segfault(){raise(SIGSEGV); }'并再次运行gdb,我能够成功查看堆栈跟踪。 –