2012-07-11 53 views
4

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

P.s.我在想这个错误来自解引用NULL指针或使用未初始化的指针。但是,我肯定是错的。

+4

第一段错误啊?我可以向你保证它不会是最后一个。 ;-) – netcoder 2012-07-11 19:45:23

回答

12

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

如果您使用gcc,请确保您使用-g开关进行编译以包含调试信息。然后,gdb将向您显示源代码中段错误的确切位置。

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

new.c

#include <stdio.h> 

int main() 
{ 
     int *i = 0x478734; 
     printf("%d", *i); 
} 

我们与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) 

正如DasMoeh和netcoder指出的那样,当发生段错误时,可以在交互式会话中使用backtrace命令来打印调用栈。这可以帮助进一步确定段错误的位置。

+0

非常感谢。这应该有助于这个过程不会变得如此mindnumbing :)我会尽快接受你的答案:) – TZPike05 2012-07-11 19:01:20

+0

可悲的是你没有提到'backtrace',但无论如何+1。 – netcoder 2012-07-11 22:34:09

+0

@netcoder在那里,修复它。 – Tibor 2012-07-11 22:39:02

5

最简单的方法是使用valgrind。它将指出无效访问发生的位置(以及其他导致崩溃但仍然无效的问题)。当然,真正的问题可能在代码中的其他地方(例如:无效指针),所以下一步是检查源代码,如果仍然困惑,请使用调试器。

+0

+1 valgrind *非常有用,但没有调试标志就没有多少。 – netcoder 2012-07-11 22:32:14