linux中core dump开启使用教程【转】

Linux Core Dump详解
本文详细介绍了Linux环境下core dump的功能及用途,包括如何开启core dump、调整core文件的大小及格式,以及如何通过core文件来诊断程序崩溃的原因。

转自:http://www.111cn.net/sys/linux/67291.htm

一、什么是coredump

我们经常听到大家说到程序core掉了,需要定位解决,这里说的大部分是指对应程序由于各种异常或者bug导致在运行过程中异常退出或者中止,并且在满足一定条件下(这里为什么说需要满足一定的条件呢?下面会分析)会产生一个叫做core的文件。

通常情况下,core文件会包含了程序运行时的内存,寄存器状态,堆栈指针,内存管理信息还有各种函数调用堆栈信息等,我们可以理解为是程序工作当前状态存储生成第一个文件,许多的程序出错的时候都会产生一个core文件,通过工具分析这个文件,我们可以定位到程序异常退出的时候对应的堆栈调用等信息,找出问题所在并进行及时解决。

二、cored dump开启

 注意:不同的平台命令、参数可能不一样:ulimit用于乌班图,正常使用limit

执行ulimit –c(limit coredumpsize) 检查是否开启core dump,若结果为0,则认为没有启用core dump文件的生成,需要打开core dump 。开启core dump的方法有三种,一种是临时启用,两种是永久启用。

临时启用

方法1(ulimit命令法)

执行如下命令:

ulimit -c 1024limit coredumpsize 1024

ulimit -c unlimitedlimit coredumpsize unlimit
上例中,前一种是限制core dump的文件大小不超过1024K,后一种是不限制core dump文件的大小,现在的程序占用内存都比较凶猛,以前写C程序需要计算内存的时代已经过去了。如果不加限制,可能一个core文件,几个G就出去了。所以最好还是限制该在小。

永久启用的两个方法:

方法二(profile文件修改法)

打开/etc/profile文件,增加如下以下并生使其生效:

ulimit -S -c unlimited > /dev/null 2>&1
注:如果该文件有ulimit -S -c 0 > /dev/null 2>&1 一行,需要先将该行注释掉。设置完成后通过执行 source /etc/profile 生效。

方法三(修改/etc/security/limits.conf文件)

找到【* soft core 0】行,将其修改为如下内容:

这个方法可以针对指定用户或用户组打开core dump,如设置成【* soft core 10485760】,即core dump文件大小是10G 。

需要注意的是此处的设置和方法二中的设置是冲突的,在其中一处设置即可,此处建议用第三种方法设置,因为其可以针对不同的用户和组进行设置,更加灵活。

注:上面三种方法设置都不需重启机器,需要做的是退出终端并重新连接,重启需要core dump的程序即可。

三、修改core dump文件格式

定制core的路径,名称格式,通过修改下面两个配置:

再说下第一句配置,/proc/sys/kernel/core_uses_pid 如果这个文件的内容被配置成1,那么即使core_pattern中没有设置%p,最后生成的core dump文件名仍会加上进程ID。

需要注意的是,由于/proc下的配置是即时生效的,reboot后,之前的配置就会失效。所以可以增加如下配置到/etc/sysctl.conf文件中,如下:

保存后,执行sysctl -p生效。

注:需要注意的是,上面配置的corefiles该目录必须有写权限,否则无法生成core dump文件,可以通过下面的命令创建:

 代码如下 
 
1user soft core 1024
或@group soft core 1024
 代码如下 
 
1echo 1 >/proc/sys/kernel/core_uses_pid
echo '/corefiles/core-%e-%p-%t' > /proc/sys/kernel/core_pattern
这里先说下后一参数的配置说明:
2%% 单个%字符
%p 所dump进程的进程ID
%u 所dump进程的实际用户ID
%g 所dump进程的实际组ID
%s 导致本次core dump的信号
%t core dump的时间 (由1970年1月1日计起的秒数)
%h 主机名
%e 程序文件名
 代码如下 
 
1kernel.core_uses_pid = 1
kernel.core_pattern = /corefiles/core-%e-%p-%t
 代码如下 
 
1# mkdir /corefiles
# chmod 777 /corefiles
### Linux coredump 使用教程 #### 生成 Core Dump 文件 为了确保能够成功生成核心储文件(core dump),需要配置系统的几个参数: - **打开 core 文件的大小限制** 通过 `ulimit` 命令可以查看并修改当前 shell session 的资源限制情况。对于不限制 core 文件大小的情况,可执行命令 `ulimit -c unlimited` 来允许创建任意大小的核心储文件[^2]。 - **设定 core 文件名模式** 可以通过调整 `/proc/sys/kernel/core_pattern` 文件的内容来自定义 core 文件的位置及其命名方式。例如,要将所有的 core 文件都存储到特定目录下,并按照一定格式命名,则可以用如下指令完成设置: ```bash sudo sh -c "echo '/data/coredump/core_$(date +%Y-%m-%d_%H-%M-%S)-%p.dump' > /proc/sys/kernel/core_pattern" ``` 这会使得每次发生崩溃时产生的 core 文件都会被放置于 `/data/coredump/` 路径之下,并带有日期时间戳以及进程 ID 等信息作为文件名称的一部分[^4]。 另外一种更常见的做法是指定固定的模板字符串给 kernel.core_pattern 参数,比如使用 `%e` 表示程序名、`%s` 表示信号编号等变量来构建更加灵活的名字结构,像这样: ```bash kernel.core_pattern="/coredumps/core-%e-%s-%u-%g-%p-%t" ``` 上述配置意味着每当应用程序异常终止时,操作系统将会依据此模板自动生成相应的 core 文件[^3]。 #### 分析 Core Dump 文件 一旦获得了所需的 core 文件之后,就可以利用调试工具对其进行深入探究了。最常用的手段之一便是借助 GDB (GNU Debugger),它不仅支持直接加载 core 文件来进行事后审查,还提供了丰富的功能帮助定位问题所在之处。 假设有一个名为 `<coredump>` 的 core 文件对应某个已知二进制文件的话,那么启动 GDB 并载入该 core 文件的方式如下所示: ```shell coredumpctl gdb <coredump> ``` 这条语句会让 GDB 连接到由 systemd-coredump 服务管理下的指定 core 文件上,从而让用户能够在交互式的环境中探索程序的状态,包括但不限于调用栈回溯、变量值检视等方面的信息[^1]。 此外,在某些情况下如果想要获取更为详细的崩溃现场数据,还可以考虑安装额外的支持包或是启用其他辅助特性,以便更好地理解故障原因。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值