使用调试器,gdb
或者如果这不适用,则使用strace
工具来更好地了解段错误发生的位置。
如果使用gcc
,请确保使用-g
switch 进行编译以包含调试信息。然后,gdb
将在源代码中显示段错误的确切位置。
例如,如果我们有这个明显的段错误程序:
新的.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
我们编译它,gcc -g new.c -o new
然后运行gdb
会话gdb new
:
我们在交互式会话中发出run
命令,else 很清楚:
(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
交互式会话中的命令来打印调用堆栈。这可以帮助进一步查明段错误的位置。