获取进程的内核转储

来源:互联网 发布:mcafee livesafe知乎 编辑:程序博客网 时间:2024/05/17 07:31

 

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.confkernel.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 memoryfile-backed私有内存段)

  - (bit 3) file-backed shared memoryfile-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 0bit 1bit 5被置位,也就是说会转储所有的匿名内存段和大页面私有内存段。

b. 共享内存段都是一样的,可以不必转储。

有关内核转储的其它知识请参考systemd下的core dump

0 0
原创粉丝点击