久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

gdb調(diào)試程序之查看運(yùn)行時(shí)數(shù)據(jù)【五】

 幸福的樂土 2012-05-05

在用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中,,查看以下三種變量的值:
1、全局變量(所有文件可見的)
2,、靜態(tài)全局變量(當(dāng)前文件可見的)
3,、局部變量(當(dāng)前Scope可見的)

如果出現(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       查看所指定的寄存器的情況

    本站是提供個(gè)人知識管理的網(wǎng)絡(luò)存儲空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多