core dump

什麼是 core dump

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

爲何會有 core dump

咱們能夠認爲 core dump 是「內存快照」,但實際上,除了內存信息以外,還有些關鍵的程序運行狀態也會同時 dump 下來,例如寄存器信息(包括程序指針、棧指針等)、內存管理信息、其餘處理器和操做系統狀態和信息。core dump 對於編程人員診斷和調試程序是很是有幫助的,由於對於有些程序錯誤是很難重現的,例如指針異常,而 core dump 文件能夠再現程序出錯時的情景。linux

linux信號機制與core

上面說當程序運行過程當中異常終止或崩潰時會發生 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,其次,產生core的位置ui

    • 在終端中輸入命令 ulimit -c ,輸出的結果爲 0,說明默認是關閉 core dump 的,即當程序異常終止時,也不會生成 core dump 文件。
    • 咱們可使用命令 ulimit -c unlimited 來開啓 core dump 功能,而且不限制 core dump 文件的大小; 若是須要限制文件的大小,將 unlimited 改爲你想生成 core 文件最大的大小,注意單位爲 blocks(KB)。
    • 用上面命令只會對當前的終端環境有效,若是想須要永久生效,能夠修改文件 /etc/security/limits.conf文件
    # /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 ~]#

GDB調試core文件

  • 首先,使用 gcc 編譯源文件,加上 -g 以增長調試信息
  • 按照上面打開 core dump 的 ulimit設置 以使程序異常終止時能生成 core 文件
  • 運行程序,當core dump 以後,使用命令 gdb program core 來查看 core 文件,其中 program 爲可執行程序名,core 爲生成的 core 文件名
#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

以後就是如何使用GDB的問題了 [TODOLIST]

相關文章
相關標籤/搜索