Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/60.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 定位分段故障的最简单方法_C_Linux_Segmentation Fault - Fatal编程技术网

C 定位分段故障的最简单方法

C 定位分段故障的最简单方法,c,linux,segmentation-fault,C,Linux,Segmentation Fault,今天我遇到了我的第一个分段错误(新手程序员)。在阅读了什么是分段错误之后(感谢本网站上所有有用的信息,以及维基百科冗长的解释),我试图确定最简单的方法来找出我的错误发生的地方。它是用C编写的,错误发生在基于*NIX的系统上(我不确定是哪一个,99%确定是Linux)。我不能准确地发布我的代码,因为我有许多我正在编译的文件,它们都相当长。我只是希望你们都能看到一些最佳实践。谢谢你的帮助 另外,我认为错误来自取消引用空指针或使用未初始化指针。但是,我肯定是错的。使用调试器,例如gdb,或者如果这不适

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


另外,我认为错误来自取消引用空指针或使用未初始化指针。但是,我肯定是错的。

使用调试器,例如
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)