用GDB调试程序(六)
七、設(shè)置顯示選項(xiàng)
??? GDB中關(guān)于顯示的選項(xiàng)比較多,這里我只例舉大多數(shù)常用的選項(xiàng)。
??? set print address
??? set print address on
??????? 打開(kāi)地址輸出,當(dāng)程序顯示函數(shù)信息時(shí),GDB會(huì)顯出函數(shù)的參數(shù)地址。系統(tǒng)默認(rèn)為打開(kāi)的,如:
???????
??????? (gdb) f
??????? #0? set_quotes (lq=0x34c78 "<<", rq=0x34c88 ">>")
??????????? at input.c:530
??????? 530???????? if (lquote != def_lquote)
??? set print address off
??????? 關(guān)閉函數(shù)的參數(shù)地址顯示,如:
???????
??????? (gdb) set print addr off
??????? (gdb) f
??????? #0? set_quotes (lq="<<", rq=">>") at input.c:530
??????? 530???????? if (lquote != def_lquote)
??? show print address
??????? 查看當(dāng)前地址顯示選項(xiàng)是否打開(kāi)。
???????
??? set print array
??? set print array on
??????? 打開(kāi)數(shù)組顯示,打開(kāi)后當(dāng)數(shù)組顯示時(shí),每個(gè)元素占一行,如果不打開(kāi)的話(huà),每個(gè)元素則以逗號(hào)分隔。這個(gè)選項(xiàng)默認(rèn)是關(guān)閉的。與之相關(guān)的兩個(gè)命令如下,我就不再多說(shuō)了。
???????
??? set print array off
??? show print array
??? set print elements <number-of-elements>
??????? 這個(gè)選項(xiàng)主要是設(shè)置數(shù)組的,如果你的數(shù)組太大了,那么就可以指定一個(gè)<number-of-elements>來(lái)指定數(shù)據(jù)顯示的最大長(zhǎng)度,當(dāng)?shù)竭_(dá)這個(gè)長(zhǎng)度時(shí),GDB就不再往下顯示了。如果設(shè)置為0,則表示不限制。
???????
??? show print elements
??????? 查看print elements的選項(xiàng)信息。
???????
??? set print null-stop <on/off>
??????? 如果打開(kāi)了這個(gè)選項(xiàng),那么當(dāng)顯示字符串時(shí),遇到結(jié)束符則停止顯示。這個(gè)選項(xiàng)默認(rèn)為off。
???????
??? set print pretty on
??????? 如果打開(kāi)printf pretty這個(gè)選項(xiàng),那么當(dāng)GDB顯示結(jié)構(gòu)體時(shí)會(huì)比較漂亮。如:
??????????? $1 = {
????????????? next = 0x0,
????????????? flags = {
??????????????? sweet = 1,
??????????????? sour = 1
????????????? },
????????????? meat = 0x54 "Pork"
??????????? }
??? set print pretty off
??????? 關(guān)閉printf pretty這個(gè)選項(xiàng),GDB顯示結(jié)構(gòu)體時(shí)會(huì)如下顯示:
???????
??????????? $1 = {next = 0x0, flags = {sweet = 1, sour = 1}, meat = 0x54 "Pork"}
???????????
??? show print pretty
??????? 查看GDB是如何顯示結(jié)構(gòu)體的。
???????
???
??? set print sevenbit-strings <on/off>
??????? 設(shè)置字符顯示,是否按“/nnn”的格式顯示,如果打開(kāi),則字符串或字符數(shù)據(jù)按/nnn顯示,如“/065”。
???
??? show print sevenbit-strings
??????? 查看字符顯示開(kāi)關(guān)是否打開(kāi)。
???????
??? set print union <on/off>
??????? 設(shè)置顯示結(jié)構(gòu)體時(shí),是否顯式其內(nèi)的聯(lián)合體數(shù)據(jù)。例如有以下數(shù)據(jù)結(jié)構(gòu):
???????
??????? typedef enum {Tree, Bug} Species;
??????? typedef enum {Big_tree, Acorn, Seedling} Tree_forms;
??????? typedef enum {Caterpillar, Cocoon, Butterfly}
????????????????????? Bug_forms;
???????
??????? struct thing {
????????? Species it;
????????? union {
??????????? Tree_forms tree;
??????????? Bug_forms bug;
????????? } form;
??????? };
???????
??????? struct thing foo = {Tree, {Acorn}};
??????? 當(dāng)打開(kāi)這個(gè)開(kāi)關(guān)時(shí),執(zhí)行 p foo 命令后,會(huì)如下顯示:
??????????? $1 = {it = Tree, form = {tree = Acorn, bug = Cocoon}}
???????
??????? 當(dāng)關(guān)閉這個(gè)開(kāi)關(guān)時(shí),執(zhí)行 p foo 命令后,會(huì)如下顯示:
??????????? $1 = {it = Tree, form = {...}}
??? show print union
??????? 查看聯(lián)合體數(shù)據(jù)的顯示方式
???????
??? set print object <on/off>
??????? 在C++中,如果一個(gè)對(duì)象指針指向其派生類(lèi),如果打開(kāi)這個(gè)選項(xiàng),GDB會(huì)自動(dòng)按照虛方法調(diào)用的規(guī)則顯示輸出,如果關(guān)閉這個(gè)選項(xiàng)的話(huà),GDB就不管虛函數(shù)表了。這個(gè)選項(xiàng)默認(rèn)是off。
???
??? show print object
??????? 查看對(duì)象選項(xiàng)的設(shè)置。
???????
??? set print static-members <on/off>
??????? 這個(gè)選項(xiàng)表示,當(dāng)顯示一個(gè)C++對(duì)象中的內(nèi)容是,是否顯示其中的靜態(tài)數(shù)據(jù)成員。默認(rèn)是on。
???
??? show print static-members
??????? 查看靜態(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)訪(fǎng)問(wèn)以前的表達(dá)式,如$1。這個(gè)功能所帶來(lái)的好處是,如果你先前輸入了一個(gè)比較長(zhǎng)的表達(dá)式,如果你還想查看這個(gè)表達(dá)式的值,你可以使用歷史記錄來(lái)訪(fǎng)問(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)有類(lèi)型,你可以給環(huán)境變量定義任一的類(lèi)型。包括結(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地輸入命令了。輸入這樣的命令后,只用敲回車(chē),重復(fù)執(zhí)行上一條語(yǔ)句,環(huán)境變量會(huì)自動(dòng)累加,從而完成逐個(gè)輸出的功能。
???
???
十、查看寄存器
???
??? info registers
??????? 查看寄存器的情況。(除了浮點(diǎn)寄存器)
???
??? info all-registers
??????? 查看所有寄存器的情況。(包括浮點(diǎn)寄存器)
???
??? info registers <regname ...>
??????? 查看所指定的寄存器的情況。
???????
??? 寄存器中放置了程序運(yùn)行時(shí)的數(shù)據(jù),比如程序當(dāng)前運(yùn)行的指令地址(ip),程序的當(dāng)前堆棧地址(sp)等等。你同樣可以使用print命令來(lái)訪(fǎng)問(wèn)寄存器的情況,只需要在寄存器名字前加一個(gè)$符號(hào)就可以了。如:p $eip。
出處:http://blog.csdn.net/haoel/article/details/2884
總結(jié)
以上是生活随笔為你收集整理的用GDB调试程序(六)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 用GDB调试程序(四)
- 下一篇: Machine Learning wee