Linux 中的Core Dump设置与使用

时间:2022-12-07 08:00:59


当程序运行的过程中异常终止或崩溃,操作系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫做Core Dump(中文有的翻译成“核心转储”)。我们可以认为 core dump 是“内存快照”,但实际上,除了内存信息之外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其他处理器和操作系统状态和信息。core dump 对于编程人员诊断和调试程序是非常有帮助的,因为对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件可以再现程序出错时的情景。

        

异常终止或崩溃时会发生 core dump,但还没说到什么具体的情景程序会发生异常终止或崩溃,例如我们使用 ​​kill -9​

Linux 中信号是一种异步事件处理的机制,每种信号对应有其默认的操作,默认操作主要包括忽略该信号(Ingore)、暂停进程(Stop)、终止进程(Terminate)、终止并发生core dump(core)等。如果我们信号均是采用默认操作,那么,以下列出几种信号,它们在发生时会产生 core dump:

Signal

Action

Comment

SIGQUIT

Core

Quit from keyboard

SIGILL

Core

Illegal Instruction

SIGABRT

Core

Abort signal from ​​abort​

SIGSEGV

Core

Invalid memory reference

SIGTRAP

Core

Trace/breakpoint trap

​Ctrl+z​​ 来挂起一个进程或者 ​​Ctrl+C​​ 结束一个进程均不会产生 core dump,因为前者会向进程发出 SIGTSTP 信号,该信号的默认操作为暂停进程(Stop Process);后者会向进程发出SIGINT 信号,该信号默认操作为终止进程(Terminate Process)。同样上面提到的 ​​kill -9​​ 命令会发出 SIGKILL 命令,该命令默认为终止进程。而如果我们使用 ​​Ctrl+\​​ 来终止一个进程,会向进程发出 SIGQUIT 信号,默认是会产生 core dump 的。还有其它情景会产生 core dump, 如:程序调用 ​​abort()​

Linux下打开Core Dump

Ubuntu 13.04,设置生成 core dump 文件的方法如下:

  • 打开 core dump 功能

​ulimit -c​​​​ulimit -c unlimited​​​​/etc/security/limits.conf​

  • 文件,增加一行:
  1. # /etc/security/limits.conf
  2. #
  3. #Each line describes a limit for a user in the form:
  4. #
  5. #<domain>   <type>   <item>   <value>
  6.  
  7.     *          soft     core   unlimited


修改 core 文件保存的路径

​core​

​/proc/sys/kernel/core_uses_pid​

  •  文件可以让生成 core 文件名是否自动加上 pid 号。
    例如 

​echo 1 > /proc/sys/kernel/core_uses_pid​

  •  ,生成的 core 文件名将会变成 

​core.pid​

  • ,其中 pid 表示该进程的 PID。

​/proc/sys/kernel/core_pattern​

  •  来控制生成 core 文件保存的位置以及文件名格式。
    例如可以用 

​echo "/tmp/corefile-%e-%p-%t" > /proc/sys/kernel/core_pattern​