获取进程的内核转储
来源:互联网 发布: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.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
- 获取进程的内核转储
- 获取进程的内核转储
- 获取进程的内核转储
- 内核获取进程名KeGetProcName
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法 [原]
- 解析Linux内核获取当前进程指针的方法
- 获取当前进程/线程的ID、句柄和内核地址
- linux内核获取进程的全路径3种方法
- 获取当前进程/线程的ID、句柄和内核地址
- 解析Linux内核获取当前进程指针的方法
- 解析Linux内核获取当前进程指针的方法
- 内核驱动程序中获取当前用户进程的进程名的一种方法
- 内核驱动程序中获取当前用户进程的进程名的方法
- 内核进程的堆栈
- 内核进程的复制
- 内核进程的堆栈
- Netty 学习笔记 三 使用Pojo代替Bytebuf
- 三种模式分解的等价定义
- 东南大学CTF之Flag你在哪里?
- 指令学习
- 第十二周项目1- 教师兼干部类
- 获取进程的内核转储
- 区间重叠
- mysql获得汉字首字母函数
- UIImagePickerController 图像选取器--在iPhone中调用照相机、照片库—IOS开发
- GCD使用经验与技巧浅谈
- Echarts 主题设置
- iOS 跟踪错误日志
- 欺骗异常 – Java 8 Lambdas
- windows 下基于eclipse开发c与c++