Linux 下的Core dump (一)

作爲一個之前一直混跡於windows系統下的人來說,coredump是比較陌生的,那麼到底什麼是coredump呢?怎麼樣會產生core呢?程序出core後要如何調試呢?下面來簡單介紹一下。

一、什麼是coredump

當程序運行的過程中異常終止或崩潰,操作系統會將程序當時的內存狀態記錄下來,保存在一個Core文件中,這種行爲就叫做Core Dump(核心轉儲)。(這裏的 core 就是沿用的是早期電腦磁芯內存中的表達,也能看出 Unix 系統 Core Dump 機制的悠久歷史。)

                                    

二、coredump產生的原因

1、產生原因

當程序接收到如右表所示的一些unix信號時會產生core,如下表所示。(本質上說,coredump是信號處理的產物,是內核的行爲)

                                                      

2、Core Dump 如何產生?

(1)最簡單的模擬出core方式

       最簡單的一種方式直接Ctrl+\ 來終止一個進程,會向進程發出 SIGQUIT 信號,默認是會產生core dump 的。如下圖所示(注意:Ctrl+C 結束一個進程均不會產生 core dump,SIGINT 信號,該信號默認操作爲終止進程) 

                                                

(2)程序中可能導致出core的原因

(a) 內存訪問越界

 由於使用錯誤的下標,導致數組訪問越界。

搜索字符串時,依靠字符串結束符來判斷字符串是否結束,但是字符串沒有正常的使用結束符。

使用strcpy, strcat, sprintf, strcmp, strcasecmp等字符串操作函數,將目標字符串讀/寫爆。

(b)多線程程序使用了線程不安全的函數或讀寫的數據未加鎖保護

(c) 非法指針

使用空指針。

 隨意使用指針轉換。

(d)堆棧溢出(使用很大的局部變量)


三、linux Core文件介紹

1、core 文件打開和關閉

想要在linux系統中產生core文件,首先需要確認當前會話的ulimit –c若爲0,則不會產生對應的coredump,需要進行修改和設置。打開core文件方式有多如。

(a)在當前會話臨時打開core文件:ulimit  -c  unlimited  (可以產生coredump且不受大小限制)

(b)  在某一用戶狀態下永久打開core文件:修改/etc/profile 文件下ulimit -S -c unlimited > /dev/null 2>&1

       禁止產生core文件使用ulimit -c 0即可。

           

2、core文件命名即目錄指定

core文件默認的存儲位置與對應的可執行程序在同一目錄下,文件名是core。通過修改kernel的參數,可以指定內核所生成的coredump文件的文件名。

例如,使用下面的命令使kernel生成名字爲core.filename.pid格式的core dump文件:

echo   “core.%e.%p”>/proc/sys/kernel/core_pattern  /// 自定義core文件格式

以下是參數列表:
    %p - insert pid into filename 添加pid
    %u - insert current uid into filename 添加當前uid
    %g - insert current gid into filename 添加當前gid
    %s - insert signal that caused thecoredump into the filename 添加導致產生core的信號
    %t - insert UNIX time that the coredumpoccurred into filename 添加core文件生成時的unix時間
    %h - insert hostname where the coredumphappened into filename 添加主機名
    %e - insert coredumping executable nameinto filename 添加命令名

                            



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章