core文件的生成和调试

点击量:482

上一篇文章匆忙地记录了一次分析core文件报错的过程,今天则花点时间来认真总结下Linux下core文件的开启,生成,调试,以及堆栈定位。

一、什么是core文件?
进程在运行时可能会因为各种各样的原因(后面会细说)崩溃,而在崩溃前的一瞬间操作系统会像拍照片一样生成一个core文件,这个文件记录了程序运行时的状态,主要包括内存信息,堆栈指针,寄存器状态等,生成core文件的这一过程俗称为coredump。开发人员可以通过对core文件的分析来排查,定位问题,找到程序崩溃的原因。

二、core文件设置

a).如何开启

这条命令输出的是允许生产core文件的最大size,如果是0则表示你没有开启coredump,如果是unlimited则表示不限制大小。所以如果要开启coredump,只需要输入:

其中,unlimited可以换成具体的数字,比如1024(单位是KB)。

b).文件名及目录
默认设置下,
1.core文件是这么命名的:core.xxxx,xxxx表示进程号pid
2.core文件的目录和进程的运行目录一致
如果要修改默认设置的话,可以编辑文件/proc/sys/kernel/core_pattern,该文件的缺省值是core。可以像这样修改路径及文件名:echo ‘/var/log/%e.core.%p’ > /proc/sys/kernel/core_pattern,其中:
%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名
而/proc/sys/kernel/core_uses_pid则用来配置是否使用进程号作为core文件的扩展名(0或者1)。

c).怎么判断文件是不是core文件?
core文件是一种ELF文件(文件中除了包含机器码以外还存储了一些额外信息,比如符号表,加载地址等),可以通过以下命令来查看该文件的头文件信息(-h),可以看到type字段的值是CORE。

d).为什么没有生成core文件?
总的来说有这几个原因:
1.输出目录没有写入的权限
2.文件太大或者磁盘空间不足

三、有哪些原因会导致coredump?
1.内存访问越界,也就是说你访问了没有分配给你的内存,常见的有数组越界
2.指针使用不当,比如使用了空指针,或者指针转换错误
3.栈溢出,常见的像网络读包时缓冲区溢出
4.多线程读写数据未加锁保护
5.多线程程序使用了线程不安全的函数

四、如何生成一个core文件?
按照之前提到的coredump的原因分析,可以很容易的写出如下C代码以生成core文件:

编译:

运行:

结果出现了段错误,于是core dump了。

五、如何用GDB调试?

这里要注意两点:
1.进入gdb之后,输入bt或者where来定位堆栈
2.gdb第二个参数一定要指定当时出core的那个可执行文件,否则会导致缺少符号表而无法调试出堆栈,就像下面这样:

参考:
如何查询和修改Linux操作系统生成core dump文件的默认路径
详解coredump
什么是ELF文件

发表评论

电子邮件地址不会被公开。 必填项已用*标注