Linux 下的 core dump

   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 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

相關文章
相關標籤/搜索