CoreDump追踪

当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而core dump文件可以再现程序出错时的情景。 

1、开启关闭coreDump

ulimit -c     //查看是否打开此选项,若为0则为关闭;
ulimit -c 0  //手动关闭
ulimit -c 1000    //设置core文件大小最大为1000k

ulimit -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文件名称加入特殊含义。已定义的标示符有如下这些:

  1. %%:相当于%
  2. %p:相当于<pid>
  3. %u:相当于<uid>
  4. %g:相当于<gid>
  5. %s:相当于导致dump的信号的数字
  6. %t:相当于dump的时间
  7. %e:相当于执行文件的名称
  8. %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命令,即可查看程序崩溃得经过。
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值