HACK#60 核心转储过滤器

本节介绍如何控制应用程序的core文件中包含的内存区域。

从内核2.6.23版本开始安装了核心转储过滤器(core dump filter)功能。

应用程序中一旦发生分段错误(segement fault)等,就会生成该进程的核心转储文件(core文件)。core文件包括发生崩溃并强制结束的进程(崩溃进程)的内存区域。core文件可以使用gdb命令等进行分析。

如果进程占用了大量内存,core文件的大小也会相应地变大。另外,生成core文件也需要花费时间。可以使用ulimit来限制生成的core文件的大小,但如果进程内存的数据大小超过这个值,就无法全部获取数据。

注意事项:在RHEL6中,当abrtd运行时,根据abrtd的报告大小设置(MaxCrashReportsSize),核心文件有时不是在当前目录中生成,而是在/var/spool/abrt下生成。

使用核心转储过滤器限制core文件中包含的内存区域。例如,可以将共享内存的区域设置为不包括在core文件中。这样就可以缩小core文件的大小,并缩短获取core文件的时间。

使用方法

核心转储过滤器通过/proc/<pid>/coredump_filter来设置。由于coredump_filter是/proc/<pid>/的文件,因此可以对每个进程分别设置。

coredump_filter为位掩码。表7-15所示为各值与指定的内存区域。

HACK#60 核心转储过滤器 - 图1

内存区域的设置是位掩码为1时包括,为0时则不包括。

RHEL6的默认为0x33。0x33的设置为将第0、1、4、5位的内存区域包括在core文件中。不想将共享内存包括在PID 1234的core文件中时,仅将第0位、第2位、第5位设置为1。执行下列命令。


$echo 0x21>/proc/1234/coredump_flter


可以使用内核启动参数coredump_filter设置默认的值。如果在/etc/grub.conf等中设置coredump_filter=0x21,则所有进程的默认值都变成0x21。