天天看點

GDB調試實戰1. GDB安裝2. 啟動GDB

目前工作大概有兩年時間了,調試的時候一直是通過加log,或者是使用Vscode自帶的Debug工具進行調試,前一段時間又學習了通過在Vscode中添加條件表達式進行Debug,但是以上調試方法在遇到段錯誤時,就不太奏效了。今天在調試程式的時候發生了一個段錯誤的問題,借此機會正式學習了一下如何使用gdb工具進行調試。

下面示範過程中,有些涉及到項目代碼的地方就不給大家展示了,關注過程就好。

1. GDB安裝

關于GDB工具的安裝,隻需要輸入以下簡單的指令就可以了

apt-get update
apt-get install gdb
           

2. 啟動GDB

首先通過gdb啟動程式,輸入gdb + 程式名

GDB調試實戰1. GDB安裝2. 啟動GDB

輸入“r”指令将程式運作起來。

GDB調試實戰1. GDB安裝2. 啟動GDB

接下來,等待程式運作,再現BUG,發生segementation fault

GDB調試實戰1. GDB安裝2. 啟動GDB

此時,輸入“bt”指令檢視堆棧:

GDB調試實戰1. GDB安裝2. 啟動GDB

從堆棧上,我們可以清楚的看到,最終在調用dMutexLock的時候程式崩掉了。對應源碼檢視了一下,懷疑可能是調用這個方法的時候,變量的記憶體位址被破壞了。

下面,我們就想辦法來監測一下這個變量位址的變化,看看是否有異常。

首先輸入“b”指令,來添加斷點,添加斷點的文法如下:

b filename:[line/function]  在檔案filename的某行或某個函數處設定斷點
           

添加斷點後,輸入“r”指令運作程式,程式運作到斷點處,便會停下來。然後通過輸入“p”指令,将變量列印出來。

GDB調試實戰1. GDB安裝2. 啟動GDB

得到了變量的記憶體位址以後,通過“watch”指令觀察這塊位址的變化,随後将通過“delete”指令将之前的斷點删除,輸入“c”指令繼續執行程式

GDB調試實戰1. GDB安裝2. 啟動GDB

等到我們所觀察的記憶體位址被修改的時候,程式便會被中斷,通過觀察中斷位置的代碼,發現問題是由于數組越界導緻。

GDB調試實戰1. GDB安裝2. 啟動GDB

檢視此時的堆棧可以再次輸入“bt”指令,看完堆棧後,終于定位到了發生數組越界的位置,加以修改後問題就解決了。

GDB調試實戰1. GDB安裝2. 啟動GDB