找到分段错误的最简单方法

TZP*_*e05 8 c linux segmentation-fault

我今天遇到了第一个分段错误(新手程序员).在阅读了什么是分段错误之后(感谢本网站上的所有有用信息,以及维基百科的冗长解释),我正在尝试确定最简单的方法来找到我的错误发生的地方.它是用C语言编写的,并且在基于*NIX的系统上出现错误(我不确定哪一个是诚实的...... 99%确定它是Linux).我无法准确发布我的代码,因为我有很多我正在编译的文件都很冗长.我只是希望你们观察到一些最佳实践.谢谢你的帮助.

Ps我认为错误来自解除引用NULL指针或使用未初始化的指针.但是,我肯定是错的.

小智 16

使用调试器,例如,gdb如果这不适用,则可以使用strace工具更好地了解段错误发生的位置.

如果使用gcc,请确保使用-gswitch 编译以包含调试信息.然后,gdb将显示源代码中segfaults的确切位置.

例如,如果我们有这个明显的segfaulty程序:

new.c

#include <stdio.h>

int main()
{
        int *i = 0x478734;
        printf("%d", *i);
}
Run Code Online (Sandbox Code Playgroud)

我们用它编译它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)
Run Code Online (Sandbox Code Playgroud)

正如DasMoeh和netcoder所指出的,当发生segfault时,您可以backtrace在交互式会话中使用该命令来打印调用堆栈.这有助于进一步查明段错误的位置.


Kar*_*ath 5

最简单的方法是使用valgrind.它将精确定位到无效访问发生的位置(以及其他不会导致崩溃但仍然无效的问题).当然,真正的问题可能是代码中的其他地方(例如:无效指针),因此下一步是检查源,如果仍然混淆,请使用调试器.