在用gdb調(diào)試程序時(shí),,當(dāng)程序運(yùn)行到之前設(shè)置的斷點(diǎn)時(shí),,很容易想到的操作就是查看當(dāng)前變量的值,而gdb可以很輕易地滿足的你的需求的~~ 在gdb中最常用的命令就是print(簡寫p),,具體格式如下: print <expr> print/f <expr> f代表輸出的格式 x 按十六進(jìn)制格式顯示變量 d 按十進(jìn)制格式顯示變量 u 按十六進(jìn)制格式顯示無符號整型 o 按八進(jìn)制格式顯示變量 t 按二進(jìn)制格式顯示變量 a 按十六進(jìn)制格式顯示變量 c 按字符格式顯示變量 f 按浮點(diǎn)數(shù)格式顯示變量 表達(dá)式print命令可以接受表達(dá)式,,其中表達(dá)式的定義遵循C/C++語法,需要注意的是表達(dá)式中不能出現(xiàn)程序中定義的宏表達(dá)式,;同時(shí)在gdb表達(dá)式中,,還支持以下三種特殊的操作符: @ 是一個(gè)和數(shù)組有關(guān)的操作符,在后面會(huì)有更詳細(xì)的說明 :: 指定一個(gè)在文件或是一個(gè)函數(shù)中的變量,,注意與C++語法中的::操作符的區(qū)分 {} 表示一個(gè)指向內(nèi)存地址的類型為type的一個(gè)對象 程序變量的定位在GDB中,,查看以下三種變量的值: 如果出現(xiàn)局部變量和全局變量相互沖突時(shí),局部變量會(huì)覆蓋全局變量,,可以使用::限制符來查看全局變量 file::variable function::variable 注意事項(xiàng):如果在編譯時(shí)加入了編譯優(yōu)化選項(xiàng),,即-O3選項(xiàng),編譯器會(huì)修改你的程序,,同時(shí)可能查看不同某些變量,這時(shí)在調(diào)試時(shí)建議把優(yōu)化選項(xiàng)關(guān)掉,,即-O0 動(dòng)態(tài)數(shù)組你需要查看一段連續(xù)的內(nèi)存空間的值,。比如數(shù)組的一段,,或是動(dòng)態(tài)分配的數(shù)據(jù)的大小。你可以使用GDB的“@”操作符,,“@”的左邊是第一個(gè)內(nèi)存的地址的值,,“@”的右邊則你你想查看內(nèi)存的長度。例如,,你的程序中有這樣的語句: int *array = (int *) malloc (len * sizeof (int)); 于是,,在GDB調(diào)試過程中,你可以以如下命令顯示出這個(gè)動(dòng)態(tài)數(shù)組的取值: p *array@len @的左邊是數(shù)組的首地址的值,,也就是變量array所指向的內(nèi)容,,右邊則是數(shù)據(jù)的長度,其保存在變量len中,,其輸出結(jié)果,,大約是下面這個(gè)樣子的: (gdb) p *array@len $1 = {2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 38, 40} 查看內(nèi)存gdb中可以使用examine命令來查看內(nèi)存內(nèi)容,簡寫為x,,使用方法如下: x/<n/f/u> <addr> n,、f、u是可選的參數(shù),。 n 是一個(gè)正整數(shù),,表示顯示內(nèi)存的長度,也就是說從當(dāng)前地址向后顯示幾個(gè)地址的內(nèi)容,。 f 表示顯示的格式,,參見上面。如果地址所指的是字符串,,那么格式可以是s,,如果地十是指令地址,那么格式可以是i,。 u 表示從當(dāng)前地址往后請求的字節(jié)數(shù),,如果不指定的話,GDB默認(rèn)是4個(gè)bytes,。u參數(shù)可以用下面的字符來代替,,b表示單字節(jié),h表示雙字節(jié),,w表示四字節(jié),,g表示八字節(jié)。 當(dāng)我們指定了字節(jié)長度后,,GDB會(huì)從指內(nèi)存定的內(nèi)存地址開始,,讀寫指定字節(jié),并把其當(dāng)作一個(gè)值取出來,。 <addr>表示一個(gè)內(nèi)存地址,。 例如 x/3uh 0x54320 從內(nèi)存地址0x54320讀取內(nèi)容,,h表示以雙字節(jié)為一個(gè)單位,3表示三個(gè)單位,,u表示按十六進(jìn)制顯示 自動(dòng)顯示在gdb中,,你可以設(shè)置當(dāng)程序停在斷點(diǎn)處時(shí),自動(dòng)顯示變量的內(nèi)容,,即display命令,,使用如下: display <expr> display/<fmt> <expr> display/<fmt> <addr> expr是一個(gè)表達(dá)式,fmt表示顯示的格式,,addr表示內(nèi)存地址 一個(gè)非常有用的命令,,顯示源碼與機(jī)器碼的對應(yīng): display/i $pc $pc是GDB的環(huán)境變量,表示著指令的地址,,/i則表示輸出格式為機(jī)器指令碼,,也就是匯編。于是當(dāng)程序停下后,,就會(huì)出現(xiàn)源代碼和機(jī)器指令碼相對應(yīng)的情形 與display管理相關(guān)的命令: undisplay delete display disable display enable display info display 查看display設(shè)置的自動(dòng)顯示的信息 查看寄存器info registers 查看寄存器的情況,。(除了浮點(diǎn)寄存器) info all-registers 查看所有寄存器的情況。(包括浮點(diǎn)寄存器) info registers 查看所指定的寄存器的情況 |
|