一.什麼是coredump?
coredump一般是指程式在linux下出現某些bug或者異常之後造成程式異常退出或者終止,并在一定條件下生成的一個叫做core的檔案,其中包含了程式運作時的記憶體,寄存器狀态,堆棧指針,記憶體管理資訊還有各種函數調用堆棧資訊等。
我們可以了解為這是程式在崩潰處的各種臨時狀态儲存檔案,通過工具分析這個檔案我們可以知道程式在異常退出時的各種臨時狀态,找出其異常資訊并進行定位修改。
二.coredump産生的原因
coredump産生的原因可以分為以下幾個大的的方面:
1.記憶體通路越界
包括數組下标越界,c風格字元串沒有結尾符号而導緻的通路越界,字元串操作函數造成的讀寫越界問題
2.多線程使用了不安全函數
主要是一些可重入函數,所謂可重入函數即是可以被中斷的函數,也就是說,可以在這個函數執行的任何時刻中斷它,轉入OS排程下去執行另外一段代碼,然後再傳回繼續執行這段函數。
3.被多個線程同時通路的資料未加上鎖
可通過臨界區和信号量等來保護臨界資源,避免被多個函數同時修改
4.使用非法的指針
包括空指針,野指針和不正确的指針類型轉換造成的記憶體通路錯誤
5.棧溢出
由于遞歸函數不收斂等原因而造成的程式棧溢出,局部變量和函數形參等資訊在執行時都是壓入到棧上的,棧的大小一般在1M到4M之間。
三.coredump的定位分析
可以進行coredump定位分析的工具很多,其中比較常用的是GDB,GDB是linux下一個非常強大的調試分析工具,下面是幾個常用的GDB指令 記住幾個常用的gdb指令:
l(list) ,顯示源代碼,并且可以看到對應的行号;
b(break)x, x是行号,表示在對應的行号位置設定斷點;
p(print)x, x是變量名,表示列印變量x的值
r(run), 表示繼續執行到斷點的位置
n(next),表示執行下一步
c(continue),表示繼續執行
q(quit),表示退出gdb
調試時進入到 對應的core檔案生成目錄,優先确認是否core檔案格式并啟用gdb進行調試即可。