這篇文章主要介紹“l(fā)inux core指的是什么”的相關(guān)知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“l(fā)inux core指的是什么”文章能幫助大家解決問題。
創(chuàng)新互聯(lián)長期為近1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團隊從業(yè)經(jīng)驗10年,關(guān)注不同地域、不同群體,并針對不同對象提供差異化的產(chǎn)品和服務(wù);打造開放共贏平臺,與合作伙伴共同營造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為惠民企業(yè)提供專業(yè)的做網(wǎng)站、成都做網(wǎng)站,惠民網(wǎng)站改版等技術(shù)服務(wù)。擁有十余年豐富建站經(jīng)驗和眾多成功案例,為您定制開發(fā)。
在linux中,Core是內(nèi)存的意思。當程序運行過程中檢測到異常程序異常退出時, 系統(tǒng)把程序當前的內(nèi)存狀況存儲在一個core文件中, 叫core dumped,也就信息轉(zhuǎn)儲;操作系統(tǒng)檢測到當前進程異常時將通過信號的方式通知目標進程相應(yīng)的錯誤信息,常見的信號有SIGSEGV、SIGBUS等,默認情況下進程接收到相應(yīng)的信號都有相應(yīng)的處理機制。
在Linux下開發(fā)中,我們經(jīng)常聽到程序員說我的程序core掉了,通常出現(xiàn)這類的問題是低級bug中的內(nèi)存訪問越界、使用空指針、堆棧溢出等情況。使程序運行過程中異常退出或者終止,滿足這些條件就會產(chǎn)生core的文件。
為什么會發(fā)生Coredump
Core就是內(nèi)存的意思,這個詞源自很早以前制造內(nèi)存的材料,一直延用到現(xiàn)在,當程序運行過程中檢測到異常程序異常退出時, 系統(tǒng)把程序當前的內(nèi)存狀況存儲在一個core文件中, 叫core dumped,也就信息轉(zhuǎn)儲,操作系統(tǒng)檢測到當前進程異常時將通過信號的方式通知目標進程相應(yīng)的錯誤信息,常見的信號有SIGSEGV,SIGBUS等,默認情況下進程接收到相應(yīng)的信號都有相應(yīng)的處理機制。
以Linux為例,Action則對應(yīng)信號的處理方式,紅色框標注為常見信號
在此之前最好先了解下進程的內(nèi)存布局, Unix與Linux系統(tǒng)的進程空間布局會稍微有點不同,內(nèi)核空間會比Linux小,特別是內(nèi)核與用戶進程采用分離的地址空間模式,這里以Linux為例:
coredump文件的存儲位置
我們知道在Linux系統(tǒng)中,如果進程崩潰了,系統(tǒng)內(nèi)核會捕獲到進程崩潰信息,然后將進程的coredump 信息寫入到文件中,這個文件名默認是core 。存儲位置與對應(yīng)的可執(zhí)行程序在同一目錄下,文件名是core,大家可以通過下面的命令看到core文件的存在位置:
Core_pattern的格式:
%p 轉(zhuǎn)儲過程的PID
%u (數(shù)字)轉(zhuǎn)儲進程的實際UID
%G (數(shù)字)轉(zhuǎn)儲過程的實際GID
%s 引起轉(zhuǎn)儲的信號數(shù)
%t 轉(zhuǎn)儲時間,表示為自1970年1月1日00:00:00 +0000(UTC)以來的秒數(shù)
%H 主機名(與uname(2)返回的節(jié)點名相同)
%e 可執(zhí)行文件名(無路徑前綴)
%E 可執(zhí)行文件的路徑名,用斜杠(’/’)替換為感嘆號(’!’)。
%C 崩潰過程的核心文件大小軟資源限制(自Linux 2.6.24開始)
下面的程序可用于演示/ proc / sys / kernel / core_pattern文件中管道語法的用法。
#include#include #include #include #include #include #define BUF_SIZE 1024 int main(int argc, char *argv[]) { int tot, j; ssize_t nread; char buf[BUF_SIZE]; FILE *fp; char cwd[PATH_MAX]; /* 屬性的當前工作目錄崩潰的過程*/ snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]); chdir(cwd); /* 將輸出寫到該目錄下的文件"core.info" */ fp = fopen("core.info", "w+"); if (fp == NULL) { exit(EXIT_FAILURE); } fprintf(fp, "argc=%d\n", argc); for (j = 0; j < argc; j++) { fprintf(fp, "argc[%d]=<%s>\n", j, argv[j]); } /* 計算標準輸入(核心轉(zhuǎn)儲)中的字節(jié)數(shù)*/ tot = 0; while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0) { tot += nread; } fprintf(fp, "Total bytes in core dump: %d\n", tot); return 0; }
注意一下: 這里是指在進程當前工作目錄的下創(chuàng)建。通常與程序在相同的路徑下。但如果程序中調(diào)用了chdir函數(shù),則有可能改變了當前工作目錄。這時core文件創(chuàng)建在chdir指定的路徑下。有好多程序崩潰了,我們卻找不到core文件放在什么位置。和chdir函數(shù)就有關(guān)系。當然程序崩潰了不一定都產(chǎn)生 core文件。
下面通過的命令可以更改coredump文件的存儲位置,如下:
echo “|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%s” > /proc/sys/kernel/core_pattern
cat /proc/sys/kernel/core_pattern
查看路徑已經(jīng)變?yōu)槿缦拢?/p>
下面帶大家配置永久的core。只要出現(xiàn)內(nèi)存訪問越界、使用空指針、堆棧溢出等情況,都可以在這個目錄下查看。
配置 core
1、首先在根目錄下建立一個儲存coredump文件的文件夾,命令如下:
mkdir /corefile
2、設(shè)置產(chǎn)生coredump文件的大小,命令如下:
ulimit -c unlimited
3、 執(zhí)行以下兩條命令:
echo “1” > /proc/sys/kernel/core_uses_pid //將1寫入到該文件里 echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
將coredump產(chǎn)生的格式制定好寫入core_pattern文件,這樣當coredump產(chǎn)生時會直接以這種格式存入到根目錄下的文件夾corefile中。
4、修改配置文件/etc/profile
vim /etc/profile
添加 ulimit -S -c unlimited > /dev/null 2>&1
執(zhí)行命令生效該文件
5、 在配置文件/etc/rc.local中最后面添加信息(機器重啟時會自動加載該命令):添加命令:
rm -rf /corefile/*
機器重啟時清空該文件夾,由于產(chǎn)生的coredump文件很大,若不清空的話時間長了會將硬盤占滿;
再執(zhí)行以下兩條命令:
echo “1” > /proc/sys/kernel/core_uses_pid echo “/corefile/core-%e-%p-%t” > /proc/sys/kernel/core_pattern
測試
下面寫個例子測試一下是否配置好了corefile文件
#include
編譯運行,注意這里需要-g選項編譯。
進入前面創(chuàng)建的corefile文件夾:
出現(xiàn)core文件表示完成coredump配置??梢杂猛ㄟ^readelf命令進行判斷是否是core文件:
運行g(shù)db閱讀core文件,命令為“gdb 程序 對應(yīng)coredump文件”,這時就進入gdb的提示符“(gdb)”。
從紅色方框截圖可以看到,程序中止是因為信號11。
下面可以通過bt(backtrace)命令(或者where)可以看到函數(shù)的調(diào)用棧情況:
即程序執(zhí)行到test.cpp的第6行是出現(xiàn)段錯誤。原因是指向了空指針。
關(guān)于“l(fā)inux core指的是什么”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識,可以關(guān)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。