在我们运行程序的时候,经常会遇到Segmentation fault (core dumped)的问题,这种问题多见于内存操作不当,比如空指针、野指针的读写操作,数组越界访问,常量被破坏等。对于一个比较大的程序,比较难定位错误具体的位置,因此我们需要利用core文件进行错误的查找。
1、对core文件扩容
我们使用以下的命令查找core的大小信息:
$ ulimit -a
一般来说,core的默认大小都是0,无法保存程序的错误信息,我们用以下的命令进行扩充:
$ ulimit -c 1024
$ ulimit -c unlimited
第一行将core的大小扩展至1024字节,当然我们写一个稍微大一点的程序就不够用了,一般生成的core大小基本等于程序运行中占用的内存大小,因此用第二行的命令更合适。
2、遇到的问题
一般情况上面的命令可以更正core文件的限制大小,然而有时会报如下的错:
-bash: ulimit: core file size: cannot modify limit: Operation not permitted
一般这类问题我们考虑权限的原因,然而这次我们不是通过加sudo解决,我们需要打开/etc/security/limits.conf文件,然后添加如下内容:
你的用户名 hard core unlimited
你的用户名 soft core unlimited
你的用户名是命令行里@前面的那个,保存后执行
$ ulimit -c unlimited
就可以解决问题了。更改前后如图所示,第一行最后表示core的限制大小。
3、查找具体问题
具体问题在倒数第五行,搜一下这个问题发现是无效的内存引用,知道了问题具体是什么就比较容易定位以及解决问题了。