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

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

附:我认为错误来自取消引用NULL指针或使用未初始化的指针.但是,我肯定是错的.

解决方法

使用调试器,例如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 new运行gdb会话:

我们在交互式会话中发出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所指出的,当发生segfault时,您可以在交互式会话中使用backtrace命令来打印调用堆栈.这有助于进一步查明段错误的位置.

相关文章

/** C+⬑ * 默认成员函数 原来C++类中,有6个默认成员函数: 构造函数 析构函数 拷贝...
#pragma once // 1. 设计一个不能被拷贝的类/* 解析:拷贝只会放生在两个场景中:拷贝构造函数以及赋值运...
C类型转换 C语言:显式和隐式类型转换 隐式类型转化:编译器在编译阶段自动进行,能转就转,不能转就编译...
//异常的概念/*抛出异常后必须要捕获,否则终止程序(到最外层后会交给main管理,main的行为就是终止) try...
#pragma once /*Smart pointer 智能指针;灵巧指针 智能指针三大件//1.RAII//2.像指针一样使用//3.拷贝问...
目录&lt;future&gt;future模板类成员函数:promise类promise的使用例程:packaged_task模板类例程...