linux段错误后重启进程,Linux下段错误-Segmentation Fault

1、段错误的定义

段错误:访问的内存超出了系统给这个程序的内存空间,通常这个值是由gdtr来保存的,gdtr是一个48位的寄存 器,其中的32位是保存由它指向的 gdt表,中间13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的 表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了 越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了。

通过上面的解释,段错误就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的。

2、段错误是如何产生的?

Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的。

1)代码1:

#include

int main(){

int i = 0;

scanf ("%d", i);   //应该使用&i,否则产生段错误,因为访问了保护地址0

printf ("%d\n", i);

return 0;

}

2)代码2:

#include

int main(){

char *p;

p = NULL;

*p = 'x';      //往内存地址0处写东西,所以会产生段错误

printf("%c", *p);

return 0;

}

3)代码3:

#include

int main(){

char test[1];

printf("%c", test[1000000000]);    //数组越界,或者这个地址根本不存在

return 0;

}

4)代码4:

#include

int main(){

int b = 10;

printf("%s\n", b);

//在打印字符串的时候,实际上是打印某个地址开始的所有字符,但是当你想把整数当字符串打印的时候,这个整数被当成了一个地址,然后printf从这个地址开始去打印字符,直到某个位置上的值为\0。所以,如果这个整数代表的地址不存在或者不可访问,自然也是访问了不该访问的内存——segmentation fault。

return 0;

}

5)代码5:

#include

#include

char c = 'c';

int i = 10;

char buf[100];

printf("%s", c);

出现段错误的原因:试图把char型按照字符串格式输出,这里的字符会解释成整数,再解释成地址,所以原因同上面那个例子printf("%s", i),试图把int型按照字符串输出。

memset(buf, 0, 100);

sprintf(buf, "%s", c);

试图把char型按照字符串格式转换。

memset(buf, 0, 100);

sprintf(buf, "%s", i);

试图把int型按照字符串转换。

6)代码6:

我在进行一个多线程编程的例子里头,定义了一个线程数组

#define THREAD_MAX_NUM

pthread_t thread[THREAD_MAX_NUM];

用pthread_create创建了各个线程,然后用pthread_join来等待线程的结束。

刚开始我就直接等待,在创建线程都成功的时候,pthread_join能够顺利等待各个线程结束,但是一旦创建线程失败,用pthread_join等待那个本不存在的线程时,自然会存在访问不能访问的内存的情况,从而导致段错误。

解决办法为:在创建线程之前,先初始化我们的线程数组,在等待线程的结束的时候,判断线程是否为我们的初始值。如果是的话,说明我们的线程并没有创建成功,所以就不能等,否则就会存在释放那些并不存在或者不可访问的内存空间。

3、怎样避免段错误?

1)定义了指针后记得初始化,在使用的时候记得判断是否为NULL。

2)在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等。

3)在变量处理的时候变量的格式控制是否合理等。

4、怎样发现程序的段错误?

常用的调试方法有:

1)在程序内部的关键位置输出(printf)信息,那样可以跟踪段错误在代码中可能的位置。为了方便使用这种调试方法,可以用条件编译指令#ifdef DEBUG和#endif把printf函数给包含起来,编译的时候加上-DDEBUG参数就可以查看调试信息。反之,不加上该参数进行调试就可以。

2)用gdb来调试,在运行到段错误的地方,会自动停下来并显示出错的行和行号。这个应该是很常用的,如果需要用gdb调试,记得在编译的时候加上-g参数,用来显示调试信息。

3)使用catchsegv命令:通过查看帮助信息,可以看到Catch segmentation faults in programs

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【优质项目推荐】 1、项目代码均经过严格本地测试,运行OK,确保功能稳定后才上传平台。可放心下载并立即投入使用,若遇到任何使用问题,随时欢迎私信反馈与沟通,博主会第一时间回复。 2、项目适用于计算机相关专业(如计科、信息安全、数据科学、人工智能、通信、物联网、自动化、电子信息等)的在校学生、专业教师,或企业员工,小白入门等都适用。 3、该项目不仅具有很高的学习借鉴价值,对于初学者来说,也是入门进阶的绝佳选择;当然也可以直接用于 毕设、课设、期末大作业或项目初期立项演示等。 3、开放创新:如果您有一定基础,且热爱探索钻研,可以在此代码基础上二次开发,进行修改、扩展,创造出属于自己的独特应用。 欢迎下载使用优质资源!欢迎借鉴使用,并欢迎学习交流,共同探索编程的无穷魅力! 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip 基于业务逻辑生成特征变量python实现源码+数据集+超详细注释.zip
提供的源码资源涵盖了安卓应用、小程序、Python应用和Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值