目錄
1.背景
2.指令的使用
2.1gdb的使用和退出
2.2顯示源代碼
2.3運行程序
2.4調試
1.打斷點
2.查斷點
3.去斷點
4.運行
5.關閉斷點
6.啟用斷點
7.逐過程
8.進入函數
9.顯示變量的值
1.背景
眾所周知,我們的程序發布有兩種,分別是debug模式和release模式,在Linux中我們主要有兩種編譯器——gcc和g++,一個是編譯C語言程序的,一個是編譯C++程序的,當我們使用這些編譯器進行匯編步驟的時候,會生成一個二進制文件,Linux系統中默認它是release模式的。那如果我們想使用gdb調試器來進行調試的話該怎么做呢?
我們需要在源代碼生成二進制程序的時候, 加上 -g 選項。(如圖所示)
由上圖所示,我們可以看到生成了一個testdebug的二進制文件。
gdb調試器對debug模式的文件才能使用,所以我們才要生成testdebug這個文件。
接下來我就來講解一些指令要如何去使用。
2.指令的使用
2.1gdb的使用和退出
我們使用gdb直接gdb 文件就行了。
如圖所示,這就說明我們的gdb使用成功了。
那么我怎么退出呢?
很簡單,直接quit就能退出了。
2.2顯示源代碼
list/l 行號:顯示binFile源代碼,接著上次的位置往下列,每次列10行。
這是我們簡單寫的一段代碼,接下來我會用它來進行舉例說明。
如圖所示,我們使用list/l時一次顯示10行,我們再按回車就會再打印10行,打印完了就會停下,我們再來看看list/l + 行號:
我們發現list/l + 行號不是從你輸入的行號開始往后顯示10行,而是以你輸入的為中間值,顯示上下文,總共為10行。如果沒有下文它就不顯示下文嘛(沒有上文同理),如圖所示:
我們也可以加函數名來進行顯示:
如上圖所示,我們使用list/l + 函數名的方式也是查函數名的上下文總共為10個。
2.3運行程序
r或run:運行程序。
第一行表示的是我們開始運行的項目還有這個項目的位置,第二行exited normally表示的是程序正常運行結束。
2.4調試
1.打斷點
我們可以b + 行號/函數名。
第二行的意思就是打了一個序號為1的斷點,后面的十六進制就是它的地址,test.c就是文件名,行數在第十行。
2.查斷點
info break :查看斷點信息。(也可以簡寫成i b)
由此我們就可以看到它的斷點個數、序號,Disp我們先不管,Enb表達的是它的使能,就是說這個斷點是開啟的狀態(y)還是關閉的狀態(n),后面的信息就是它的地址,還有在哪個文件.
3.去斷點
delete?breakpoints?n:刪除序號為n的斷點(d 序號)
4.運行
我們在第十五行的時候打了一個斷點,所以運行在第十五行的位置停了下來。
5.關閉斷點
disable?breakpoints:禁用斷點
如圖所示,我們保留了序號為二的斷電且禁用了它。
6.啟用斷點
disable?breakpoints:禁用斷點
如圖所示,使能又變回了y。
7.逐過程
n 或 next:單條執行。
我們在run運行后自動到了我們的斷點位置,接下來我們輸入n/next就可以逐過程調試了,由于Linux的gdb會自動記錄上一次的指令,所以我們直接一直回車就可以了。
8.進入函數
s或step:進入函數調用
沒遇到函數前我們還是繼續n,到函數的時候我們輸入s/step,就進入到我們的函數中了。
9.顯示變量的值
p/print 變量:打印變量值。
如圖所示,我們a,b加起來是2,所以我們的c=a+b就是2,$后面的數字表示查詢了幾次。
display?變量名:跟蹤查看一個變量,每次停下來都顯示它的值
undisplay:取消對先前設置的那些變量的跟蹤
這里記住輸入的不是變量名,而是它前面的序號。