什麼是core dump
core dump又叫核心轉儲, 當程式執行過程中發生異常, 程式異常退出時, 由作業系統把程式當前的記憶體狀況儲存在乙個core檔案中, 叫core dump。 (linux中如果記憶體越界會收到sigsegv訊號,然後就會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 -cunlimited來開啟。若發生了段錯誤,但沒有core dump,是由於系統禁止core檔案的生成。
解決方法:
$ulimit -c unlimited(只對當前shell程序有效)
或在~/.bashrc 的最後加入:
ulimit -c unlimited
(一勞永逸)
# ulimit -c 0
$ 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
然後使用
bt檢視呼叫堆疊。
GDB除錯core檔案
1.什麼是core dump?core dump說的是作業系統執行的乙個動作,當某個程序因為一些原因意外終止 crash 的時候,作業系統會將這個程序當時的記憶體資訊轉儲 dump 到磁碟上,產生的檔案就是core檔案了,一般會以core.形式命名。2.那些訊號能夠引起core dump?經常用到的...
GDB除錯core檔案
core檔案是程式執行狀態的記憶體映像當程式執行過程 現segmentation fault core dumped 錯誤時,程式停止執行,並產生core檔案。使用gdb除錯core檔案可以幫我們快速定位程式出現段錯誤的位置。可執行程式編譯時應加上 g編譯選項,生成除錯資訊閉。當程式訪問的記憶體超出...
gdb除錯core檔案
本人最近正在學習除錯技術,此處對棧溢位做一些總結。gdb的基本使用就不多扯了。主要針對發行在外的release版本的軟體出現問題時的除錯。一般來講,檢視堆疊就是使用bt,這個時候加上bt full會讓你更加滿意,因為這裡面可以顯示出區域性變數資訊。另一點是檢視暫存器中的值,主要是sp和ip。指令 i...