關(guān)于linux下core dump【總結(jié)】
1、前言
一直在從事linux下后臺(tái)開(kāi)發(fā),經(jīng)常與core文件打交道。還記得剛開(kāi)始從事linux下開(kāi)發(fā)時(shí),程序突然崩潰了,也沒(méi)有任何日志。我不知所措,同事叫我看看core,我卻問(wèn)什么是core,怎么看。同事鄙視的眼神,我依然在目。后來(lái)學(xué)會(huì)了從core文件中分析原因,通過(guò)gdb看出程序掛再哪里,分析前后的變量,找出問(wèn)題的原因。當(dāng)時(shí)就覺(jué)得很神奇,core文件是怎么產(chǎn)生的呢?難道系統(tǒng)會(huì)自動(dòng)產(chǎn)生,可是我在自己的linux系統(tǒng)上面寫(xiě)個(gè)非法程序測(cè)試,并沒(méi)有產(chǎn)生core問(wèn)題?這又是怎么回事呢?今天在ngnix的源碼時(shí)候,發(fā)現(xiàn)可以在程序中設(shè)置core dump,又是怎么回事呢?在公司發(fā)現(xiàn)生成的core文件都帶有進(jìn)程名稱(chēng)、進(jìn)程ID、和時(shí)間,這又是怎么做到的呢?今天帶著這些疑問(wèn)來(lái)說(shuō)說(shuō)core文件是如何生成,如何配置。
2、基本概念
當(dāng)程序運(yùn)行的過(guò)程中異常終止或崩潰,操作系統(tǒng)會(huì)將程序當(dāng)時(shí)的內(nèi)存狀態(tài)記錄下來(lá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 下來(lái),例如寄存器信息(包括程序指針、棧指針等)、內(nèi)存管理信息、其他處理器和操作系統(tǒng)狀態(tài)和信息。core dump 對(duì)于編程人員診斷和調(diào)試程序是非常有幫助的,因?yàn)閷?duì)于有些程序錯(cuò)誤是很難重現(xiàn)的,例如指針異常,而 core dump 文件可以再現(xiàn)程序出錯(cuò)時(shí)的情景。
3、開(kāi)啟core dump
可以使用命令ulimit開(kāi)啟,也可以在程序中通過(guò)setrlimit系統(tǒng)調(diào)用開(kāi)啟。
程序中開(kāi)啟core dump,通過(guò)如下API可以查看和設(shè)置RLIMIT_CORE
#include <sys/resource.h> int getrlimit(int resource, struct rlimit *rlim); int setrlimit(int resource, const struct rlimit *rlim);
參考程序如下所示:
#include <unistd.h> #include <sys/time.h> #include <sys/resource.h> #include <stdio.h> #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:%d\n", (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:%d\n", (int)rlmt.rlim_cur, (int)rlmt.rlim_max); /*測(cè)試非法內(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 來(lái)查看 core 文件,其中 program 為可執(zhí)行程序名,core 為生成的 core 文件名。
以上這篇關(guān)于linux下core dump【總結(jié)】就是小編分享給大家的全部?jī)?nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Linux服務(wù)器如何查看每個(gè)用戶(hù)或者當(dāng)前用戶(hù)的磁盤(pán)占用量及文件同步
這篇文章主要介紹了Linux服務(wù)器如何查看每個(gè)用戶(hù)或者當(dāng)前用戶(hù)的磁盤(pán)占用量及文件同步問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02Linux系統(tǒng)(CentOS7安裝)安裝JDK8的教程詳解
這篇文章主要介紹了Linux系統(tǒng)(CentOS7安裝)安裝JDK8的教程,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-01-01Windows操作系統(tǒng)下Linux虛擬機(jī)的安裝與配置教程圖解
這篇文章主要介紹了Windows操作系統(tǒng)下Linux虛擬機(jī)的安裝與配置,本文圖文并茂給大家介紹的非常詳細(xì),具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2019-10-10Linux下的crontab定時(shí)執(zhí)行任務(wù)命令詳解
cron的配置文件稱(chēng)為“crontab”,是“cron table”的簡(jiǎn)寫(xiě)。這篇文章主要介紹了Linux下的crontab定時(shí)執(zhí)行任務(wù)命令詳解,需要的朋友可以參考下2018-09-09阿里云Linux主機(jī)安裝WDCP管理面板(包含lamp+lnmp+lanmp環(huán)境)
這篇文章主要介紹了阿里云Linux主機(jī)安裝WDCP管理面板(包含lamp+lnmp+lanmp環(huán)境),需要的朋友可以參考下2017-08-08Linux系統(tǒng)中 /etc/fstab 文件的深入解讀
這篇文章主要給大家介紹了Linux系統(tǒng)中 /etc/fstab 文件的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-01-01