当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而core dump文件可以再现程序出错时的情景。
1、开启关闭coreDump
ulimit -c //查看是否打开此选项,若为0则为关闭;
ulimit -c 0 //手动关闭
ulimit -c 1000 //设置core文件大小最大为1000kulimit -c unlimited //设置core文件大小为不限制大小
2、修改core文件的名称和生成路径
默认生成的core文件保存在可执行文件所在的目录下,文件名为core,新的core文件生成将覆盖原来的core文件。
echo "/usr/data/core-%-%p-%t" > /proc/sys/kernel/core_pattern
程序崩溃后会在/usr/data目录下生成文件core-命令-pid-时间戳。
core_pattern接受的是core文件名称的pattern,它包含任何字符串,并且用%作为转移符号生成一些标示符,为core文件名称加入特殊含义。已定义的标示符有如下这些:
- %%:相当于%
- %p:相当于<pid>
- %u:相当于<uid>
- %g:相当于<gid>
- %s:相当于导致dump的信号的数字
- %t:相当于dump的时间
- %e:相当于执行文件的名称
- %h:相当于hostname
3、修改core文件的名称和生成路径 (通过代码)
#include <sys/resource.h>
int main()
{
/*设置路径,不设置有个默认路径*/
string str = "echo '";
str += "/usr/data/core";
str += "' > /proc/sys/kernel/core_pattern";
int n = system(str.toAscii().data());
if(n != 0)
{
cout<<"Core文件路径设置失败"<<endl;
}
struct rlimit rlmt;
getrlimit(RLIMIT_CORE, &rlmt);
rlmt.rlim_cur = (rlim_t)RLIM_INFINITY;
rlmt.rlim_max = (rlim_t)RLIM_INFINITY;
setrlimit(RLIMIT_CORE, &rlmt);
//do other things.
}
3、程序崩溃后,使用gdb调试
- 将core文件放到工程目录,即生成可执行文件得目录下;
- 打开终端执行gdb 程序名 core文件名 ,例如:gdb a.out core;
- 然后一般再使用bt/where命令,即可查看程序崩溃得经过。