使用调试器,如gdb
或者如果这不适用strace
工具以更好地了解段错误发生的位置。
如果您使用gcc
,请确保您使用-g
开关进行编译以包含调试信息。然后,gdb
将向您显示源代码中段错误的确切位置。
例如,如果我们有这种明显的segfaulty程序:
new.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
我们与gcc -g new.c -o new
编译它,然后运行gdb
会议与gdb new
:
我们在交互式会话中发出run
命令,其他则清除:
(gdb) run
Starting program: /home/Tibor/so/new
[New Thread 9596.0x16a0]
[New Thread 9596.0x1de4]
Program received signal SIGSEGV, Segmentation fault.
0x0040118a in main() at new.c:6
6 printf("%d", *i);
(gdb)
正如DasMoeh和netcoder指出的那样,当发生段错误时,可以在交互式会话中使用backtrace
命令来打印调用栈。这可以帮助进一步确定段错误的位置。
第一段错误啊?我可以向你保证它不会是最后一个。 ;-) – netcoder 2012-07-11 19:45:23