core dump 的基本概念 當一個進程要異常終止時 ,可以選擇把進程的用戶空間記憶體數據全部保存到磁碟上 ,文件名通常是 core, 這叫做 Core Dump。通常情況下,core文件會包含了程式運行時的記憶體,寄存器狀態,堆棧指針,記憶體管理信息還有各種函數調用堆棧信息等,我們可以理解為是程式工作 ...
core dump 的基本概念 當一個進程要異常終止時 ,可以選擇把進程的用戶空間記憶體數據全部保存到磁碟上 ,文件名通常是 core, 這叫做 Core Dump。通常情況下,core文件會包含了程式運行時的記憶體,寄存器狀態,堆棧指針,記憶體管理信息還有各種函數調用堆棧信息等,我們可以理解為是程式工作當前狀態存儲生成第一個文件,程式出錯的時候理論上都會產生一個core文件,通過工具分析這個文件,我們可以定位到程式異常退出的時候對應的堆棧調用等信息,找出問題所在併進行及時解決。 進程異常終止通常是因為有Bug, 比如,非法記憶體訪問導致段錯誤 ,事後可以用調試器檢查 core文件以查清錯誤原因 ,這叫做Post-mortem Debug 。一個進程允許產生多大的 core文件取決於進程的 Resource Limit( 這個信息保存 在 PCB中 )。 開啟或關閉core文件 預設是不允許產生 core文件的 ,因為 core文件中可能包含用戶密碼等敏感信息 ,不安全;除此之外,每core dump一次就會產生一個core文件,次數多了占用記憶體空間,所以一般預設情況下是不允許生成core文件的,除非由於後臺測試的需要,你自己對該項設置進行了更改。
$ ulimit -a利用上面的命令我們可以查看系統設定的core文件選項:
在開發調試階段可以用 ulimit 命令改變這個限制 ,允許產生 core文件。
$ ulimit -c [size]例如: 用ulimit 命令改變Shell 進程的 Resource Limit,允許 core文件最大為 1024K。這樣進程被down掉後,就會產生core文件了
$ ulimit -c 1024
當然,如果不想生成core文件,可以使用命令: $ ulimit -c 0
實 例
SIGQUIT信號(鍵入Ctrl-\) 的預設處理動作是終止進程並且core dump!
寫一個死迴圈程式,前臺運行這個程式,然後鍵入 Ctrl-\ ,使該進程收到SIGQUIT信號後終止並產生core文件
/************************************************************************* > File Name: test.c > Author:Lynn-Zhang > Mail: [email protected] > Created Time: Fri 15 Jul 2016 03:03:57 PM CST ************************************************************************/ #include<stdio.h> int main() { printf("pid is :%d\n",getpid()); while(1); return 0; }
這裡的core.2678就是該進程被down掉所對應的core文件,其中的2678是該進程的pid。
ulimit 命令改變了Shell 進程的 Resource Limit,test進程的 PCB由 Shell進程複製而來 ,所以也具有和 Shell進程相同的 Resource Limit值 ,這樣就可以產生 Core Dump了。 core文件的使用 在core文件所在目錄下,gdb目標文件,它會啟動GNU的調試器,來調試core文件,並且會顯示 生成此core文件的程式名,中止此程式的信號等等
除此之外,core文件的內容是二進位的!