我们在生成core dump时一般先使用ulimit -c 来开启系统限制,然后再配置/proc/sys/kernel/core_pattern设定core dump文件的生成路径。
但是ulimit命令是有作用范围的,事实上ulimit限制的是当前shell进程以及其派生的子进程,所以通过ulimit修改coresize只是针对在当前shell下启动的子进程,而不能影响其他shell下启动的进程。
所以当我们配置完成生成core dump的参数后,在当前shell直接执行的进程发生崩溃时可以正常生成core,而后台开机自启动的程序则无法生成,而对于被用于工业控制的嵌入式板,应用程序一般都是开机自启动的,并且发送崩溃的时机也是不可预测的,那么使用这种方式就不能正确的去捕捉coredump文件了
前台进程如何生成core dump
如上文所说,前台程序想要生成core dump文件,只需在程序运行之前配置好core dump相关设定即可
uliimit -c unlimit //开启core 生成,并不对生成core文件大小进行限制
echo "/media/mmcblk0p1/%e-%t.coredump" > /proc/sys/kernel/core_pattern //设置文件保存路径以及文件名
后台进程如何生成core dump
后台进程要生成core dump文件需在进程代码中开启core dump功能,可调用setrlimit函数来实现对coresize参数的设置,所以在调试后台程序时只需在程序中添加以下代码段开启core dump功能即可(文件生成地址可自行修改)
static int enableCoreDumpFunc(){
int iRes = RLIMIT_CORE;
struct rlimit limitParam;
limitParam.rlim_cur = 1 ? RLIM_INFINITY : 0;
limitParam.rlim_max = 1 ? RLIM_INFINITY : 0;
if(0 != setrlimit(iRes,&limitParam)){
printf("Error: setrlimit failed, %s\n", strerror(errno));
return 0;
}else{
system("echo /media/mmcblk0p1/%e-%t-%s.coredump > /proc/sys/kernel/core_pattern");
printf("Set coredump file size to %lu, path = /var/core\n",limitParam.rlim_cur);
return 1;
}
return 0;
}
最后在main函数中调用此函数即可开启core dump