core dump 分析与实践

2016-05-12  本文已影响0人  Lionel_素心

什么是 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]

在 OS 上配置 core

A. 设置生成 core 文件

系统默认不生成 core 文件

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

    $ ulimit -a # 列出所有资源的限制
B. 测试产生 core
         $ su - 
         # kill -s SIGSEGV $$
 **或**
     # sleep 10 &
     # killall -SIGSEGV sleep
     # kill -s SEGV <PID>

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

参考链接

要注意的问题:

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

猜你喜欢

热点阅读