使用GDB除錯core檔案時的一些基本知識

2021-06-28 06:37:47 字數 1598 閱讀 2408

一、錯誤代號

一般出現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...