當程序運行的過程當中異常終止或崩潰,操做系統會將程序當時的內存狀態記錄下來,保存在一個文件中,這種行爲就叫作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