C 定位分段故障的最简单方法
今天我遇到了我的第一个分段错误(新手程序员)。在阅读了什么是分段错误之后(感谢本网站上所有有用的信息,以及维基百科冗长的解释),我试图确定最简单的方法来找出我的错误发生的地方。它是用C编写的,错误发生在基于*NIX的系统上(我不确定是哪一个,99%确定是Linux)。我不能准确地发布我的代码,因为我有许多我正在编译的文件,它们都相当长。我只是希望你们都能看到一些最佳实践。谢谢你的帮助C 定位分段故障的最简单方法,c,linux,segmentation-fault,C,Linux,Segmentation Fault,今天我遇到了我的第一个分段错误(新手程序员)。在阅读了什么是分段错误之后(感谢本网站上所有有用的信息,以及维基百科冗长的解释),我试图确定最简单的方法来找出我的错误发生的地方。它是用C编写的,错误发生在基于*NIX的系统上(我不确定是哪一个,99%确定是Linux)。我不能准确地发布我的代码,因为我有许多我正在编译的文件,它们都相当长。我只是希望你们都能看到一些最佳实践。谢谢你的帮助 另外,我认为错误来自取消引用空指针或使用未初始化指针。但是,我肯定是错的。使用调试器,例如gdb,或者如果这不适
另外,我认为错误来自取消引用空指针或使用未初始化指针。但是,我肯定是错的。使用调试器,例如
gdb
,或者如果这不适用,则使用strace
工具来更好地了解故障发生的位置
如果使用gcc
,请确保使用-g
开关编译以包含调试信息。然后,gdb
将向您显示源代码中发生故障的确切位置
例如,如果我们有一个明显的错误程序:
new.c
#include <stdio.h>
int main()
{
int *i = 0x478734;
printf("%d", *i);
}
正如DasMoeh和netcoder所指出的,当发生segfault时,您可以在交互式会话中使用该命令打印调用堆栈。这有助于进一步精确定位SEGFULT的位置。最简单的方法是使用
valgrind
。它将精确定位无效访问occours的位置(以及其他没有导致崩溃但仍然无效的问题)。当然,真正的问题可能是代码中的其他地方(例如:无效指针),因此下一步是检查源代码,如果仍然混淆,请使用调试器。+1 for Tibors答案
在更大的程序上,或者如果您使用其他库,它可能也很有用。请查看gdb的回溯:我为经过这里的人重新打开了这篇文章,因为我刚刚纠正了我使用gcc所犯的错误
你应该考虑使用标记<强> -FSAITiZe=地址,它有时可以高精度地突出你的StError。
非常感谢。这应该有助于这个过程不会变得如此麻木:)我会尽快接受你的答案:)遗憾的是,你没有提到回溯,但无论如何是+1。第一个错误是不是?我可以向你保证这不会是最后一次+1 valgrind非常有用,但是如果没有调试标志,则用处不大。(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)