一、问题
问题描述:centos7有个目录老是生成core. 把磁盘占满,又查不到是哪个应用生成的。
二、解决方案
- 先查看core文件是否开启,执行命令:
ulimit -a
- 如果 显示 core file size 等于 unlimited ,表示不限制core文件大小
- 如果 显示 core file size 等于 0,表示没有设置,即关闭core文件生成功能,防止大量的core文件占满磁盘
- 设定生成的core文件大小,可以使用以下命令:
- 内部调试时,可以选择不限制文件大小
ulimit -c 1000 // 设定core文件为1000K
ulimit -c unlimited // 不限制core文件大小
- 实际生产部署时,设置文件大小为0,即关闭core文件生成功能,防止大量的core文件占满磁盘
ulimit -c 0
- 使设置生效:
(1)修订 /etc/profile文件, 这样机器重启,也会生效
vi /etc/profile
,在文件中添加设置命令内容如下:
ulimit -c 0
# 或 根据自己需求设置
ulimit -c unlimited
保存编辑。
(2)输入以下命令,使得设置立即生效:source /etc/profile
以上设定完成,就可以生成core dump文件,但是core文件只会在执行程序的目录下。
- 为了方便查找,可以进行以下设定,使得core dump文件在固定目录生成:
core_pattern的命名参数如下:
%c 转储文件的大小上限
%e 所dump的文件名
%g 所dump的进程的实际组ID
%h 主机名
%p 所dump的进程PID
%s 导致本次coredump的信号
%t 转储时刻(由1970年1月1日起计的秒数)
%u 所dump进程的实际用户ID
(1)编辑文件 /etc/sysctl.conf,设置生成的core文件名格式(core_进程名_进程PID)和存放目录
备注: 先在 /var/ 下 创建新文件夹 core – core的存放目录
vi /etc/sysctl.conf
添加以下内容:
kernel.core_pattern=/var/core/core_%e_%p
kernel.core_uses_pid=0
使用以下命令,生成的core文件就可以统一在/var/core/ 文件夹中查看到了
(2)使得设置即时生效,执行命令:sysctl –p /etc/sysctl.conf
- 生成core文件后, 使用gdb调试:
gdb /执行程序目录/执行程序 /var/core/core_执行程序名_执行程序PID