七、設(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è)輸出的功能。
十、查看寄存器
要查看寄存器的值,很簡(jiǎn)單,可以使用如下命令:
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。
本文轉(zhuǎn)自:http://blog.csdn.net/haoel/article/details/2884
posted on 2013-11-28 12:18
王海光 閱讀(439)
評(píng)論(0) 編輯 收藏 引用 所屬分類(lèi):
Linux