“哎,段错误!”我仿佛看到了这个句话背后程序员的那张苦瓜脸。段错误对于一个程序员是一个熟悉不能再熟悉的名词,对于有经验的程序员对这个词那是既爱又恨,爱的是:还好出现了段错误,非常好找原因的(那是他有几种能找段错误的方法,已经熟透了),恨的是:怎么总是出现段错误(看的都想吐了)。而对于经验不足的程序员来说,段错误就是一个刺猬,你想吃他根本无从下嘴,只可远观而不可亵玩焉。针对这种情况云巢科技在最底层公共库模块添加了一套专治段错误的模块,先拔掉你的刺,在考虑怎么吃掉你。
1. 段错误是什么
一句话来说,段错误是指访问的内存超出了系统给这个程序设定的内存空间,例如访问了不存在的内存地址、访问了系统保护的内存地址、访问了只读的内存地址等等情况。
2. 段错误产生的原因
1> 访问不存在的内存地址。
2> 访问系统保护的内存地址。
3> 访问只读的内存地址。
4> 栈溢出,等等其他原因。
3. 段错误的调试方法
1> 传说中printf大法,这个看似最简单但往往很多情况下十分有效的调试方式,也许可以说是程序员使用最多的调试方式。但是涉及到大的项目开发和源码数量超多,使用printf大法就不能快速的去定位问题的所在,你根本就不知道在哪去加printf打印。
2> 使用GDB调试
对于新手的程序员来说,GDB还有很大一部分人不会使用,如果要使用GDB,还要去从新学习GDB的命令和操作,有时候会浪费一些时间。
3> 云巢开发的智能自动检测段错误模块
没有复杂的操作,没有猜代码的痛苦,只需要调用一个简单的初始化函数接口,就能智能的自动检测出程序产生的段错误的位置,定位精准,老少皆宜。
4. 云巢科技智能检测段错误模块
1> 基本原理:
通过捕捉系统中产生的段错误信号,将段错误信息打印到生成的文件中。
2> 产生段错误的信号:
1)SIGQUIT 2)SIGILL 3)SIGABRT 4)SIGFPE 5)SIGSEGV 6)SIGBUS 7)SIGSYS 8)SIGTRAP 9)SIGXCPU 10)SIGXFSZ 11)SIGIOT
我们看到SIGSEGV在其中,一般数组越界或是访问空指针都会产生这个信号。云巢开发的检测段错误模块,能够完美的捕捉以上列出的产生段错误的信号,并将产生段错误信号的行进行准确的定位。拔掉他身上的刺,为公司的研发人员提供极大方便,提升了工作的效率。其实段错误并不可怕,可怕是没有一种好的调试段错误的方法。云巢正是看到了这个方面,开发出智能检测段错误模块。
5. 开发当中应当注意的事项,避免产生段错误
1、出现段错误时,首先应该想到段错误的定义,从它出发考虑引发错误的原因。
2、在使用指针时,定义了指针后记得初始化指针,在使用的时候记得判断是否为NULL。
3、在使用数组时,注意数组是否被初始化,数组下标是否越界,数组元素是否存在等。
4、在访问变量时,注意变量所占地址空间是否已经被程序释放掉。
5、在处理变量时,注意变量的格式控制是否合理等。