coredump產生的原因

2021-06-18 18:44:37 字數 1508 閱讀 7001

造成程式coredump的原因很多,這裡根據以往的經驗總結一下:

1 記憶體訪問越界

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

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

c) 使用strcpy, strcat, sprintf, strcmp, strcasecmp等字串操作函式,將目標字串讀/寫爆。應該使用strncpy, strlcpy, strncat, strlcat, snprintf, strncmp, strncasecmp等函式防止讀寫越界。

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

應該使用下面這些可重入的函式,尤其注意紅色標示出來的函式,它們很容易被用錯:

asctime_r(3c) gethostbyname_r(3n) getservbyname_r(3n) ctermid_r(3s) gethostent_r(3n) getservbyport_r(3n) ctime_r(3c) getlogin_r(3c) getservent_r(3n) fgetgrent_r(3c) getnetbyaddr_r(3n) getspent_r(3c) fgetpwent_r(3c) getnetbyname_r(3n) getspnam_r(3c) fgetspent_r(3c) getnetent_r(3n) gmtime_r(3c) gamma_r(3m) getnetgrent_r(3n) lgamma_r(3m) getauclassent_r(3) getprotobyname_r(3n) localtime_r(3c) getauclassnam_r(3) etprotobynumber_r(3n) nis_sperror_r(3n) getauevent_r(3) getprotoent_r(3n) rand_r(3c) getauevnam_r(3) getpwent_r(3c) readdir_r(3c) getauevnum_r(3) getpwnam_r(3c) strtok_r(3c) getgrent_r(3c) getpwuid_r(3c) tmpnam_r(3s) getgrgid_r(3c) getrpcbyname_r(3n) ttyname_r(3c) getgrnam_r(3c) getrpcbynumber_r(3n) gethostbyaddr_r(3n) getrpcent_r(3n)

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

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

4 非法指標

a) 使用空指標

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

5 堆疊溢位

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

Linux開啟產生coredump檔案

在linux上只要開啟core dump檔案開關,當程式crash時系統生成相應的core檔案。檢視當前是否已經開啟了此開關 輸入命令 ulimit c 如果輸出為 0 則代表沒有開啟 如果為unlimited則已經開啟。root localhost ulimit c 0開啟coredump 輸入命...

Docker中產生Core Dump檔案

在linux中,要使得程式崩潰時產生core dump檔案,首先需要設定core檔案的大小,預設的core dump文大小最大為0,也就是預設不產生,在這裡我們就不做限制,執行 ulimit c unlimited可以通過以下命令檢視當前ulimit配置 root proxy demo ulimit...

檢視core dump段錯誤原因

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