产生coredump的条件:
- 生成core文件的信号被用户程序捕捉(操作系统在程序发生异常而异常信号在进程内部又没有被捕获的情况下,方可生成core文件).
- 进程是设置用户ID的,而且当前用户并非程序文件的所有者;进程是设置组ID,而且当前用户并非该程序文件的组所有者;
- 用户有写当前工作目录的写权限; (先关的目录要提前创建好,否者没法产生)
- 生成的core文件太大.(查询命令:ulimit -c);core文件的生成配置环境,
如何配置coredump:
1. 通过ulimit -c unlimited可以打开coredump, (也可以通过setrlimit()API设置RLIMIT_CORE大小)
2. 通过/proc/sys/kernel/core_pattern设置coredump文件的保存地方(也可以在sysctl.cfg里面配置)
3. 通过每个进程下都有coredump_filter节点/proc/<pid>/coredump_filter配置coredump_filter可以选择需在coredump的时候,将哪些内容dump到core文件中.(coredump_filter的默认值是0x33)
- (bit 0) anonymous private memory
- (bit 1) anonymous shared memory
- (bit 2) file-backed private memory
- (bit 3) file-backed shared memory
- (bit 4) ELF header pages in file-backed private memory areas (it is effective only if the bit 2 is cleared)
- (bit 5) hugetlb private memory
- (bit 6) hugetlb shared memory
- (bit 7) DAX private memory
- (bit 8) DAX shared memory
4. 配置coredump文件压缩(coredump文件一般都比较大,但是压缩会变得很小)
#1. 在sysctl.cfg里面配置:
kernel.core_pattern=|/usr/bin/coredump_helper.sh core_%e_%I_%p_sig_%s_time_%t.gz
kernel.core_uses_pid=1
#2 增加处理coredump文件的脚本:
#!/bin/sh
mkdir -p /var/coredump
gzip > "/var/coredump/$1"
#3 最终在/var/coredump目录下生成core_<线程名>_<线程ID>_<进程ID>_sig_<信号值>_time_<coredump时间>.gz文件 的压缩后的文件。
参考: