本文主要是介绍(一)GDBdebug调试技术——coredump,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
文章目录
- 1.用户空间进程的内核转储:coredump
- (1)ulimit相关指令
- (2)在专用目录中生成内核转储
- (3)自动压缩code dump文件
- (4)启用Linux系统的内核转储功能
- (5)code dump排除多余共享内存
1.用户空间进程的内核转储:coredump
(1)ulimit相关指令
查看当前的coredump功能是否有效;-c:表示coredump的大小限制,为0,表示无效
$ ulimit -c
0不设置coredump文件的大小
$ ulimit -c unlimited设置coredump文件的大小的上限为1G
$ ulimit -c 1073741824
- eg:codedump-test.c
#include <stdio.h>int main(void)
{int *a=NULL;*a=0x1;return 0;
}
- gcc -g codedump-test.c -o codedump-test
$ ./codedump-test
Segmentation fault (coredumped)
- 用gdb调试生成的coredump文件
coredump文件大小设置后,才会在编译链接的当前目录有coredump文件,即:下面的core
$ gdb -c core ./codedump-test解释:由于指针a的值是NULL,可以看出在访问NULL指针的时候,收到了信号。
在调试复杂程序的时候,从内核转储入手也十分有效
- 结果如下
(2)在专用目录中生成内核转储
- 转储保存的完整路径,可以通过sysctl变量的kernel.core_pattern进行设置 (也可以通过(3)中的echo来修改)
kernel.core_uses_pid=0改变了文件名中PID的位置。若设置该值为1,则文件名末尾会添加.PID
$ cat /etc/sysctl.conf
kernel.core_pattern=/var/core/%t-%e-%c.core
kernel.core_uses_pid=0
$ sysctl -p生成coredump的时刻-进程名-PID-coredump的大小.core
$ ls /var/core
12223267175-a.out-2820-188446744073709551615.core
- kernel.core_pattern可以设置的符号表如下:
(3)自动压缩code dump文件
$ echo "|/usr/local/sbin/core_helper" > /proc/sys/kernel/core_pattern
$ cat /etc/sysctl.conf
kernel.core_pattern=|/usr/local/sbin/core_helper %t %e %p %c
kernel.core_uses_pid=0
$ sysctl -p core_helper的内容是:
$ cat /usr/local/sbin/core_helper
#!/bin/bashexec gzip - > /var/core/$1-$2-$3-$4.core.gz$ ls /var/core
12223267175-a.out-2820-188446744073709551615.core.gz
echo "/corefile/core-%e-%p-%t" > /proc/sys/kernel/core_pattern
(4)启用Linux系统的内核转储功能
1.在/etc/initscript中写一个执行ulimit的脚本,若不行,则执行2
2.以Fedora9为例子
(a)首先编辑/etc/profile:
将 ulimit -S -c 0 > /dev/null 2>&1
修改为
ulimit -S -c unlimited > /dev/null 2>&1(b)让init脚本启动的守护进程中的coredump有效:
在/etc/sysyconfig/init文件中添加:DAEMON_COREFILE_LIMIT='unlimitted'(c)在/etc/sysctl.conf中添加。默认情况下,该选项无效,还需要(2)在专用目录中生成内核转储
fs.suid_dumpable=1(d)最后重启Linux
(5)code dump排除多余共享内存
- 由于各个共享内存的进程中,共享内存的内容是相同的,所以没必要所有进程都转存储
coredump_filter使用比特掩码表示内存类型
$ cat /proc/<PID>/coredump_filter
00000003要调过所有的共享内存区段,应将值改为1
$ echo 1> /proc/<PID>/coredump_filter
- 比特4用于转储共享库或可执行文件等ELF格式文件,映射到的内存区段的第一页 (x86中为4KB)
参考:《GDB/Debug.Hacks中文版:深入调试的技术和工具》
这篇关于(一)GDBdebug调试技术——coredump的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!