作为一个之前一直混迹于windows系统下的人来说,coredump是比较陌生的,那么到底什么是coredump呢?怎么样会产生core呢?程序出core后要如何调试呢?下面来简单介绍一下。
一、什么是coredump
当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个Core文件中,这种行为就叫做Core Dump(核心转储)。(这里的 core 就是沿用的是早期电脑磁芯内存中的表达,也能看出 Unix 系统 Core Dump 机制的悠久历史。)
二、coredump产生的原因
1、产生原因
当程序接收到如右表所示的一些unix信号时会产生core,如下表所示。(本质上说,coredump是信号处理的产物,是内核的行为)
2、Core Dump 如何产生?
(1)最简单的模拟出core方式
最简单的一种方式直接Ctrl+\ 来终止一个进程,会向进程发出 SIGQUIT 信号,默认是会产生core dump 的。如下图所示(注意:Ctrl+C 结束一个进程均不会产生 core dump,SIGINT 信号,该信号默认操作为终止进程)
(2)程序中可能导致出core的原因
(a) 内存访问越界
由于使用错误的下标,导致数组访问越界。
搜索字符串时,依靠字符串结束符来判断字符串是否结束,但是字符串没有正常的使用结束符。
使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函数,将目标字符串读/写爆。
(b)多线程程序使用了线程不安全的函数或读写的数据未加锁保护
(c) 非法指针
使用空指针。
随意使用指针转换。
(d)堆栈溢出(使用很大的局部变量)
三、linux Core文件介绍
1、core 文件打开和关闭
想要在linux系统中产生core文件,首先需要确认当前会话的ulimit –c若为0,则不会产生对应的coredump,需要进行修改和设置。打开core文件方式有多如。
(a)在当前会话临时打开core文件:ulimit -c unlimited (可以产生coredump且不受大小限制)
(b) 在某一用户状态下永久打开core文件:修改/etc/profile 文件下ulimit -S -c unlimited > /dev/null 2>&1
禁止产生core文件使用ulimit -c 0即可。
2、core文件命名即目录指定
core文件默认的存储位置与对应的可执行程序在同一目录下,文件名是core。通过修改kernel的参数,可以指定内核所生成的coredump文件的文件名。
例如,使用下面的命令使kernel生成名字为core.filename.pid格式的core dump文件:
echo “core.%e.%p”>/proc/sys/kernel/core_pattern /// 自定义core文件格式
以下是参数列表:
%p - insert pid into filename 添加pid
%u - insert current uid into filename 添加当前uid
%g - insert current gid into filename 添加当前gid
%s - insert signal that caused thecoredump into the filename 添加导致产生core的信号
%t - insert UNIX time that the coredumpoccurred into filename 添加core文件生成时的unix时间
%h - insert hostname where the coredumphappened into filename 添加主机名
%e - insert coredumping executable nameinto filename 添加命令名