core dump 分析与实践

什么是 core dump ?

进程接收到某些信号(signal)后, 异常终止,并记录当前内存等状态的镜像文件,即 core dump file,简称 core 文件。

这些导致 core 的信号如下:

信号(signal) 描述
SIGABRT 异常终止(abort())
SIGBUS 硬件异常,通常是错误的内存访问
SIGEMT 硬件异常
SIGTRAP 硬件异常。一般是调试异常
SIGILL 非法指令异常
SIGIOT 硬件异常,一般对应SIGABRT
SIGFPE 算术异常,如被0除,浮点溢出等
SIGILL 非法指令异常
SIGQUIT 终端退出符
SIGSEGV 非法内存访问
SIGSYS 非法系统调用
SIGXCPU CPU时间限制超时(setrlimit)
SIGXFSZ 超过文件长度限制(setrlimit)

core 文件的作用

   gdb -c [core file] [exec file]
   gdb [exec file] [core file | pid]
  • 调试 core 文件,查看程序终止时状态。
  • 调试 core 文件,学习、测试服务调用流程(自己制作 core)。
    制作 core 的方法:
    $ gcore # 方法1
    $ gdb -q –   #方法2
    (gdb) generate-core-file
    (gdb) detach
    (gdb) quit

在 OS 上配置 core

A. 设置生成 core 文件

系统默认不生成 core 文件

  1. 检查 core 文件大小
    $ ulimit -c # 显示 core 大小,为 0 则不生成 core

    $ ulimit -a # 列出所有资源的限制
  • 为所有用户设置生成 core
    $ su - # 获得 root 权限
    # echo 'ulimit -S -c unlimited > /dev/null 2>&1' >> /etc/profile

    或者为单个用户设置core:
    ulimit -c unlimited # unlimited 可以为数字,如1024
    或者修改 ~/.bashrc 或 ~/.bash_profile 文件

    使设置生效:
    source /etc/profile

  • 设置进程 ID (pid)为 core 文件扩展名
    修改 /proc/sys/kernel/core_uses_pid 文件内容为: 1
    root@lyg:~# sysctl -w kernel.core_uses_pid=1
    kernel.core_uses_pid = 1

  • 设置 core 文件位置和格式
    修改 /proc/sys/kernel/core_pattern 文件
    root@lyg:~# sysctl -w kernel.core_pattern=/tmp/core-%e-%p-%t
    kernel.core_pattern = /tmp/core-%e-%p-%t
    其中,
    /tmp/ :是存放 core 文件的目录(默认是进程 core 时在的目录);
    core-%e-%p-%t:是 core 文件格式。

         **%p** - 进程ID(pid)
         **%u** - 用户ID(uid)
         **%g** - 用户组ID(gid)
         **%s** - 导致 core 的信号
         **%t** - core 的 unix 时间
         **%h** - 主机名
         **%e** - 导致 core 的命令名
    
B. 测试产生 core
         $ su - 
         # kill -s SIGSEGV $$
 **或**
     # sleep 10 &
     # killall -SIGSEGV sleep
     # kill -s SEGV 

 查看 /tmp/ 目录下是否生成 core 文件。

参考链接

要注意的问题:

  1. 保证进程对存放 core 文件的目录有写权限。
  2. 若程序调用seteuid()/setegid() 改变了进程的有效用户或组,则默认情况下系统不为这些进程生成 core 文件。除非将 /proc/sys/fs /suid_dumpable 文件的内容改为1(一般默认是0)。
  3. 设置足够大的Core文件大小限制。程序崩溃时生成Core文件大小即为程序运行时占用的内存大小。但程序崩溃时的行为不可按平常时的行为来估计,比如缓冲区溢出等错误可能导致堆栈被破坏,因此经常会出现某个变量的值被修改成乱七八糟的,然后程序用这个大小去申请内存就可能导致程序比平常时多占用很多内存。

你可能感兴趣的:(core dump 分析与实践)