linux下,core文件是如何生成,如何配置
1、前言
一直在從事linux下后臺(tái)開發(fā),經(jīng)常與core文件打交道。還記得剛開始從事linux下開發(fā)時(shí),程序突然崩潰了,也沒有任何日志。我不知所措,同事叫我看看core,我卻問什么是core,怎么看。同事鄙視的眼神,我依然在目。后來學(xué)會(huì)了從core文件中分析原因,通過gdb看出程序掛再哪里,分析前后的變量,找出問題的原因。當(dāng)時(shí)就覺得很神奇,core文件是怎么產(chǎn)生的呢?難道系統(tǒng)會(huì)自動(dòng)產(chǎn)生,可是我在自己的linux系統(tǒng)上面寫個(gè)非法程序測試,并沒有產(chǎn)生core問題?這又是怎么回事呢?今天在ngnix的源碼時(shí)候,發(fā)現(xiàn)可以在程序中設(shè)置core dump,又是怎么回事呢?在公司發(fā)現(xiàn)生成的core文件都帶有進(jìn)程名稱、進(jìn)程ID、和時(shí)間,這又是怎么做到的呢?今天帶著這些疑問來說說core文件是如何生成,如何配置。
2、基本概念
當(dāng)程序運(yùn)行的過程中異常終止或崩潰,操作系統(tǒng)會(huì)將程序當(dāng)時(shí)的內(nèi)存狀態(tài)記錄下來,保存在一個(gè)文件中,這種行為就叫做Core Dump(中文有的翻譯成“核心轉(zhuǎn)儲(chǔ)”)。我們可以認(rèn)為 core dump 是“內(nèi)存快照”,但實(shí)際上,除了內(nèi)存信息之外,還有些關(guān)鍵的程序運(yùn)行狀態(tài)也會(huì)同時(shí) dump 下來,例如寄存器信息(包括程序指針、棧指針等)、內(nèi)存管理信息、其他處理器和操作系統(tǒng)狀態(tài)和信息。core dump 對于編程人員診斷和調(diào)試程序是非常有幫助的,因?yàn)閷τ谟行┏绦蝈e(cuò)誤是很難重現(xiàn)的,例如指針異常,而 core dump 文件可以再現(xiàn)程序出錯(cuò)時(shí)的情景。
3、開啟core dump
可以使用命令ulimit開啟,也可以在程序中通過setrlimit系統(tǒng)調(diào)用開啟。
程序中開啟core dump,通過如下API可以查看和設(shè)置RLIMIT_CORE
#includeint?getrlimit(int?resource,?struct?rlimit?*rlim); int?setrlimit(int?resource,?const?struct?rlimit?*rlim);
參考程序如下所示:
#include#include#include#include#define?CORE_SIZE???1024?*?1024?*?500
int?main()
{
????struct?rlimit?rlmt;
????if?(getrlimit(RLIMIT_CORE,?&rlmt)?==?-1)?{
????????return?-1;?
????}???
????printf("Before?set?rlimit?CORE?dump?current?is:%d,?max?is:%dn",?(int)rlmt.rlim_cur,?(int)rlmt.rlim_max);
????rlmt.rlim_cur?=?(rlim_t)CORE_SIZE;
????rlmt.rlim_max??=?(rlim_t)CORE_SIZE;
????if?(setrlimit(RLIMIT_CORE,?&rlmt)?==?-1)?{
????????return?-1;?
????}???
????if?(getrlimit(RLIMIT_CORE,?&rlmt)?==?-1)?{
????????return?-1;?
????}???
????printf("After?set?rlimit?CORE?dump?current?is:%d,?max?is:%dn",?(int)rlmt.rlim_cur,?(int)rlmt.rlim_max);
????/*測試非法內(nèi)存,產(chǎn)生core文件*/
????int?*ptr?=?NULL;
????*ptr?=?10;?
????return?0;
}執(zhí)行./main, 生成的core文件如下所示
GDB調(diào)試core文件,查看程序掛在位置。當(dāng)core dump 之后,使用命令?gdb program core?來查看 core 文件,其中 program 為可執(zhí)行程序名,core 為生成的 core
文件名。





