我正在嘗試使用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,我能夠成功查看堆棧跟蹤。 –