【正文】
Tree, form = {...}} show print union 查看聯(lián)合體數(shù)據(jù)的顯示方式 set print object on/off 在C++中,如果一個(gè)對(duì)象指針指向其派生類,如果打開(kāi)這個(gè)選項(xiàng),GDB會(huì)自動(dòng)按照虛方法調(diào)用的規(guī)則顯示輸出,如果關(guān)閉這個(gè)選項(xiàng)的話,GDB就不管虛函數(shù)表了。這個(gè)選項(xiàng)默認(rèn)是off。 show print object 查看對(duì)象選項(xiàng)的設(shè)置。 set print staticmembers on/off 這個(gè)選項(xiàng)表示,當(dāng)顯示一個(gè)C++對(duì)象中的內(nèi)容是,是否顯示其中的靜態(tài)數(shù)據(jù)成員。默認(rèn)是on。 show print staticmembers 查看靜態(tài)數(shù)據(jù)成員選項(xiàng)設(shè)置。 set print vtbl on/off 當(dāng)此選項(xiàng)打開(kāi)時(shí),GDB將用比較規(guī)整的格式來(lái)顯示虛函數(shù)表時(shí)。其默認(rèn)是關(guān)閉的。 show print vtbl 查看虛函數(shù)顯示格式的選項(xiàng)。 歷史記錄當(dāng)你用GDB的print查看程序運(yùn)行時(shí)的數(shù)據(jù)時(shí),你每一個(gè)print都會(huì)被GDB記錄下來(lái)。GDB會(huì)以$1, $2, $3 .....這樣的方式為你每一個(gè)print命令編上號(hào)。于是,你可以使用這個(gè)編號(hào)訪問(wèn)以前的表達(dá)式,如$1。這個(gè)功能所帶來(lái)的好處是,如果你先前輸入了一個(gè)比較長(zhǎng)的表達(dá)式,如果你還想查看這個(gè)表達(dá)式的值,你可以使用歷史記錄來(lái)訪問(wèn),省去了重復(fù)輸入。 GDB環(huán)境變量你可以在GDB的調(diào)試環(huán)境中定義自己的變量,用來(lái)保存一些調(diào)試程序中的運(yùn)行數(shù)據(jù)。要定義一個(gè)GDB的變量很簡(jiǎn)單只需。使用GDB的set命令。GDB的環(huán)境變量和UNIX一樣,也是以$起頭。如: set $foo = *object_ptr 使用環(huán)境變量時(shí),GDB會(huì)在你第一次使用時(shí)創(chuàng)建這個(gè)變量,而在以后的使用中,則直接對(duì)其賦值。環(huán)境變量沒(méi)有類型,你可以給環(huán)境變量定義任一的類型。包括結(jié)構(gòu)體和數(shù)組。 show convenience 該命令查看當(dāng)前所設(shè)置的所有的環(huán)境變量。 這是一個(gè)比較強(qiáng)大的功能,環(huán)境變量和程序變量的交互使用,將使得程序調(diào)試更為靈活便捷。例如: set $i = 0 print bar[$i++]contents 于是,當(dāng)你就不必,print bar[0]contents, print bar[1]contents地輸入命令了。輸入這樣的命令后,只用敲回車,重復(fù)執(zhí)行上一條語(yǔ)句,環(huán)境變量會(huì)自動(dòng)累加,從而完成逐個(gè)輸出的功能。 查看寄存器要查看寄存器的值,很簡(jiǎn)單,可以使用如下命令: info registers 查看寄存器的情況。(除了浮點(diǎn)寄存器) info allregisters 查看所有寄存器的情況。(包括浮點(diǎn)寄存器) info registers regname ... 查看所指定的寄存器的情況。 寄存器中放置了程序運(yùn)行時(shí)的數(shù)據(jù),比如程序當(dāng)前運(yùn)行的指令地址(ip),程序的當(dāng)前堆棧地址(sp)等等。你同樣可以使用print命令來(lái)訪問(wèn)寄存器的情況,只需要在寄存器名字前加一個(gè)$符號(hào)就可以了。如:p $eip。 改變程序的執(zhí)行一旦使用GDB掛上被調(diào)試程序,當(dāng)程序運(yùn)行起來(lái)后,你可以根據(jù)自己的調(diào)試思路來(lái)動(dòng)態(tài)地在GDB中更改當(dāng)前被調(diào)試程序的運(yùn)行線路或是其變量的值,這個(gè)強(qiáng)大的功能能夠讓你更好的調(diào)試你的程序,比如,你可以在程序的一次運(yùn)行中走遍程序的所有分支。 修改變量值修改被調(diào)試程序運(yùn)行時(shí)的變量值,在GDB中很容易實(shí)現(xiàn),使用GDB的print命令即可完成。如: (gdb) print x=4 x=4這個(gè)表達(dá)式是C/C++的語(yǔ)法,意為把變量x的值修改為4,如果你當(dāng)前調(diào)試的語(yǔ)言是Pascal,那么你可以使用Pascal的語(yǔ)法:x:=4。 在某些時(shí)候,很有可能你的變量和GDB中的參數(shù)沖突,如: (gdb) whatis width type = double (gdb) p width $4 = 13 (gdb) set width=47 Invalid syntax in expression. 因?yàn)?,set width是GDB的命令,所以,出現(xiàn)了“Invalid syntax in expression”的設(shè)置錯(cuò)誤,此時(shí),你可以使用set var命令來(lái)告訴GDB,width不是你GDB的參數(shù),而是程序的變量名,如: (gdb) set var width=47 另外,還可能有些情況,GDB并不報(bào)告這種錯(cuò)誤,所以保險(xiǎn)起見(jiàn),在你改變程序變量取值時(shí),最好都使用set var格式的GDB命令。 跳轉(zhuǎn)執(zhí)行一般來(lái)說(shuō),被調(diào)試程序會(huì)按照程序代碼的運(yùn)行順序依次執(zhí)行。GDB提供了亂序執(zhí)行的功能,也就是說(shuō),GDB可以修改程序的執(zhí)行順序,可以讓程序執(zhí)行隨意跳躍。這個(gè)功能可以由GDB的jump命令來(lái)完: jump linespec 指定下一條語(yǔ)句的運(yùn)行點(diǎn)。linespce可以是文件的行號(hào),可以是file:line格式,可以是+num這種偏移量格式。表式著下一條運(yùn)行語(yǔ)句從哪里開(kāi)始。 jump address 這里的address是代碼行的內(nèi)存地址。 注意,jump命令不會(huì)改變當(dāng)前的程序棧中的內(nèi)容,所以,當(dāng)你從一個(gè)函數(shù)跳到另一個(gè)函數(shù)時(shí),當(dāng)函數(shù)運(yùn)行完返回時(shí)進(jìn)行彈棧操作時(shí)必然會(huì)發(fā)生錯(cuò)誤,可能結(jié)果還是非常奇怪的,甚至于產(chǎn)生程序Core Dump。所以最好是同一個(gè)函數(shù)中進(jìn)行跳轉(zhuǎn)。 熟悉匯編的人都知道,程序運(yùn)行時(shí),有一個(gè)寄存器用于保存當(dāng)前代碼所在的內(nèi)存地址。所以,jump命令也就是改變了這個(gè)寄存器中的值。于是,你可以使用“set $pc”來(lái)更改跳轉(zhuǎn)執(zhí)行的地址。如: set $pc = 0x485 產(chǎn)生信號(hào)量使用singal命令,可以產(chǎn)生一個(gè)信號(hào)量給被調(diào)試的程序。如:中斷信號(hào)Ctrl+C。這非常方便于程序的調(diào)試,可以在程序運(yùn)行的任意位置設(shè)置斷點(diǎn),并在該斷點(diǎn)用GDB產(chǎn)生一個(gè)信號(hào)量,這種精確地在某處產(chǎn)生信號(hào)非常有利程序的調(diào)試。 語(yǔ)法是:signal singal,UNIX的系統(tǒng)信號(hào)量通常從1到15。所以singal取值也在這個(gè)范圍。 single命令和shell的kill命令不同,系統(tǒng)的kill命令發(fā)信號(hào)給被調(diào)試程序時(shí),是由GDB截獲的,而single命令所發(fā)出一信號(hào)則是直接發(fā)給被調(diào)試程序的。 強(qiáng)制函數(shù)返回如果你的調(diào)試斷點(diǎn)在某個(gè)函數(shù)中,并還有語(yǔ)句沒(méi)有執(zhí)行完。你可以使用return命令強(qiáng)制函數(shù)忽略還沒(méi)有執(zhí)行的語(yǔ)句并返回。 return return expression 使用return命令取消當(dāng)前函數(shù)的執(zhí)行,并立即返回,如果指定了expression,那么該表達(dá)式的值會(huì)被認(rèn)作函數(shù)的返回值。 強(qiáng)制調(diào)用函數(shù)call expr 表達(dá)式中可以一是函數(shù),以此達(dá)到強(qiáng)制調(diào)用函數(shù)的目的。并顯示函數(shù)的返回值,如果函數(shù)返回值是void,那么就不顯示。 另一個(gè)相似的命令也可以完成這一功能——print,print后面可以跟表達(dá)式,所以也可以用他來(lái)調(diào)用函數(shù),print和call的不同是,如果函數(shù)返回void,call則不顯示,print則顯示函數(shù)返回值,并把該值存入歷史數(shù)據(jù)中。 在不同語(yǔ)言中使用GDBGDB支持下列語(yǔ)言:C, C++, Fortran, PASCAL, Java, Chill, assembly, 和 Modula2。一般說(shuō)來(lái),GDB會(huì)根據(jù)你所調(diào)試的程序來(lái)確定當(dāng)然的調(diào)試語(yǔ)言,比如:發(fā)現(xiàn)文件名后綴為“.c”的,GDB會(huì)認(rèn)為是C程序。文件名后綴為“.C, .cc, .cp, .cpp, .cxx, .c++”的,GDB會(huì)認(rèn)為是C++程序。而后綴是“.f, .F”的,GDB會(huì)認(rèn)為是Fortran程序,還有,后綴為如果是“.s, .S”的會(huì)認(rèn)為是匯編語(yǔ)言。也就是說(shuō),GDB會(huì)根據(jù)你所調(diào)試的程序的語(yǔ)言,來(lái)設(shè)置自己的語(yǔ)言環(huán)境,并讓GDB的命令跟著語(yǔ)言環(huán)境的改變而改變。比如一些GDB命令需要用到表達(dá)式或變量時(shí),這些表達(dá)式或變量的語(yǔ)法,完全是根據(jù)當(dāng)前的語(yǔ)言環(huán)境而改變的。例如C/C++中對(duì)指針的語(yǔ)法是*p,而在Modula2中則是p^。并且,如果你當(dāng)前的程序是由幾種不同語(yǔ)言一同編譯成的,那到在調(diào)試過(guò)程中,GDB也能根據(jù)不同的語(yǔ)言自動(dòng)地切換語(yǔ)言環(huán)境。這種跟著語(yǔ)言環(huán)境而改變的功能,真是體貼開(kāi)發(fā)人員的一種設(shè)計(jì)。下面是幾個(gè)相關(guān)于GDB語(yǔ)言環(huán)境的命令: show language 查看當(dāng)前的語(yǔ)言環(huán)境。如果GDB不能識(shí)為你所調(diào)試的編程語(yǔ)言,那么,C語(yǔ)言被認(rèn)為是默認(rèn)的環(huán)境。 info frame 查看當(dāng)前函數(shù)的程序語(yǔ)言。 info source 查看當(dāng)前文件的程序語(yǔ)言。 如果GDB沒(méi)有檢測(cè)出當(dāng)前的程序語(yǔ)言,那么你也可以手動(dòng)設(shè)置當(dāng)前的程序語(yǔ)言。使用set language命令即可做到。 當(dāng)set language命令后什么也不跟的話,你可以查看GDB所支持的語(yǔ)言種類: (gdb) set language The currently understood settings are: local or auto Automatic setting based on source file c Use the C language c++ Use the C++ language asm Use the Asm language chill Use the Chill language fortran Use the Fortran language java Use the Java language modula2 Use the Modula2 language pascal Use the Pascal language scheme Use the Scheme language 于是你可以在set language后跟上被列出來(lái)的程序語(yǔ)言名,來(lái)設(shè)置當(dāng)前的語(yǔ)言環(huán)境。4 使用示例 常用命令file 裝入想要調(diào)試的可執(zhí)行文件. kill 終止正在調(diào)試的程序. list 列出產(chǎn)生執(zhí)行文件的源代碼的一部分. next 執(zhí)行一行源代碼但不進(jìn)入函數(shù)內(nèi)部. step 執(zhí)行一行源代碼而且進(jìn)入函數(shù)內(nèi)部. run 執(zhí)行當(dāng)前被調(diào)試的程序 quit 終止 gdb watch 使你能監(jiān)視一個(gè)變量的值而不管它何時(shí)被改變. break 在代碼里設(shè)置斷點(diǎn), 這將使程序執(zhí)行到這里時(shí)被掛起. make 使你能不退出 gdb 就可以重新產(chǎn)生可執(zhí)行文件. shell 使你能不離開(kāi) gdb 就執(zhí)行 UNIX shell 命令. 調(diào)試示例源程序: 1 include 2 3 int func(int n) 4 { 5 int sum=0,i。 6 for(i=0。 in。 i++) 7 { 8 sum+=i。 9 } 10 return sum。 11 } 12 13 14 int main(void) 15 { 16 int i。 17 long result = 0。 18 for(i=1。 i=100。 i++) 19 { 20 result += i。 21 } 22 23 printf(result[1100] = %d \n, result )。 24 printf(result[1250] = %d \n, func(250) )。 25 return 0;26 }編譯生成執(zhí)行文件:(linux下) [wul@cpslinux ~]$ gcc g o test使用GDB調(diào)試:[wul@cpslinux ~]$ gdb test