1.生成調試資訊
一般來說GDB主要調試的是C/C++的程式。要調試C/C++的程式,首先在編譯時,我們必須要把調試資訊加到可執行檔案中。
使用編譯(gcc/g++)的 -g 參數可以做到這一點
$ gcc -g test.c
$ g++ -g test.cpp
如果沒有-g,你将看不見程式的函數名、變量名,所代替的全是運作時的記憶體位址。
2.啟動GDB
- 啟動gdb
$ gdb program
(program 也就是你的執行檔案,一般在目前目錄下) - 設定運作參數
(gdb) set args
(gdb) set args 10 20 30 “hello world” 6.66
可指定運作時參數。(如:set args 10 20 30 40 50 )
(gdb) show args
(指令可以檢視設定好的運作參數)
- 啟動程式
(gdb) run
(程式開始執行,如果有斷點,停在第一個斷點處)
(gdb) start
(程式向下執行一行)
3.顯示源代碼
用list指令來列印程式的源代碼。預設列印10行。
- 列印第linenm行的上下文内容
(gdb) list linenum
- 顯示函數名為function的函數的源程式
(gdb) list function
- 顯示目前行後面的源程式
(gdb) list
- 顯示目前行前面的源程式
(gdb) list -
- 設定一次顯示源代碼的行數
(gdb) set listsize count
- 檢視目前listsize的設定
(gdb) show listsize
4.斷點操作
-
簡單斷點
break 設定斷點,可以簡寫為b
(gdb) b 6
(gdb) break 6
(gdb) b func
(設定斷點,在func函數入口處)
2.多檔案設定斷點
C++中可以使用class::function或function(type,type)格式來指定函數名。
如果有名稱空間,可以使用namespace::class::function或者function(type,type)格式來指定函數名。
Ø break filename:linenum – 在源檔案filename的linenum行處停住
Ø break filename:function – 在源檔案filename的function函數的入口處停住
Ø break class::function或function(type,type) – 在類class的function函數的入口處停住
Ø break namespace::class::function – 在名稱空間為namespace的類class的function函數的入口處停住
3.查詢所有斷點
info break
info b
i break
i b
(上面所有都等同)
5.條件判斷
一般來說,為斷點設定一個條件,我們使用if關鍵詞,後面跟其斷點條件。
設定一個條件斷點:
b test.c:8 if Value == 5
6.維護斷點
1)delete [range…] 删除指定的斷點,其簡寫指令為d。
如果不指定斷點号,則表示删除所有的斷點。range表示斷點号的範圍(如:3-7)。
比删除更好的一種方法是disable停止點,disable了的停止點,GDB不會删除,當你還需要時,enable即可,就好像資源回收筒一樣。
2) disable [range…] 使指定斷點無效,簡寫指令是dis。
如果什麼都不指定,表示disable所有的停止點。
3) enable [range…] 使無效斷點生效,簡寫指令是ena。
如果什麼都不指定,表示enable所有的停止點。
7.調試代碼
- run 運作程式,可簡寫為r
- next 單步跟蹤,函數調用當作一條簡單語句執行,可簡寫為n
- step 單步跟蹤,函數調進入被調用函數體内,可簡寫為s
- finish 退出進入的函數
- until 在一個循環體内單步跟蹤時,這個指令可以運作程式直到退出循環體,可簡寫為u。
- continue 繼續運作程式,停在下一個斷點的位置,可簡寫為c
- quit 退出gdb,可簡寫為q
8.資料檢視
檢視運作時資料
print 列印變量、字元串、表達式等的值,可簡寫為p
(gdb) p count
(列印count的值)
9.自動顯示
你可以設定一些自動顯示的變量,當程式停住時,或是在你單步跟蹤時,這些變量會自動顯示。相關的GDB指令是display。
- display 變量名
- info display – 檢視display設定的自動顯示的資訊。
- undisplay num(info display時顯示的編号)
- delete display dnums… – 删除自動顯示,dnums意為所設定好了的自動顯式的編号。如果要同時删除幾個,編号可以用空格分隔,如果要删除一個範圍内的編号,可以用減号表示(如:2-5)
- disable display dnums…
- enable display dnums…
- disable和enalbe不删除自動顯示的設定,而隻是讓其失效和恢複。
10.檢視修改變量的值
(gdb) ptype width – 檢視變量width的類型
type = double
(gdb) p width – 列印變量width 的值
$4 = 13
你可以使用set var指令來告訴GDB,width不是你GDB的參數,而是程式的變量名,如:
set var width=47
(将變量var值設定為47)