檢視core dump段錯誤原因

2021-08-20 11:10:41 字數 1254 閱讀 9208

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

乙個程序允許產生多大的core檔案,取決於程序的resource limit。預設是不允許產生core檔案的。在開發除錯階段可以用ulimit命令改變這個限制,允許產生core檔案。

ulimit -a

命令可以檢視當前系統允許產生的core檔案大小,一般在第一行為0.

ulimit -c 1024

將core檔案允許大小改為1kb。

gcc -g xx.c -o xx

將需要除錯的程式加入-g除錯資訊重新編譯

./xx

執行xx程式,依舊是段錯誤,不過這次生成了乙個core檔案在當前目錄下。

gdb ./xx core.2134

gdb除錯一下可執行檔案,會發現有提示程式在哪一行終止,並且終止訊號是多少。

一般的線上伺服器上都有自重啟程序的程序,負責把掛掉的程序重新提起來,若是這時產生過大的core檔案會把伺服器寫滿產生意想不到的麻煩。

記憶體訪問越界

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

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

c) 使用strcpy, strcat, sprintf, strcmp,strcasecmp等字串操作函式,將目標字串讀/寫爆。

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

多執行緒讀寫的資料未加鎖保護。

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

非法指標

a) 使用空指標

b) 隨意使用指標轉換。乙個指向一段記憶體的指標,除非確定這段記憶體原先就分配為某種結構或型別,或者這種結構或型別的陣列,否則不要將它轉換為這種結構或型別的指標,而應該將這段記憶體拷貝到乙個這種結構或型別中,再訪問這個結構或型別。這是因為如果這段記憶體的開始位址不是按照這種結構或型別對齊的,那麼訪問它時就很容易因為bus error而core dump。

堆疊溢位

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

Linux下core dump (段錯誤)

在linux下開發時,如果程式突然崩潰了,也沒有任何日誌。這時可以檢視core檔案。從core檔案中分析原因,通過gdb看出程式掛在 分析前後的變數,找出問題的原因。當程式執行的過程中異常終止或崩潰,作業系統會將程式當時的記憶體狀態記錄下來,儲存在乙個檔案中,這種行為就叫做core dump 中文有...

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...

PAT段錯誤原因

最近在刷pat,會出現段錯誤這類錯誤,總結一下段錯誤的出現原因。陣列越界 陣列越界應該是最常見的段錯誤了,一般在定義陣列的時候大小可能有所偏差,注意題目中的陣列範圍即可。堆疊溢位 在寫遞迴的時候,可能會出現遞迴呼叫層數太多導致堆疊溢位,可以將大陣列作為全域性變數,可以開到很大避免溢位。變數未初始化 ...