1.什么是段错误?
所谓的段错误就是指访问的内存超出了系统所给这个程序的内存空间,通常这个值是由gdtr来保存的,他是一个48位的寄存器,其中的32位是保存由它指向的gdt表,后13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了。
通过上面的解释,段错误应该就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的。
2.那什么操作会引起段错误呢?
粗略的分一下类:
1)往受到系统保护的内存地址写数据
有些内存是内核占用的或者是其他程序正在使用,为了保证系统正常工作,所以会受到系统的保护,而不能任意访问。
2)内存越界(数组越界,变量类型不一致等)
3)其他
例如:
<1>定义了指针后记得初始化,在使用的时候记得判断是否为NULL
<2>在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等
<3>在变量处理的时候变量的格式控制是否合理等
3.那么我们如何去发现程序中的段错误呢?
通过学习前人的经验和开发的工具,不断的尝试和研究,找出更恰当的方法来避免、发现并处理它。对于一些常见的地方,我们可以避免,对于一些“隐藏”的地方,我们要发现它,发现以后就要及时处理,避免留下隐患。
用gdb来调试,在运行到段错误的地方,会自动停下来并显示出错的行和行号,gdb也是最常用的,如果需要用gdb调试,记得在编译的时候加上-g参数。
分享到:
相关推荐
最近在Linux环境下做C语言项目,由于是在一个原有项目基础之上进行二次开发,而且项目工程庞大复杂,出现了不少问题,其中遇到最多、花费时间最长的问题就是著名的“段错误”(Segmentation Fault)。借此机会系统...
移植qt应用程序时 会出现段错误 主要介绍怎么解决该错误
嵌入式开发中有时候代码量庞大,需要进行错误地点定位,我自己写了一个段错误定位的实例,目前只能将错误定位到调用函数级别,不过相信把发生错误的函数找到了,离找到错误的原因也不远了。
linux中利用tacktrace信息解决段错误
此文档将可能出现的Linux下的段错误产生的原因及调试方法罗列详尽
段错误的调试,通过4种方法来解决编程过程中出现的段错误
段错误解决方法,Qt做多语言翻译时容易出现段错误,这是查找问题的一个方法。如遇其他问题可交流。
linux c段错误处理
段错误是很常见的,一般是什么问题引起呢?文档里面有详细总结。
背景最近一段时间在linux下用C做一些学习和开发,但是由于经验足,问题多多。而段错误就是让我非常头痛的一个问题。过,目前写一个一千左右的代码,也很少出现段错误
Linux pthread相关函数用法说明(包括发生段错误的原因以及对策等)
详解段错误的定义及列举最常用的调试方法
分析了linux程序员常遇到的死锁和段错误问题,从出现的原因到调试方法进行详细介绍。
Linux下的段错误Segmentationfault产生的原因及调试方法经典.pdf
主要是是描写遇到的段错误,并提供解决方法
关于溢出和段错误的笔记,自己写的,仅供参考。
里面整理了,我收集的c语言段错误分析的文章,和core调试方法
Linux环境下段错误的产生原因及调试总结文档,亲身经历
C语言段错误 总结 段错误整理 C语言段错误 总结 段错误整理