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文件的內容是二進制的!