core dump 的基本概念
當一個進程要異常終止時 ,能夠選擇把進程的用戶空間內存數據所有保存到磁盤上 ,文件名一般是 core, 這叫作 Core Dump。一般狀況下,core文件會包含了程序運行時的內存,寄存器狀態,堆棧指針,內存管理信息還有各類函數調用堆棧信息等,咱們能夠理解爲是程序工做當前狀態存儲生成第一個文件,程序出錯的時候理論上都會產生一個core文件,經過工具分析這個文件,咱們能夠定位到程序異常退出的時候對應的堆棧調用等信息,找出問題所在並進行及時解決。
進程異常終止一般是由於有Bug, 好比,非法內存訪問致使段錯誤 ,過後能夠用調試器檢查 core文件以查清錯誤緣由 ,這叫作Post-mortem Debug 。一個進程容許產生多大的 core文件取決於進程的 Resource Limit( 這個信息保存 在 PCB中 )。
開啓或關閉core文件
默認是不容許產生 core文件的 ,由於 core文件中可能包含用戶密碼等敏感信息 ,不安全;除此以外,每core dump一次就會產生一個core文件,次數多了佔用內存空間,因此通常默認狀況下是不容許生成core文件的,除非因爲後臺測試的須要,你本身對該項設置進行了更改。
利用上面的命令咱們能夠查看系統設定的core文件選項:
在開發調試階段能夠用 ulimit 命令改變這個限制 ,容許產生 core文件。安全
例如: 用ulimit 命令改變Shell 進程的 Resource Limit,容許 core文件最大爲 1024K。這樣進程被down掉後,就會產生core文件了
固然,若是不想生成core文件,可使用命令: $ ulimit -c 0bash
實 例函數
SIGQUIT信號(鍵入Ctrl-\) 的默認處理動做是終止進程而且core dump!工具
寫一個死循環程序,前臺運行這個程序,而後鍵入 Ctrl-\ ,使該進程收到SIGQUIT信號後終止併產生core文件
測試
/*************************************************************************
> File Name: test.c
> Author:Lynn-Zhang
> Mail: iynu17@yeah.net
> 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。spa
ulimit 命令改變了Shell 進程的 Resource Limit,test進程的 PCB由 Shell進程複製而來 ,因此也具備和 Shell進程相同的 Resource Limit值 ,這樣就能夠產生 Core Dump了。
core文件的使用
在core文件所在目錄下,gdb目標文件,它會啓動GNU的調試器,來調試core文件,而且會顯示 生成此core文件的程序名,停止此程序的信號等等
除此以外,core文件的內容是二進制的!.net