当程序运行的过程当中异常终止或崩溃,操做系统会将程序当时的内存状态记录下来,保存在一个文件中,这种行为就叫作Core Dumphtml
咱们能够认为 core dump 是“内存快照”,但实际上,除了内存信息以外,还有些关键的程序运行状态也会同时 dump 下来,例如寄存器信息(包括程序指针、栈指针等)、内存管理信息、其余处理器和操做系统状态和信息。core dump 对于编程人员诊断和调试程序是很是有帮助的,由于对于有些程序错误是很难重现的,例如指针异常,而 core dump 文件能够再现程序出错时的情景。linux
上面说当程序运行过程当中异常终止或崩溃时会发生 core dump,但还没说到什么具体的情景程序会发生异常终止或崩溃,例如咱们使用 kill -9 命令杀死一个进程会发生 core dump 吗?实验证实是不能的,那么什么状况会产生呢?编程
linux信号中每种信号都有其对应的操做,信号所对应的操做详见 linux信号,大体的操做种类如图:centos
Term Default action is to terminate the process. Ign Default action is to ignore the signal. Core Default action is to terminate the process and dump core (see core(5)). //某些信号产生core Stop Default action is to stop the process. Cont Default action is to continue the process if it is currently stopped.
如下列出几种信号,它们在发生时会产生 core dump:dom
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() 函数、访存错误、非法指令等等。函数
首先,要容许产生core,其次,产生core的位置ui
# /etc/security/limits.conf # #Each line describes a limit for a user in the form: # #<domain> <type> <item> <value> * soft core unlimited
经过修改 /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 设置生成的 core 文件保存在 “/tmp/corefile” 目录下,文件名格式为 “core-命令名-pid-时间戳”spa
[root@VM_42_60_centos ~]# sleep 10 ^\Quit (core dumped) # Ctrl+\ core file at /tmp/ [root@VM_42_60_centos ~]#
#include <stdio.h> int func(int *p) { int y = *p; return y; } int main() { int *p = NULL; return func(p); }
gcc core_demo.c -o core_demo -g gdb core_demo core_demo.core.24816