ubuntu下報core dump核心轉儲的錯誤

2021-10-07 01:26:21 字數 1704 閱讀 3083

記錄:學習

在此感謝原鏈結博主!

core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在乙個core檔案中, 叫core dump. (linux中如果記憶體越界會收到sigse**訊號,然後就會core dump)

在程式執行的過程中,有的時候我們會遇到segment fault(段錯誤)這樣的錯誤。這種看起來比較困難,因為沒有任何的棧、trace資訊輸出。該種型別的錯誤往往與指標操作相關。往往可以通過這樣的方式進行定位。

一 造成segment fault,產生core dump的可能原因

1.記憶體訪問越界

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

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

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

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

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

4 非法指標

a) 使用空指標

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

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

二 配置作業系統使其產生core檔案

首 先通過ulimit命 令檢視一下系統是否配置支援了dump core的功能。通過ulimit -c或ulimit -a,可以檢視core file大小的配置情況,如果為0,則表示系統關閉了dump core。可以通過ulimit -c unlimited來開啟。若發生了段錯誤,但沒有core dump,是由於系統禁止core檔案的生成。

解決方法:

$ulimit -c unlimited(只對當前shell程序有效)

或在~/.bashrc的最後加入:ulimit -c unlimited(一勞永逸)

# ulimit -c

$ ulimit -a

core file size          (blocks, -c) 0

data seg size           (kbytes, -d) unlimited

file size               (blocks, -f) unlimited

三 用gdb檢視core檔案

發生core dump之後, 用gdb進行檢視core檔案的內容, 以定位檔案中引發core dump的行.

gdb [exec file] [core file]

如: gdb ./test test.core

ubuntu18 安裝Mindaster報錯

1 0513 191503 warning resource bundle qt.cpp 114 locale file path.empty for locale 2 opt mindmaster 6 libexec qtwebengineprocess opt mindmaster 6 libe...

Ubuntu 沿街叫賣的GNU Linux「報童」

3月21 日凌晨1點20 分 格林威治時間 ubuntu 開發團隊正式發表新聞稿,自豪地聲稱 ubuntu 8.04 beta 正式發布。這是乙個很有紀念意義的時刻。為什麼?ubuntu fedora 和opensuse 都稱得上是 gnu linux 發行版,它們都是地地道道的自由軟體包。當然,還...

linux系統ubantu下mysql報錯

2.error 2002 hy000 can t connect to local mysql server through socket var run mysqld mysqld.sock 3.error 1045 28000 access denied for user root localh...