参考链接-段错误的几种调试方式
段错误具体体现运行程序之后: 常常遇到这种情况,What???,啥原因也不说,你至少告诉我错哪了,我改还不行嘛!!!好像女人生气的感觉,反正你错了,至于错在哪,你自己好好想想,然后从出生开始想,到底哪里得罪眼前的女人(开发一个庞大的系统从main开始看)。
一句话解释段错误:访问了你不该访问的内存(好像是废话,=> 你做了不该做的事)
1. 堆上(new, molloc开辟的),只要还在合法的范围了是不会有任何错误。 2. 栈上(函数内,局部数组),会出现段错误。
段错误会出发SIGSEGV信号,SIGSEGV信号会产生错误信息生成core文件,默认情况下linux系统不会生成core文件的,可以通过ulimit -c 查看一下系统core文件的大小限制(默认为0),通过ulimit -c 1024修改core文件的大小限制,这样当程序core dump的时候可以产生core文件了,或者我们直接在执行程序之前ulimit -c unlimited指定core文件大小没有限制。
执行ulimit -c unlimited取消core文件大小限制编译程序Debug模式执行程序,生成core文件使用gdb调试,gdb a.out core注意在调试的过程中大部分都是进入库函数,可以用up命令进行跳出,最后定位发生段错误的地方,一般gdb调试使用的常用命令:
f:(补充:frame相当于函数调用的栈的一层)打印当前层栈的信息,栈的层编号,当前的函数名,函数参数值,函数所在文件及行号,函数执行到的语句up down :表示向栈的上面/下面移动n层,可以不打n,表示向上移动一层。info f : 打印当前层栈详细的信息,调用函数的地址,被调用函数的地址等info local :打印出当前函数中所有局部变量及其值info args: 打印出当前函数的参数名及其值p <表达式>: 输出表达式的值详细命令参考
