l 启用内核转储
ulimit –cunlimited 或者 ulimit –c limit_size
l 要用gdb调试生成的内核转储文件
$gdb–c core.xxx ./a.out
l 在专用目录中生成内核转储
通过sysctl变量kernel.core_pattern设置。
kernel.core_pattern中可以设置的格式符
%% | %字符本身 |
%p | 被转储进程的ID(PID) |
%u | real uid |
%g | real gid |
%s | 引发转储的信号编号 |
%t | 转储时刻 |
%h | 主机名 |
%e | 可执行文件名 |
%c | 转储文件的大小上限 |
kernel.core_uses_pid=0 文件名末尾不添加pid
kernel.core_uses_pid=1 文件名末尾添加.pid
l 使用用户模式辅助程序自动压缩内核转储文件
kernel.core_pattern中可以加入管道符,启动用户模式辅助程序。管道符后面可以写程序名。例如
echo “|/usr/local/sbin/core_helper%t %e %p %c” > /proc/sys/kernel/core_pattern
(更改此处相当于修改/etc/sysctl.conf的kernel.core_pattern= |/usr/local/sbin/core_helper %t %e %p %c)
# cat/usr/local/sbin/core_helper
#!/bin/sh
execgzip - > /var/core/$1-$2-$3-$4.core.gz
l 启动整个系统的内核转储功能
1、 开启登录到系统的所有用户的内核转储功能。
编辑/etc/profile,将ulimit –S –c 0 > /dev/null 2>&1更改为ulimit –S –cunlimited > /dev/null 2>&1
2、 让通过init脚本启动的守护进程(daemonprocess)的内核转储功能有效
在/etc/sysconfig/init文件中添加DAEMON_COREFILE_LIMIT=’unlimited’。
3、 使得被SUID的程序也能内核转储
在/etc/sysctl.conf中添加fs.suid_dumpable=1
l 利用内核转储掩码排除共享内存
你可能会因为不希望设置ulimit 的时候太僵硬导致空间不够没有得到完整的转储,所以设置ulimit 为"unlimited" (不限制)。但是如果执行一个占用内存很恐怖的程序,当这个程序内核转储的时候也就会生成体积很恐怖的转储文件。
为了避免这种情况,可以指定内核转储掩码来排除要转储的内存段。
掩码请查看/usr/src/linux/Documentation/sysctl/kernel.txt中的3.4 小节,没有内核源码可以到这里的网络版,这里摘录出来如下:
The following 7memory types are supported:
- (bit 0) anonymous private memory(匿名私有内存段)
- (bit 1) anonymous shared memory(匿名共享内存段)
- (bit 2) file-backed private memory(file-backed 私有内存段)
- (bit 3) file-backed shared memory(file-bakced 共享内存段)
- (bit 4) ELF header pages in file-backedprivate memory areas (it is
effective only if the bit 2 iscleared)(ELF 文件映射,只有在bit 2 复位的时候才起作用)
- (bit 5) hugetlb private memory(大页面私有内存)
- (bit 6) hugetlb shared memory(大页面共享内存)
设置方法很简单:找到程序的PID,然后修改/proc/<PID>/coredump_filter的值。
如果你要设置某些还没有运行的进程的内核转储掩码,请修改/proc/self/coredump_filter 的值。
PS:
a. 默认的coredump_filter的值一般是0x23,至于代表什么,请换成二进制00100011,从右向左看,bit 0、bit 1、bit 5 被置位,也就是说会转储所有的匿名内存段和大页面私有内存段。
b. 共享内存段都是一样的,可以不必转储。
有关内核转储的其它知识请参考systemd下的core dump