Linux应用开发之coredump

简介: 程序崩溃往往是最不好调试的,如果是很容易复现的现象,可能我们还可以比较容易分析出问题所在。但是对于那种需要几天,或者在某种特殊条件下才能触发的现象。我们总不能一直守着,所以这个时候就需要系统帮我们把崩溃的一些信息记录下来,也就是接下来要提到的coredump。

前言

   程序崩溃往往是最不好调试的,如果是很容易复现的现象,可能我们还可以比较容易分析出问题所在。但是对于那种需要几天,或者在某种特殊条件下才能触发的现象。我们总不能一直守着,所以这个时候就需要系统帮我们把崩溃的一些信息记录下来,也就是接下来要提到的coredump。



什么是coredump

   当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态, 寄存器信息 , 系统状态等记录下来,保存在一个文件中,这种行为就叫做core dump。



core文件生成

   默认情况下,core文件是不会生成的,也就是程序崩溃了,你是找不到core文件的。我们可以通过下面的命令来查看core dump是否开启。

ulimit-c#如果为0表示coredump开关处于关闭状态

假如没有开启,那要怎么开启呢?只要设置一下core文件大小:

ulimit-c1024#1024个blocks,一般1block=512bytesulimit-cunlimited#取消大小限制

只要设置core文件大小后,就开启了,大小就根据自己的需要来确定了。对于长时间之后才崩溃的,肯定要设置大一点。

* ulimit命令的用法可以自己去查


core文件存放位置

   core文件默认的存放位置与对应的可执行程序在同一目录下,文件名为core。可以通过下面的命令查看:

cat/proc/sys/kernel/core_pattern

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9NNm5FQktsN1dDUDA5MTFGSVRWMGhTejBsalp2aGdaVGppY2dhY0ZsNVM3YkF6SVdCYWFnQldvaWJhNngxa1EyTUlhVmRSaWN6anRBcEF6QjR3dFdRTjZpYWcvNjQw.png

返回值是不是很奇怪,但是它对应的就是程序所在目录。想深究,自己动手!^_^

如果不想存放在默认位置,可以修改上面文件的值:

echo"/tmp/core">/proc/sys/kernel/core_pattern


gdb调试coredump

   有了core文件之后,还得考虑怎么使用该文件,这时候gdb又要上场了。我们先举个例子:

#include <stdio.h>#include <unistd.h>#include <sys/time.h>#include <sys/resource.h>#define CORE_SIZE (500 * 1024 * 1024)intenableCoreDump(intiFlag)
{
structrlimitstRlim;
/* core */stRlim.rlim_cur=stRlim.rlim_max=iFlag?CORE_SIZE : 0;
if (0!=setrlimit(RLIMIT_CORE, &stRlim))   //设置core文件大小    {
printf("Error: setrlimit failed\n");
return-1;
    }
else    {
printf("Set coredump file size to %lu\n", stRlim.rlim_cur);
return0;
    }
}
intmain()
{
int*p=NULL;
enableCoreDump(1);
*p=12;
printf("finish\n");
}

Linux提供了API来设置core文件的大小,所以上面我们使用setrlimit来设置core文件的大小。

上面就是一个简单的空指针引起的崩溃。

(1)编译:

gcc-gcoredunp.c-ocoredunp

要加上-g才能使用gdb调试。

(2)运行:

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9NNm5FQktsN1dDUDA5MTFGSVRWMGhTejBsalp2aGdaVE1BaWJTZzhwN0xWTGtLSUFvTmNVazJLZFhiaWM2a0tpY0lpYlFVVWF2WlV1S1E0bmRwRnp1OE9RakEvNjQw.png

崩溃后产生core文件。

(3)使用gdb调试core文件

gdbcoredumpcore

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9NNm5FQktsN1dDUDA5MTFGSVRWMGhTejBsalp2aGdaVGljdHpMejhpYjJUTzlmam1WM3BMSG05QjhESDJIWktoM3ptN0UzTVdIb1VWbXE0Wm9WdHFxcXVBLzY0MA.png

可以从上面看出程序崩溃的位置,coredump.c的第33行。可以通过bt看一下堆栈:

aHR0cHM6Ly9tbWJpei5xcGljLmNuL21tYml6X3BuZy9NNm5FQktsN1dDUDA5MTFGSVRWMGhTejBsalp2aGdaVExTaDJxSkY1VWdpYjNYcE1scDFIZUtYR2hIaWJ3OGh3QUZlNG91U2NReWdmUklvSlgzRFFiZWdRLzY0MA.png

这样基本就可以定位到是在哪里调用导致程序崩溃了。

 

总结

   做应用开发,一般情况下会开启coredump,这样对于定位bug有很大的帮助。对于嵌入式开发,很多时候出现bug是在一些特殊的情况下,所以一般是建议开启coredump,除非有很高的性能要求。


相关文章
|
6月前
|
NoSQL 安全 Linux
Linux 中 core dump 文件的作用和使用方法
Linux 中 core dump 文件的作用和使用方法
977 1
|
4月前
|
监控 NoSQL Linux
linux常见的coredump原因都有哪些?
Core dump通常发生在程序遇到严重错误时,操作系统会生成core文件来记录程序崩溃时的内存、寄存器状态、栈信息等。
249 3
|
6月前
|
NoSQL Linux
Linux系统调试中出现核心转储(core dump)的问题
Linux系统调试中出现核心转储(core dump)的问题
512 0
|
6月前
|
Linux 程序员 Shell
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
【Linux】详解core dump文件的作用以及用法&&ubuntu20.04下无法形成core dump文件的解决办法
232 0
|
12月前
|
存储 NoSQL Linux
【Linux】进程信号中的 core dump 标记位
【Linux】进程信号中的 core dump 标记位
|
NoSQL Linux
Linux系统调试篇——核心转储(core dump)
Linux系统调试篇——核心转储(core dump)
|
存储 运维 监控
Linux Core Dump 解析
通常,在日常的应用系统维护活动中,有这样一种场景:在某一特定的时间段或者流量高峰时刻,我们的应用程序突然无缘无故的挂掉,没有任何征兆(当然,可能更为细致的监控没有检测到),也没有任何应用层面的日志抛出,然而,业务已经开始保障(我c,怎么又不行了,某些所谓的 XX 开始叫了。。。),顿时,大伙一脸懵逼 。。。经过对所有可疑的文件依据时间段进行“查水表”,终于有所发现。
206 0
|
NoSQL Linux C++
Linux开发coredump文件分析实战分享
Linux开发coredump文件分析实战分享
204 1
Linux开发coredump文件分析实战分享
|
存储 机器学习/深度学习 NoSQL
【Linux】Coredump调试
【Linux】Coredump调试
|
NoSQL 网络协议 Linux
【GDB调试】Linux Core Dump分析经典案例之一
这次我们一起来看一下在GDB调试中属于比较典型的案例,因此也借这篇文章向大家阐述个人在分析Core Dump时的一些思路。
5207 0