一、情况描述
在已经使用ulimit - c unlimited 打开了core文件的基础上,运行程序产生了段错误。使用ls命令查看当前目录下的文件,还是没看见任何和.core相关的文件。如下:
首先已经打开了段错误存储的设置:
ulimit -c unlimited

然后确认已经打开:
ulimit -c
确实是unlimited:

运行程序产生段错误:

查看文件发现没有core文件:

查看相关设置:
$ cat /proc/sys/kernel/core_pattern
发现结果被 | 管道文件符吞了:

二、解决方法
经过查阅资料:
原来 设置为|/usr/share/apport/apport %p %s %c %P的话,文件的结果会被Linux的一个进程apport 吞掉,拿去检查是不是系统的bug,所以看不到core文件了。
|/usr/share/apport/apport %p %s %c %P
如果想产生core文件,需要关闭这个进程:
sudo service apport stop
然后查看相关内容:
cat /proc/sys/kernel/core_pattern
结果变为core:

然后在编译文件的时候需要加入 -g 来产生Debug的版本:
g++ client.cpp -o client -g
然后产生段错误就会产生core文件了:

然后就可以使用命令:
gdb ./clinet core
进行调试啦!
参考文献:

本文讲述了在ulimit设置core文件无限大后,程序发生段错误但未见core文件的情况。通过分析发现core_pattern设置问题导致文件被apport进程吞噬。解决方法包括停止apport服务,修改core_pattern设置为`core`,并加入-g选项生成Debug版本。最终,通过gdb进行调试。
2051





