1. 什么是core dumped文件

简单讲,就是linux下的程序,在遇到空指针解引用、栈错误等原因崩溃时,bash会输出一条:
在这里插入图片描述
有时会是这样:
在这里插入图片描述
Segmentation fault后面跟的那个core dumped不见了,说明没有产生core dumped文件。
怎样人为制造一个Segmentation fault呢?最简单的办法就是解引用一个空指针:

int *p=0;
printf("%d",*p);

2. core dumped文件拿来干什么

就是拿来在程序崩溃时还原现场用的。
如果你看到core dumped字样,并且在目录下也找到了一个叫core的文件,那你可以直接用gdb定位到程序崩溃的位置了(注意用gcc编译时也要开-g选项才能用gdb调试):

$ gdb ./a.out core

在这里插入图片描述
gdb加载后已经跳到程序崩溃的位置了。就是在main.c的20行。

3. 我的Segmentation fault后面没有core dumped,怎么开?

先用ulimit -c,如果看到0,说明没有开core dump。
所以我们输入ulimit -c unlimited,打开core dump。
再次用ulimit -c,看到unlimited了,说明core dump打开了。
在这里插入图片描述
注意这句ulimit -c unlimited只对当前会话有效。要永久有效的话看这里
https://www.cnblogs.com/Anker/p/6079580.html

4.我的ulimit -c已经是unlimited了,怎么还是看不到core文件?

关键来了。首先输入命令

$ man 5 core

查看手册中的core内容,然后往下翻:
在这里插入图片描述
它这里面列举了几条不产生core文件的原因,你可以逐条对照。最有可能的原因是/proc/sys/kernel/core_pattern文件里面把你的core文件发送到别处去了。我的ubuntu系统默认就是这样干的。

然后打开/proc/sys/kernel/core_pattern文件,里面如果不是像下图里我的这个这样:
在这里插入图片描述
而是显示的/proc/什么什么的,就代表它把你的core文件发到别的地方去了。
编辑这个文件,把它内容换成和我的一样。在ubuntu系统上可以这样:

$ sudo gedit core_pattern

前面那个sudo是为了获取root权限,以编辑这个文件。把内容改成core,然后保存。
正常情况下你应该可以生成core文件了。

参考

https://stackoverflow.com/questions/2065912/core-dumped-but-core-file-is-not-in-the-current-directory
https://www.cnblogs.com/Anker/p/6079580.html

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐