亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1090 | 回復(fù): 0
打印 上一主題 下一主題

GDB的使用 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2009-10-30 15:40 |只看該作者 |倒序瀏覽
GDB的命令很多,本文不會全部介紹,僅會介紹一些最常用的。在介紹之前,先介紹GDB中的一個非常有用的功能:補(bǔ)齊功能。它就如同Linux下SHELL中的命令補(bǔ)齊一樣。當(dāng)你輸入一個命令的前幾個字符,然后輸入TAB鍵,如果沒有其它命令的前幾個字符與此相同,SHELL將補(bǔ)齊此命令。如果有其它命令的前幾個字符與此相同,你會聽到一聲警告聲,再輸入TAB鍵,SHELL將所有前幾個字符與此相同的命令全部列出。而GDB中的補(bǔ)齊功能不僅能補(bǔ)齊GDB命令,而且能補(bǔ)齊參數(shù)。
       本文將先介紹常用的命令,然后結(jié)合一個具體的例子來演示如何實(shí)際使用這些命令。下面的所有命令除了第一條啟動GDB命令是在SHELL下輸入的,其余都是GDB內(nèi)的命令。大部分GDB內(nèi)的命令都可以僅輸入前幾個字符,只要不與其它指令沖突。如quit可以簡寫為q,因為以q打頭的命令只有quit。List可以簡寫為l,等等。
1.啟動GDB
你可以輸入GDB來啟動GDB程序。GDB程序有許多參數(shù),在此沒有必要詳細(xì)介紹,但一個最為常用的還是要介紹的:如果你已經(jīng)編譯好一個程序,我們假設(shè)文件名為hello,你想用GDB調(diào)試它,可以輸入gdb hello來啟動GDB并載入你的程序。如果你僅僅啟動了GDB,你必須在啟動后,在GDB中再載入你的程序。
2.載入程序 === file
在GDB內(nèi),載入程序很簡單,使用file命令。如file hello。當(dāng)然,程序的路徑名要正確。
退出GDB === quit
在GDB的命令方式下,輸入quit,你就可以退出GDB。你也可以輸入'C-d'來退出GDB。
3.運(yùn)行程序 === run
當(dāng)你在GDB中已將要調(diào)試的程序載入后,你可以用run命令來執(zhí)行。如果你的程序需要參數(shù),你可以在run指令后接著輸入?yún)?shù),就象你在SHELL下執(zhí)行一個需要參數(shù)的命令一樣。
4.查看程序信息 === info
info指令用來查看程序的信息,當(dāng)你用help info查看幫助的話,info指令的參數(shù)足足占了兩個屏幕,它的參數(shù)非常多,但大部分不常用。我用info指令最多的是用它來查看斷點(diǎn)信息。
4.1查看斷點(diǎn)信息
info br
br是斷點(diǎn)break的縮寫,記得GDB的補(bǔ)齊功能吧。用這條指令,你可以得到你所設(shè)置的所有斷點(diǎn)的詳細(xì)信息。包括斷點(diǎn)號,類型,狀態(tài),內(nèi)存地址,斷點(diǎn)在源程序中的位置等。
4.2查看當(dāng)前源程序
info source
4.3查看堆棧信息
info stack
用這條指令你可以看清楚程序的調(diào)用層次關(guān)系。
4.4查看當(dāng)前的參數(shù)
info args
5.列出源一段源程序 === list
5.1列出某個函數(shù)
list FUNCTION
5.2以當(dāng)前源文件的某行為中間顯示一段源程序
list LINENUM
5.3接著前一次繼續(xù)顯示
list
5.4顯示前一次之前的源程序
list -
5.5顯示另一個文件的一段程序
list FILENAME:FUNCTION 或 list FILENAME:LINENUM
6.設(shè)置斷點(diǎn) === break
現(xiàn)在我們將要介紹的也許是最常用和最重要的命令:設(shè)置斷點(diǎn)。無論何時,只要你的程序已被載入,并且當(dāng)前沒有正在運(yùn)行,你就能設(shè)置,修改,刪除斷點(diǎn)。設(shè)置斷點(diǎn)的命令是break。有許多種設(shè)置斷點(diǎn)的方法。如下:
6.1在函數(shù)入口設(shè)置斷點(diǎn)
break FUNCTION
6.2在當(dāng)前源文件的某一行上設(shè)置斷點(diǎn)
break LINENUM
6.3在另一個源文件的某一行上設(shè)置斷點(diǎn)
break FILENAME:LINENUM
6.4在某個地址上設(shè)置斷點(diǎn),當(dāng)你調(diào)試的程序沒有源程序是,這很有用
break *ADDRESS
除此之外,設(shè)置一個斷點(diǎn),讓它只有在某些特定的條件成立時程序才會停下,我們可以稱其為條件斷點(diǎn)。這個功能很有用,尤其是當(dāng)你要在一個程序會很多次執(zhí)行到的地方設(shè)置斷點(diǎn)時。如果沒有這個功能,你必須有極大的耐心,加上大量的時間,一次一次讓程序斷下,檢查一些值,接著再讓程序繼續(xù)執(zhí)行。事實(shí)上,大部分的斷下并不是我們所希望的,我們只希望在某些條件下讓程序斷下。這時,條件斷點(diǎn)就可以大大提高你的效率,節(jié)省你的時間。條件斷點(diǎn)的命令如下,在后面的例子中會有示例。
6.5條件斷點(diǎn)
break ...if COND
COND是一個布爾條件表達(dá)式,語法與C語言中的一樣。條件斷點(diǎn)與一般的斷點(diǎn)不同之處是每當(dāng)程序執(zhí)行到斷點(diǎn)處,都要計算條件表達(dá)式,如果為真,程序才會斷下,否則程序會一直執(zhí)行下去。
7.其它斷點(diǎn)操作
GDB給每個斷點(diǎn)賦上一個整數(shù)數(shù)字,這個數(shù)字在操作斷點(diǎn)時起到重要作用,它實(shí)際上就代表相應(yīng)的斷點(diǎn)。GDB中的斷點(diǎn)有四種狀態(tài):
有效(Enabled)
禁止(Disabled)
一次有效(Enabled once)
有效后刪除(Enabled for deletion)
在上面的四個狀態(tài)有效和禁止都很好理解,禁止就是讓斷點(diǎn)暫時失效。一次有效就是當(dāng)程序在此斷點(diǎn)斷下后,斷點(diǎn)狀態(tài)自動變?yōu)榻範(fàn)顟B(tài)。有效后刪除就是當(dāng)程序在此斷點(diǎn)斷下后,斷點(diǎn)被刪除。實(shí)際上,后兩種狀態(tài)一般不會碰到。
當(dāng)你設(shè)置一個斷點(diǎn)后,它的確省狀態(tài)是有效。你可以用enable和disable指令來設(shè)置斷點(diǎn)的狀態(tài)為有效或禁止。例如,如果你想禁止2號斷點(diǎn),可以用下面的指令:
disable 2
相應(yīng)的,如果想刪除2號斷點(diǎn),可以有下面的指令:
delete 2
8.設(shè)置監(jiān)視點(diǎn) === watch
當(dāng)你調(diào)試一個很大的程序,并且在跟蹤一個關(guān)鍵的變量時,發(fā)現(xiàn)這個變量不知在哪兒被改動過,如何才能找到改動它的地方。這時你可以使用watch命令。簡單地說,監(jiān)視點(diǎn)可以讓你監(jiān)視某個表達(dá)式或變量,當(dāng)它被讀或被寫時讓程序斷下。watch命令的用法如下:
watch EXPRESSION
watch指令是監(jiān)視被寫的,當(dāng)你想監(jiān)視某個表達(dá)式或變量被讀的話,需要使用rwatch指令,具體用法是一樣的。要注意的是,監(jiān)視點(diǎn)有硬件和軟件兩種方式,如果可能Linux盡可能用硬件方式,因為硬件方式在速度上要大大快于軟件方式。軟件方式由于要在每次執(zhí)行一條指令后都要檢查所要監(jiān)視的值是否被改變,因此它的執(zhí)行速度會大大降低。同時它也無法設(shè)置成被讀時讓程序斷下,因為讀操作不會改變值,所以GDB無法檢測到讀操作。幸運(yùn)的是,目前的PC機(jī)基本都支持硬件方式。如果你想確認(rèn)一下你的機(jī)器是否支持硬件,你可以在調(diào)試程序時用watch設(shè)置一個監(jiān)視點(diǎn),如果GDB向你顯示:
Hardware watchpoint NUM: EXPR
那么你可以放心了,你的機(jī)器支持硬件方式。
9.檢查數(shù)據(jù)
最常用的檢查數(shù)據(jù)的方法是使用print命令。
print exp
print指令打印exp表達(dá)式的值。卻省情況下,表達(dá)式的值的打印格式依賴于它的數(shù)據(jù)類型。但你可以用一個參數(shù)/F來選擇輸出的打印格式。F是一個代表某種格式的字母,詳細(xì)可參考輸出格式一節(jié)。表達(dá)式可以是常量,變量,函數(shù)調(diào)用,條件表達(dá)式等。但不能打印宏定義的值。表達(dá)式exp中的變量必須是全局變量或當(dāng)前堆棧區(qū)可見的變量。否則GDB會顯示象下面的一條信息:
No symbol "varible" in current context
10.修改變量值
在調(diào)試程序時,你可能想改變一個變量的值,看看在這種情況下會發(fā)生什么。用set指令可以修改變量的值:
set varible=value
例如你想將一個變量tmp的值賦為10,
set tmp=10
11.檢查內(nèi)存值
檢查內(nèi)存值的指令是x,x是examine的意思。用法如下:
x /NFU ADDR
其中N代表重復(fù)數(shù),F(xiàn)代表輸出格式(見2.13),U代表每個數(shù)據(jù)單位的大小。U可以去如下值:
b :字節(jié)(byte)
h :雙字節(jié)數(shù)值
w :四字節(jié)數(shù)值
g :八字節(jié)數(shù)值
因此,上面的指令可以這樣解釋:從ADDR地址開始,以F格式顯示N個U數(shù)值。例如:
x/4ub 0x4000
會以無符號十進(jìn)制整數(shù)格式(u)顯示四個字節(jié)(b),0x4000,0x4001,0x4002,0x4003。
12.輸出格式
缺省情況下,輸出格式依賴于它的數(shù)據(jù)類型。但你可以改變輸出格式。當(dāng)你使用print命令時,可以用一個參數(shù)/F來選擇輸出的打印格式。F可以是以下的一些值:
'x' 16進(jìn)制整數(shù)格式
'd' 有符號十進(jìn)制整數(shù)格式
'u' 無符號十進(jìn)制整數(shù)格式
'f' 浮點(diǎn)數(shù)格式
13.單步執(zhí)行指令
單步執(zhí)行指令有兩個step和next。Step可以讓你跟蹤進(jìn)入一個函數(shù),而next指令則不會進(jìn)入函數(shù)。
14.繼續(xù)執(zhí)行指令
當(dāng)程序被斷下后,你查看了所需的信息后,你會希望程序執(zhí)行下去,輸入 continue, 程序會繼續(xù)執(zhí)行下去。
15.幫助指令help
在GDB中,如果想知道一條指令的用法,最方便的方法是使用help。使用方法很簡單,在help后跟上指令名。例如,想知道list指令用法,輸入help list。


本文來自ChinaUnix博客,如果查看原文請點(diǎn):http://blog.chinaunix.net/u3/105209/showart_2082985.html
您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP