用gdb分析coredump檔案

2021-09-22 10:15:40 字數 2427 閱讀 1075

一 基本概念

gdb可以用於分析coredump檔案。core檔案又稱為coredump檔案。

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

二 coredump檔案的儲存路徑

[root@localhost charpter05]# cat /proc/sys/kernel/core_pattern

core

預設值是core,也就是當前目錄,如果不是core,則在指定目錄下。

這裡是指在程序當前工作目錄下建立。通常在與程式在相同路徑下。但如果程式中呼叫了chdir函式,則有可能改變當前工作目錄。這時core檔案建立在chdir指定的路徑下。

通過下面命令改變coredump檔案的儲存位置

[root@localhost charpter05]# echo "/data/coredump/core" > /proc/sys/kernel/core_pattern

[root@localhost charpter05]# cat /proc/sys/kernel/core_pattern

/data/coredump/core

此時core檔案生成到/data/coredump/core

指定core檔案的名稱為core.filename.pid

[root@localhost charpter05]# echo "/data/coredump/core.%e.%p" > /proc/sys/kernel/core_pattern

[root@localhost charpter05]# cat /proc/sys/kernel/core_pattern

/data/coredump/core.%e.%p

產生的core檔案將帶有崩潰的程式名、以及它的程序id。上面的%e和%p會被替換成程式檔名以及程序的id。

[root@localhost charpter05]# cat /proc/sys/kernel/core_uses_pid

1

如果這個檔案的內容配置為1,那麼即使core_pattern中沒有配置%p,最後生成的core dump檔案也會加上程序的id。

三 產生coredump檔案的條件

1 首先需要確認當前會話能生成coredump檔案大小,若大小為0,則不會生成coredump。

[root@localhost charpter05]# ulimit -c

0

該命令檢視coredump檔案大小的最大值。

[root@localhost charpter05]# ulimit -c unlimited

[root@localhost charpter05]# ulimit -c

unlimited

該命令設定coredump檔案的大小為不受限制,該命令只對當前會話有效。

在/etc/profile中加入下面一行,將允許生成coredump檔案

ulimit -c unlimited
2 當前使用者,即執行程式的使用者具有對寫入core目錄的寫許可權以及足夠的空間。

四 產生coredump檔案的原因

1 記憶體訪問越界

1.1 由於使用錯誤的下標,導致陣列訪問越界。

1.2 搜尋字串時,依靠字串結束符來判斷字串是否結束,但字串沒有正常的使用結束符。

1.3 使用strcpy、strcat、sprintf、strcmp、strcasecmp等字串操作函式時,容易出現將目標字串讀/寫越界的情況。應該使用strncpy、strlcpy、strncat、strlcat、snprintf、strncmp、strncasecmp等函式防止讀寫越界。

2 多執行緒程式使用了執行緒不安全函式

可重入函式參考:

3 多執行緒讀寫的資料未加鎖處理

對於會被多個執行緒同時訪問的全域性資料,應該注意加鎖包含,否則很容易造成coredump。

4 非法指標,包括使用空指標或隨意使用指標轉換

5 堆疊溢位

不要使用大的區域性變數,因為區域性變數都分配在棧上,這樣很容易造成堆疊溢位,破壞系統的棧和堆結構,導致出現莫名其妙的錯誤。

用gdb除錯core dump檔案

在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.開發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示co...

用gdb除錯coredump檔案

在unix系統下,應用程式崩潰,一般會產生core檔案,如何根據core檔案查詢問題的所在,並做相應的分析和除錯,是非常重要的。什麼是core dump?core的意思是記憶體,dump的意思是扔出來,堆出來.開 發和使用unix程式時,有時程式莫名其妙的down了,卻沒有任何的提示 有時候會提示c...

用gdb除錯core dump檔案

gdb基本的使用方法在此就不說了。載入core檔案的命令行為 dgb exe core 例如gdb testall core.2345 最重要的乙個命令是where,這個就像windbg的命令 analyze v 我模擬了幾個crash的情況,乙個乙個說。第乙個 刪除兩次指標導致crash的情況 源...