Linux下core dump (段錯誤)

2022-07-22 17:06:20 字數 2749 閱讀 9940

在linux下開發時,如果程式突然崩潰了,也沒有任何日誌。這時可以檢視core檔案。從core檔案中分析原因,通過gdb看出程式掛在**,分析前後的變數,找出問題的原因。

當程式執行的過程中異常終止或崩潰,作業系統會將程式當時的記憶體狀態記錄下來,儲存在乙個檔案中,這種行為就叫做core dump(中文有的翻譯成「核心轉儲」)。我們可以認為 core dump 是「記憶體快照」,但實際上,除了記憶體資訊之外,還有些關鍵的程式執行狀態也會同時 dump 下來,例如暫存器資訊(包括程式指標、棧指標等)、記憶體管理資訊、其他處理器和作業系統狀態和資訊。core dump 對於程式設計人員診斷和除錯程式是非常有幫助的,因為對於有些程式錯誤是很難重現的,例如指標異常,而 core dump 檔案可以再現程式出錯時的情景。

如果沒有進行core dump 的相關設定,預設是不開啟的。可以通過ulimit -c檢視是否開啟。如果輸出為0,則沒有開啟,需要執行ulimit -c unlimited開啟core dump功能。

ulimit

ulimit命令用來限制系統使用者對shell資源的訪問。限制 shell 啟動程序所占用的資源,支援以下各種型別的限制:所建立的核心檔案的大小、程序資料塊的大小、shell 程序建立檔案的大小、記憶體鎖住的大小、常駐記憶體集的大小、開啟檔案描述符的數量、分配堆疊的最大大小、cpu 時間、單個使用者的最大執行緒數、shell 程序所能使用的最大虛擬記憶體。同時,它支援硬資源和軟資源的限制。

-a:顯示目前資源限制的設定;

-c :設定core檔案的最大值,單位為區塊;

-d 《資料節區大小》:程式資料節區的最大值,單位為kb;

-f 《檔案大小》:shell所能建立的最大檔案,單位為區塊;

-h:設定資源的硬性限制,也就是管理員所設下的限制;

-m 《記憶體大小》:指定可使用記憶體的上限,單位為kb;

-n 《檔案數目》:指定同一時間最多可開啟的檔案數;

-p 《緩衝區大小》:指定管道緩衝區的大小,單位512位元組;

-s 《堆疊大小》:指定堆疊的上限,單位為kb;

-s:設定資源的彈性限制;

-t :指定cpu使用時間的上限,單位為秒;

-u 《程式數目》:使用者最多可開啟的程式數目;

-v 《虛擬記憶體大小》:指定可使用的虛擬記憶體上限,單位為kb。

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 the coredump into the filename 新增導致產生core的訊號

%t -insert unix time that the coredump occurred into filename 新增core檔案生成時的unix時間

%h - insert hostname where

%e - insert coredumping executable name into filename 新增命令名

更多請參考core dump file.

會產生錯誤的**如下:

1 #include 2 #include 3 #include 4 #include 5

6#define core_size 500 * 1024 * 102478

intmain()

13 printf("

before set rlimit core dump current is:%d, max is:%d\n

", (int)rlmt.rlim_cur, (int

)rlmt.rlim_max);

1415 rlmt.rlim_cur =(rlim_t)core_size;

16 rlmt.rlim_max =(rlim_t)core_size;

1718

if (setrlimit(rlimit_core, &rlmt) == -1

) 21

22if (getrlimit(rlimit_core, &rlmt) == -1

) 25 printf("

after set rlimit core dump current is:%d, max is:%d\n

", (int)rlmt.rlim_cur, (int

)rlmt.rlim_max);

2627

//對空指標指向的記憶體區域寫,會發生段錯誤 -->產生core檔案

28int *null_ptr =null;

29 *null_ptr = 10;30

31return0;

32 }

使用 gcc 編譯原始檔,加上 -g 以增加除錯資訊;執行會產生錯誤,生成core檔案。

執行gdb core後輸出資訊如下圖:

gdb core: 用gdb同時除錯乙個執行程式和core檔案,core是程式非法執行後core dump後產生的檔案。可以看到程式的問題是core_dump.c檔案中第31行對乙個空指標賦值的錯誤提示。

**:

Linux平台Core Dump分析段錯誤

當linux平台碰到段錯誤 segmentation fault 的時候,可以通過開啟core dump,讓其產生core dump檔案。下面是在ubuntu 18.08使用core dump檔案快速定位段錯誤的例子 echo tmp core e t proc sys kernel core pa...

linux下core dump的妙用

在unix系統中,常將 主記憶體 main memory 稱為核心 core 因為在使用半導體作為記憶體材料之前,便是使用核心 core 而核心映像 core image 就是 程序 process 執行當時的記憶體內容。當程序發生段錯誤或收到 訊號 signal 而終止執行時,系統會將核心映像寫入...

檢視core dump段錯誤原因

當乙個程序要異常終止時,可以選擇把程序的使用者空間記憶體資料全部儲存到磁碟上,檔名通常是core,這叫做core dump 核心轉儲。程序異常終止時因為有bug,比如非法訪問記憶體導致段錯誤。事後可以用偵錯程式檢查core檔案以查清錯誤原因,這叫做事後除錯。乙個程序允許產生多大的core檔案,取決於...