一、錯誤代號
一般出現core會由以下幾種型別的錯誤觸發生成:
1. sigsegv 段錯誤(訊號11),說白了就是訪問了非法記憶體位址,無論是超出程序範圍的(位址越界)還是系統不存在的記憶體訪問(指標指向空)
2. sigabrt 檢測異常(訊號6) 呼叫了abort()函式導致,最常見的是對釋放的記憶體(free())再次進行釋放,或者記憶體分配失敗等原因的時候會觸發
3. sigbus本意是指匯流排錯誤(訊號7),一般出現在當你訪問一段非法位址,並且這段位址物理上是不存在的。它類似於sigsegv,後者也是訪問非法位址,但是這個位址是 虛擬位址空間的位址,sigbus正好相反,由於某些機器上,物理空間存在不連續的情況,訪問到這些hole時,就會產生這個訊號。硬體故障。
4. sigill 一般是硬體方面的問題,比如用%s格式直接輸出string型別的(沒有通過c_str()轉換)一般會導致這個訊號並退出程序(一般編譯時就會提示cannot pass objects of non-pod type …call will abort at runtime)。
二、環境檢視
檢視堆疊資訊:
1. backstrace, 簡寫bt :列印當前的函式呼叫棧的所有資訊
2. frame[n], 簡寫f :切換到堆疊的第n層
3. up/down, 在堆疊中向上或者向下移動
4. info frame 列印更詳細的當前棧層的資訊,包括一些暫存器的資訊
5. info args 列印出當前函式的引數名及值
6. info locals 列印出當前函式中所有區域性變數及其值
檢視變數:
命令:print [/fmt] [expr]
/fmt 是格式化的控制符,常用控制如下:
x 16進製制 u 無符號
o 八進位制 t 二進位制
a 位址 c 字元常量
f 浮點數
expr 可以是當前程式執行中的const常量、變數、函式等內容,但是不能使用程式中所定義的巨集。
表示式可以使用修飾符: var@n 表示將var看成長度是n的陣列 注:這個我沒看懂是什麼意思
usage: p /x array
在gdb中可以隨時檢視以下三種變數:
1. 全域性變數 2. 靜態變數 3.區域性變數
對於全域性變數與區域性變數名字產生衝突時,一般會列印區域性變數的內容。為解決衝突,可以加入作用域修飾符:
scope::var 檢視作用域內的var變數,scope可以是檔案或函式
void shop::update()
可使用p 'shop::update'::t1進行檢視
檢視記憶體:
命令: x /nfu address 按照指定的格式檢視記憶體資料
n 是乙個正整數,表示顯示的個數
f 表示顯示的格式,參考之前的print的格式控制。
如果位址所指的是字串,那麼格式可以是s, 如果位址是指令位址,那麼格式可以是i
u 表示從當前位址往後每個請求的位元組數,如果不指定預設是4位元組,b表示單位元組,h表示雙位元組,w表示四位元組,g表示八字節
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...