coredump分析

一.什麼是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進行調試即可。


發佈了61 篇原創文章 · 獲贊 20 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章