轉自:http://www.cnblogs.com/rosesmall/archive/2012/04/13/2445300.html
gdb使用方法簡介編譯時必須加上參數(shù)-g ,例:g++ -g temp.cpp -o temp.通過Gcc編譯生成可執(zhí)行文件才能用Gdb進行調試。
進入gdb界面:gdb temp. 提示符變成(gdb)
(1)查看文件
在Gdb中鍵入”l”(list)就可以查看所載入的文件
(2)設置斷點
只需在”b”后加入對應的行號即可(這是最常用的方式,另外還有其他方式設置斷點)。如下所示:
(gdb)b 6
代碼運行到第五行之前暫停(并沒有運行第五行)。
(3)查看斷點情況
(Gdb) info b
(4)運行代碼
Gdb默認從首行開始運行代碼,可鍵入”r”(run)即可(若想從程序中指定行開始運行,可在r后面加上行號)。
(5)查看變量值
查看斷點處的相關變量值。在Gdb中只需鍵入”p”+變量值即可,如下所示:
(Gdb) p n
Gdb在顯示變量值時都會在對應值之前加上”$N”標記,它是當前變量值的引用標記,所以以后若想再次引用此變量就可以直接寫作”$N”,而無需寫冗長的變量名。
(6)單步運行
使用命令”n”(next)或”s”(step),它們之間的區(qū)別在于:若有函數(shù)調用的時候,”s”會進入該函數(shù)而”n”不會進入該函數(shù)。因此,”s”就類似于VC等工具中的”step in”,”n”類似與VC等工具中的”step over”。
(7)恢復程序運行
使用命令”c”(continue).
在Gdb中,程序的運行狀態(tài)有“運行”、“暫?!焙汀巴V埂比N,其中“暫?!睜顟B(tài)為程序遇到了斷點或觀察點之類的,程序暫時停止運行,而此時函數(shù)的地址、函數(shù)參數(shù)、函數(shù)內的局部變量都會被壓入“?!保⊿tack)中。故在這種狀態(tài)下可以查看函數(shù)的變量值等各種屬性。但在函數(shù)處于“停止”狀態(tài)之后,“?!本蜁詣映蜂N,它也就無法查看各種信息了。
Gdb中的命令主要分為以下幾類:工作環(huán)境相關命令、設置斷點與恢復命令、源代碼查看命令、查看運行數(shù)據(jù)相關命令及修改運行參數(shù)命令。以下就分別對這幾類的命令進行講解。
1.工作環(huán)境相關命令
set args運行時的參數(shù)
指定運行時參數(shù),如:set args 2
show args
查看設置好的運行參數(shù)
path dir
設定程序的運行路徑
show paths
查看程序的運行路徑
set enVironment var [=value]
設置環(huán)境變量
show enVironment [var]
查看環(huán)境變量
cd dir
進入到dir目錄,相當于shell中的cd命令
pwd
顯示當前工作目錄
shell command
運行shell的command命令
2.設置斷點與恢復命令
info b
查看所設斷點
break 行號或函數(shù)名 <條件表達式>
設置斷點
tbreak 行號或函數(shù)名 <條件表達式>
設置臨時斷點,到達后被自動刪除
delete [斷點號]
刪除指定斷點,其斷點號為”info b”中的第一欄。若缺省斷點號則刪除所有斷點
disable [斷點號]]
停止指定斷點,使用”info b”仍能查看此斷點。同delete一樣,省斷點號則停止所有斷點
enable [斷點號]
激活指定斷點,即激活被disable停止的斷點
condition [斷點號] <條件表達式>
修改對應斷點的條件
ignore [斷點號]<num>
在程序執(zhí)行中,忽略對應斷點num次
step
單步恢復程序運行,且進入函數(shù)調用
next
單步恢復程序運行,但不進入函數(shù)調用
finish
運行程序,直到當前函數(shù)完成返回
c
繼續(xù)執(zhí)行函數(shù),直到函數(shù)結束或遇到新的斷點
由于設置斷點在Gdb的調試中非常重要,所以在此再著重講解一下Gdb中設置斷點的方法。
Gdb中設置斷點有多種方式:其一是按行設置斷點,設置方法在3.5.1節(jié)已經(jīng)指出,在此就不重復了。另外還可以設置函數(shù)斷點和條件斷點,在此結合上一小節(jié)的代碼,具體介紹后兩種設置斷點的方法。
① 函數(shù)斷點
(gdb) b 函數(shù)名
② 條件斷點
格式為:b 行數(shù)或函數(shù)名 if 表達式
(gdb) b 8 if i==10
3.Gdb中源碼查看相關命令
list <行號>|<函數(shù)名>
查看指定位置代碼
file [文件名]
加載指定文件
forward-search 正則表達式
源代碼前向搜索
reverse-search 正則表達式
源代碼后向搜索
dir dir
停止路徑名
show directories
顯示定義了的源文件搜索路徑
info line
顯示加載到Gdb內存中的代碼
4.Gdb中查看運行數(shù)據(jù)相關命令
指當程序處于“運行”或“暫?!睜顟B(tài)時,可以查看的變量及表達式的信息
print 表達式|變量
查看程序運行時對應表達式和變量的值
x <n/f/u>
查看內存變量內容。其中n為整數(shù)表示顯示內存的長度,f表示顯示的格式,u表示從當前地址往后請求顯示的字節(jié)數(shù)
display 表達式
設定在單步運行或其他情況中,自動顯示的對應表達式的內容
5.Gdb中修改運行參數(shù)相關命令
Gdb還可以修改運行時的參數(shù),并使該變量按照用戶當前輸入的值繼續(xù)運行。它的設置方法為:在單步執(zhí)行的過程中,鍵入命令“set 變量=設定值”。這樣,在此之后,程序就會按照該設定的值運行了。下面,筆者結合上一節(jié)的代碼將n的初始值設為4,其代碼如下所示:
(Gdb) b 7
Breakpoint 5 at 0x804847a: file test.c, line 7.
(Gdb) r
Starting program: /home/yul/test
The sum of 1-m is 1275
Breakpoint 5, main () at test.c:7
7 for(i=1; i<=50; i++)
(Gdb) set n=4
(Gdb) c
Continuing.
The sum of 1-50 is 1279
Program exited with code 031.
可以看到,最后的運行結果確實比之前的值大了4。
Gdb的使用切記點:
· 在Gcc編譯選項中一定要加入”-g”。
· 只有在代碼處于“運行”或“暫停”狀態(tài)時才能查看變量值。
· 設置斷點后程序在指定行之前停止。