我今天遇到了我的第一个段错误(新手程序员)。在阅读了段错误是什么之后(感谢本网站上所有有用的信息,以及维基百科的冗长解释),我正在尝试确定找到我的错误发生位置的最简单方法。它是用 C 语言编写的,错误发生在基于 *NIX 的系统上(老实说,我不确定是哪一个……99% 确定它是 Linux)。我不能准确地发布我的代码,因为我有很多我正在编译的文件,它们都很长。我只是希望你们都观察到一些最佳实践。感谢您的帮助。
附言我认为错误来自于取消引用 NULL 指针或使用未初始化的指针。但是,我肯定是错的。
最佳答案
使用调试器,例如 gdb
,或者如果这不适用,则使用 strace
工具来更好地了解段错误发生的位置。
如果您使用gcc
,请确保使用-g
开关进行编译以包含调试信息。然后,gdb
将向您显示它在源代码中发生段错误的确切位置。
例如,如果我们有这个明显的段错误程序:
new.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
我们用 gcc -g new.c -o new
编译它,然后用 gdb new
运行 gdb
session :
我们在交互式 session 中发出 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
命令在交互式 session 中打印调用堆栈。这有助于进一步查明段错误的位置。
关于c - 定位段错误的最简单方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11439467/