作爲一個之前一直混跡於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 添加命令名