找工作相關(guān)本人2收集linux編程gdb簡(jiǎn)略_第1頁
找工作相關(guān)本人2收集linux編程gdb簡(jiǎn)略_第2頁
找工作相關(guān)本人2收集linux編程gdb簡(jiǎn)略_第3頁
找工作相關(guān)本人2收集linux編程gdb簡(jiǎn)略_第4頁
找工作相關(guān)本人2收集linux編程gdb簡(jiǎn)略_第5頁
已閱讀5頁,還剩9頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、1.1 gdb1.1.1 gdb 概述無論多么優(yōu)秀的程序員,必須經(jīng)常面對(duì)的一個(gè)問題就是調(diào)試。當(dāng)程序編譯完成后,他可能無法正常運(yùn)行;或許程序會(huì)徹底;或許只是不能正常地運(yùn)行某些功能;或許它的輸出會(huì)被掛起;或許不會(huì)提示要求正常的輸入。無論在何種情況下,這些問題,特別是在大的工程中,將是開發(fā)中最的部分,本章將介紹使用 gdb(GNU debugger)調(diào)試程序的方法,該程序是一個(gè)調(diào)試器,是用來幫助程序員尋找程序中的錯(cuò)誤的。gdb 是 GNU 開發(fā)組織發(fā)布的一個(gè)強(qiáng)大的 UNIX/Linux 下的程序調(diào)試工具?;蛟S,有人比較圖形界面方式的,像 VC、BCB 等 IDE 環(huán)境,但是在 UNIX/Linux下

2、做,gdb這個(gè)調(diào)試工具有比 VC、BCB 的圖形化調(diào)試器更強(qiáng)大的功能。所謂“寸有是這個(gè)道理。一般來說,gdb 主要幫忙用戶完成下面 4 個(gè)方面的功能:,尺有所短”就啟動(dòng)程序,可以按照用戶自定義的要求隨心所欲的運(yùn)行程序??勺尡徽{(diào)試的程序在用戶所指定的調(diào)試的斷點(diǎn)處停住 (斷點(diǎn)可以是條件表達(dá)式)。當(dāng)程序停住時(shí),可以檢查此時(shí)程序中所發(fā)生的事。動(dòng)態(tài)地改變程序的執(zhí)行環(huán)境。從上面來看,gdb 和一般的調(diào)試工具區(qū)別不大,基本上也是完成這些功能,不過在細(xì)節(jié)上,會(huì)發(fā)現(xiàn) gdb 這個(gè)調(diào)試工具的強(qiáng)大。大家可能了圖形化的調(diào)試工具,但有時(shí)候,命令行的調(diào)試工具卻有著圖形化工具所不能完成的功能。下面通過實(shí)例進(jìn)行說明。#inc

3、lude func(n)sum=0,i; for(i=0; in; i+)sum+=i;return sum;main()i;long result = 0; for(i=1; i=100; i+)result += i;prf(result1-100 = %d n, result ); prf(result1-250 = %d n, func(250) );編譯生成執(zhí)行文件:$ gcc g test.c -o test使用 gdb 調(diào)試:$ gdb test啟動(dòng) gdb然后,鍵入l 命令相當(dāng)于 list 命令,從第一行開始列出源碼:在第 14 行設(shè)置斷點(diǎn):鍵入 break 14:在 func

4、 函數(shù)處設(shè)置斷點(diǎn):鍵入 break func:可以用 info break 查看斷點(diǎn)信息:要運(yùn)行程序,只需鍵入 r:這時(shí),如果要單步執(zhí)行的話,可以鍵入 n,表示執(zhí)行下一條語句:如果要繼續(xù)運(yùn)行程序直至下個(gè)斷點(diǎn),可以鍵入 c:發(fā)現(xiàn)程序運(yùn)行至 func 函數(shù)的路口。用 n 命令單步進(jìn)去:這時(shí)候,如果要察查看變量 i 的值,可以用pi:繼續(xù)單步:可以用 bt 命令查看函數(shù)調(diào)用堆棧:要退出函數(shù),可以直接敲入 finish:按 c 繼續(xù)運(yùn)行,則程序執(zhí)行完畢,調(diào)試結(jié)束要退出 gdb 程序,只需敲入 q。有了以上的感性認(rèn)識(shí),下面來系統(tǒng)地學(xué)下 gdb。1.1.2 啟動(dòng) gdbgdb 主要調(diào)試的是 C/C+程序,

5、要調(diào)試 C/C+程序,首先在編譯時(shí),必須要把調(diào)試信息加到可執(zhí)行文件中。使用 gcc 的-g 參數(shù)即可。如:$gcc go.c oo如果沒有-g,將看不見程序的函數(shù)名和變量名,代替它們的全是運(yùn)行時(shí)的內(nèi)存地址。當(dāng)用-g 把調(diào)試信息加入,并成功編譯目標(biāo)代碼以后,看看如何用 gdb 來調(diào)試。啟動(dòng) gdb 的方法有以下幾種:1、gdb program 也就是執(zhí)行文件,一般在當(dāng)前目錄下。2、 gdb core用 gdb 同時(shí)調(diào)試一個(gè)運(yùn)行程序和 core 文件,core 是程序生的文件。執(zhí)行后,core dump 后產(chǎn)3、 gdb 如果程序是一個(gè)服務(wù)程序,那么可以指定這個(gè)服務(wù)程序運(yùn)行時(shí)的進(jìn)程 ID。gdb

6、會(huì)自動(dòng)attach 上去,并調(diào)試它。program 應(yīng)該在 PATH 環(huán)境變量中搜索得到。gdb 啟動(dòng)時(shí),可以加上一些 gdb 的啟動(dòng)開關(guān),詳細(xì)的開關(guān)可以用 gdb -help 查看。1.1.3 在 gdb 中運(yùn)行程序當(dāng)以 gdb 方式啟動(dòng) gdb 后,gdb 會(huì)在 PATH 路徑和當(dāng)前目錄中搜索的源文件。如要確認(rèn) gdb 是否讀到源文件,可使用 l 或 list 命令,看看 gdb 是否能列出源代碼。在 gdb 中,運(yùn)行程序使用 r 或是 run 命令。程序的運(yùn)行,有可能需要設(shè)置下面四方面的事。1、程序運(yùn)行參數(shù)set args 可指定運(yùn)行時(shí)的參數(shù)。如:set args 10 20 30 40

7、 50show args 命令可以查看設(shè)置好的運(yùn)行參數(shù)。2、運(yùn)行環(huán)境path 可設(shè)定程序的運(yùn)行路徑。shoths 查看程序的運(yùn)行路徑。set env varname=value設(shè)置環(huán)境變量。如: show environment 查看環(huán)境變量。3、工作目錄cd 相當(dāng)于 s的 cd 命令。pwd 顯示當(dāng)前所在目錄。4、程序的輸入輸出可以使用重定向方式將程序的輸出重定向到指定文件中。如:routfile1.1.4 暫停/恢復(fù)程序運(yùn)行調(diào)試程序中,暫停程序運(yùn)行是必需的,gdb 可以方便地暫停程序的運(yùn)行。可以設(shè)置程序在哪行停住,在什么條件下停住,在收到什么信號(hào)時(shí)停往等,以便于用戶查看運(yùn)行時(shí)的變量,以及運(yùn)

8、行時(shí)的流程。當(dāng)進(jìn)程被 gdb 停住時(shí),可以使用 info program 來查看程序是否在運(yùn)行、進(jìn)程號(hào)、被暫停的原因。在 gdb 中,有以下幾種暫停方式: 斷點(diǎn)(BreakPo)、觀察點(diǎn)(WatchPo)、捕捉點(diǎn)(CatchPo)、信號(hào)(Signals)及線程停止(Thread Stops)。如果要恢復(fù)程序運(yùn)行,可以使用 c 或是 continue 命令。1.1.4.1設(shè)置斷點(diǎn)(BreakPo)用 break 命令來設(shè)置斷點(diǎn)。有以下幾種設(shè)置斷點(diǎn)方法:1、break 在進(jìn)入指定函數(shù)時(shí)停住。 2、break 在指定行號(hào)停住3、break +offset;break offset在當(dāng)前行號(hào)的前面 o

9、ffset 行或后面 offset 行設(shè)置斷點(diǎn),offset 為自然數(shù)4、break filename:function在源文件 filename 的 function 函數(shù)5、break filename:行號(hào)處設(shè)置斷點(diǎn)在源文件 filename 的指定行號(hào)處設(shè)置斷點(diǎn)6、break *address在程序運(yùn)行的內(nèi)存地址處設(shè)置斷點(diǎn)7、break不代參數(shù),表示在下一條指令處設(shè)置斷點(diǎn)8、break if condition 表示條件,在條件成立時(shí)停住。比如在循環(huán)體中,可以設(shè)置 break if i=100,表示當(dāng) i 為 100 時(shí)停住程序。要查看斷點(diǎn)信息,可以使用 info 命令。1.1.4.2

10、設(shè)置觀察點(diǎn)(WatchPo)觀察點(diǎn)一般用來觀察某個(gè)表達(dá)式(變量也是一種表達(dá)式)的值是否變化了。如果有變化,馬上停住程序。有下面的幾種方法來設(shè)置觀察點(diǎn):1、watch 為表達(dá)式(變量)expr 設(shè)置一個(gè)觀察點(diǎn)。一旦表達(dá)式值有變化時(shí),馬上停住程序。2、rwatch 當(dāng)表達(dá)式(變量)expr 被讀時(shí),停住程序。3、awatch 當(dāng)表達(dá)式(變量)的值被讀或被寫時(shí),停住程序。info watchpos列出當(dāng)前設(shè)置的所有觀察點(diǎn)。1.1.4.3設(shè)置捕捉點(diǎn)(CatchPo)可設(shè)置捕捉點(diǎn)來補(bǔ)捉程序運(yùn)行時(shí)的一些事件。如載入共享庫(動(dòng)態(tài)常。設(shè)置捕捉點(diǎn)的格式為:catch 當(dāng) event 發(fā)生時(shí),停住程序。event

11、 可以是下面的內(nèi)容:庫)或是 C+的異throw catch exec forkvfork一個(gè) C+拋出的異常 (throw 為關(guān)鍵字)。 一個(gè) C+捕捉到的異常 (catch 為關(guān)鍵字)。調(diào)用系統(tǒng)調(diào)用 exec 時(shí)(exec 為關(guān)鍵字,目前此功能只在 HP-UX 下有用)。調(diào)用系統(tǒng)調(diào)用 fork 時(shí)(fork 為關(guān)鍵字,目前此功能只在 HP-UX 下有用)。調(diào)用系統(tǒng)調(diào)用 vfork 時(shí)(vfork 為關(guān)鍵字,目前此功能只在 HP-UX 下有)。load 或 load 載入共享庫(動(dòng)態(tài)功能只在 HP-UX 下有用)。unload 或 unload 卸載共享庫(動(dòng)態(tài)目前此功能只在 HP-UX 下

12、有用)。庫)時(shí) (load 為關(guān)鍵字,目前此庫)時(shí) (unload 為關(guān)鍵字,tcatch 只設(shè)置一次捕捉點(diǎn),當(dāng)程序停住以后,被自動(dòng)刪除。1.1.4.4停止點(diǎn)上面說了如何設(shè)置程序的停止點(diǎn),gdb 中的停止點(diǎn)也就是上述的三類。在 gdb 中,如果覺得已定義好的停止點(diǎn)沒有用了,可以使用 delete、clear、disable、enable 這幾個(gè)命令來進(jìn)行。clear 清除所有的已定義的停止點(diǎn)。clear 可以有如下幾種形式:clear clear clearcleardelete breakpos range刪除指定的斷點(diǎn),breakpos 為斷點(diǎn)號(hào)。如果不指定斷點(diǎn)號(hào),則表示刪除所有的斷點(diǎn)。r

13、ange 表示斷點(diǎn)號(hào)的范圍(如:3-7)。其簡(jiǎn)寫命令為 d。disable breakpos range 使斷點(diǎn)不可用,被 disable 了的停止點(diǎn),gdb 不會(huì)刪除,當(dāng)還需要時(shí),enable 即可,就好像回收站一樣。breakpo不指定,表示 disable 所有的停止點(diǎn)。簡(jiǎn)寫命令是 dis。s 為停止點(diǎn)號(hào)。如果什么都enable breakpos range 使指定的停止點(diǎn)可用,breakpos 為停止點(diǎn)號(hào)。enable breakpos once rangeenable 所指定的停止點(diǎn)一次,當(dāng)程序停止后,該停止點(diǎn)馬上被 gdb 自動(dòng) disable。enable breakpos de

14、lete rangeenable 所指定的停止點(diǎn)一次,當(dāng)程序停止后,該停止點(diǎn)馬上被 gdb 自動(dòng)刪除。1.1.4.5停止條件前面在介紹設(shè)置斷點(diǎn)時(shí),提到過可以設(shè)置一個(gè)條件,當(dāng)條件成立時(shí),程序自動(dòng)停止。這是一個(gè)非常強(qiáng)大的功能,這里,專門介紹這個(gè)條件的相關(guān)命令。一般來說,為斷點(diǎn)設(shè)置一個(gè)條件,可使用 if,后面跟其斷點(diǎn)條件。并且,條件設(shè)置好后,可以用condition 命令來修改斷點(diǎn)的條件(只有break 和watch 命令支持if,catch目前暫不支持 if)。condition 修改斷點(diǎn)號(hào)為 bnum 的停止條件為 expres condition 清除斷點(diǎn)號(hào)為 bnum 的停止條件。還有一個(gè)比

15、較特殊的ignore 命令 ignore,可以指定程序運(yùn)行時(shí),忽略停止條件幾次。表示忽略斷點(diǎn)號(hào)為 bnum 的停止條件 count 次。1.1.4.6為停止點(diǎn)設(shè)定運(yùn)行命令可以使用 gdb 提供的d 命令來設(shè)置停止點(diǎn)的運(yùn)行命令。也就是說,當(dāng)運(yùn)行的程序在被停住時(shí),ds.end可以讓其自動(dòng)運(yùn)行一些別bnumd-list .令,這很有利行自動(dòng)化調(diào)試。為斷點(diǎn)號(hào) bnum 指定一個(gè)命令列表。當(dāng)程序被該斷點(diǎn)停住時(shí),gdb 會(huì)依次運(yùn)行命令列表中令。例如:break foo if x0dsprf x is %dn,xcontinueend斷點(diǎn)設(shè)置在函數(shù) foo 中,斷點(diǎn)條件是 x0,如果程序被斷住后,也就是一旦

16、 x 的值在 foo函數(shù)中大于 0,gdb 會(huì)自動(dòng)打印出 x 的值,并繼續(xù)運(yùn)行程序。如果要清除斷點(diǎn)上入 end 就行了。令序列,那么只要簡(jiǎn)單地執(zhí)行一下ds 命令,并直接在輸1.1.4.7恢復(fù)程序運(yùn)行和單步調(diào)試當(dāng)程序被停住后,可以用 continue 命令恢復(fù)程序的運(yùn)行直到程序結(jié)束,或下一個(gè)斷點(diǎn)到來。也可以使用 step 或 next 命令單步continue ignore-count程序?;謴?fù)程序運(yùn)行,直到程序結(jié)束,或是下一個(gè)斷點(diǎn)到來。ignore-count 表示忽略其后的斷點(diǎn)次數(shù)。step 單步,如果有函數(shù)調(diào)用,它會(huì)進(jìn)入該函數(shù)。進(jìn)入函數(shù)的前提是,此函數(shù)被編譯有debug 信息。很像 VC

17、等工具中的 stn。后面可以加 count 也可以不加,不加表示一條條地執(zhí)行,加表示執(zhí)行后面的 count 條指令,然后再停住。next 同樣單步,如果有函數(shù)調(diào)用,它不會(huì)進(jìn)入該函數(shù)(很像 VC 等工具中的 step over)。后面可以加 count 也可以不加,不加表示一條條地執(zhí)行,加表示執(zhí)行后面的 count 條指令,然后再停住。finish運(yùn)行程序,直到當(dāng)前函數(shù)完成返回。并打印函數(shù)返回時(shí)的堆棧地址和返回值及參數(shù)值等信息。until 或 u當(dāng)厭倦了在一個(gè)循環(huán)體內(nèi)單步時(shí),這個(gè)命令可以運(yùn)行程序直到退出循環(huán)體。1.1.5 查看棧信息當(dāng)程序被停住時(shí),需要做的第一件事就是查看程序是在哪里停住的。當(dāng)程

18、序調(diào)用了一個(gè)函數(shù)時(shí),函數(shù)的地址、函數(shù)參數(shù)、函數(shù)內(nèi)的局部變量都會(huì)被壓入“?!?Stack)中??梢杂?gdb 命令來查看當(dāng)前的棧中的信息。下面是一些查看函數(shù)調(diào)用棧信息的 gdb 命令:backtrace 或 bt打印當(dāng)前的函數(shù)調(diào)用棧的所有信息。如:從上可以看出函數(shù)的調(diào)用棧信息: libc_start_main - main() - func() backtrace 或 bt n 是一個(gè)正整數(shù),表示只打印棧頂上 n 層的棧信息。(gdb) bt#0 func (n=250) at tst.c:6#1 0 x08048524ain (argc=1, argv=0 xbf674) at tst.c:3

19、0 #2 0 x400409ed in libc_start_main () from /lib/libc.so.6backtrace 或 bt -n 表示一個(gè)負(fù)整數(shù),表示只打印棧n 層的棧信息。如果要查看某一層的信息,需要切換當(dāng)前的棧。一般來說,程序停止時(shí),最頂層的棧就是當(dāng)前棧,如果要查看棧下面層的詳細(xì)信息,首先要做的是切換當(dāng)前棧。frame 或 f n 是一個(gè)從 0 開始的整數(shù),是棧中的層棧的第二層。up 。比如:frame 0 表示棧頂,frame 1 表示表示向棧的上面移動(dòng)n 層,可以不輸入n,表示向上移動(dòng)一層。 down 表示向棧的下面移動(dòng)n 層,可以不輸入n,表示向下移動(dòng)一層。上面

20、命令:令,都會(huì)輸出移動(dòng)到的棧層的信息。如果不想讓其輸出信息??梢允褂眠@三個(gè)select-frame 對(duì)應(yīng)于 frame 命令。up-silently 對(duì)應(yīng)于 up 命令。down-silently 對(duì)應(yīng)于 down 命令。查看當(dāng)前棧層的信息,可以用以下 gdb 命令:frame 或 f顯示出這些信息:棧的層數(shù)執(zhí)行到的語句。info frame 或 info f,當(dāng)前的函數(shù)名,函數(shù)參數(shù)值,函數(shù)所在文件及行號(hào),函命令會(huì)顯示出更為詳細(xì)的當(dāng)前棧層的信息,只不過,大多數(shù)都是運(yùn)行時(shí)的內(nèi)內(nèi)地址。比如:函數(shù)地址,調(diào)用函數(shù)的地址,被調(diào)用函數(shù)的地址,目前函數(shù)的程序語言、函數(shù)參數(shù)地址及值、局部變量的地址等。如:in

21、fo args顯示出當(dāng)前函數(shù)的參數(shù)名及值。info locals顯示出當(dāng)前函數(shù)中所有局部變量及值。info catch顯示出當(dāng)前函數(shù)中的異常處理信息。(gdb) bt#0 main () at test.c:23#1 0 x42015574 in libc_start_main () from /lib/tls/libc.so.6 (gdb) info fStack level 0, frame at 0 xbef48:eip = 0 x80483c3ain (test.c:23); saved eip 0 x42015574 called by frame at 0 xbef68source

22、 language c.Arglis0 xbef48, args:Locals at 0 xbef48, Previous frames sp in esp Saved registers:t 0 xbef48, eip at 0 xbef4c(gdb)1.1.6 查看運(yùn)行時(shí)數(shù)據(jù)在調(diào)試程序時(shí),當(dāng)程序被停住時(shí),可以使用 pr命令(簡(jiǎn)寫命令為 p),或是同義命令inspect 來查看當(dāng)前程序的運(yùn)行數(shù)據(jù)。pr命令的格式是:prpr/ 是表達(dá)式,是所調(diào)試的程序的語言的表達(dá)式(gdb 可以調(diào)試多種編程語言);是輸出的格式。比如,如果要把表達(dá)式按 16 進(jìn)制的格式輸出,那么就是/x。1.1.6.1表達(dá)式p

23、r和許多 gdb令一樣,可以接受一個(gè)表達(dá)式,gdb 會(huì)根據(jù)當(dāng)前的程序運(yùn)行的數(shù)據(jù)來計(jì)算這個(gè)表達(dá)式。既然是表達(dá)式,那么就可以是當(dāng)前程序運(yùn)行中的常量、變量、函數(shù)等內(nèi)容??上У氖?gdb 不能使用在程序中所定義的宏。表達(dá)式的語法應(yīng)該是當(dāng)前所調(diào)試的語言的語法,由于 C/C+是一種大眾型的語言,所以,本文中的例子都是關(guān)于 C/C+的。在表達(dá)式中,有幾種 gdb 所支持的操作符,它們可以用在任何一種語言中。:是一個(gè)和數(shù)組有關(guān)的操作符,在后面會(huì)有更詳細(xì)的說明。指定一個(gè)在文件或是一個(gè)函數(shù)中的變量。表示一個(gè)指向內(nèi)存地址的類型為 type 的一個(gè)對(duì)象。1.1.6.2程序變量在 gdb 中,可以隨時(shí)查看以下 3 種變

24、量的值:全局變量(所有文件可見的)靜態(tài)全局變量(當(dāng)前文件可見的)局部變量(當(dāng)前 Scope 可見的)如果局部變量和全局變量發(fā)生(也就是重名),一般情況下是局部變量會(huì)隱藏全局變量。也就是說,如果一個(gè)全局變量和一個(gè)函數(shù)中的局部變量同名時(shí),如果當(dāng)前停止點(diǎn)在函數(shù)中,用 pr顯示出的變量的值會(huì)是函數(shù)中的局部變量的值。如果此時(shí)想查看全局變量的值,可以使用“:”操作符: file:variable function:variable可以通過這種形式指定所要查看的變量,是哪個(gè)文件中的或是哪個(gè)函數(shù)中的。例如,查看文件 f2.c 中的全局變量 x 的值:(gdb) pf2.c:x當(dāng)然,“:”操作符會(huì)和 C+中的發(fā)

25、生所以不必?fù)?dān)心在調(diào)試 C+程序時(shí)會(huì)出現(xiàn)異常。,gdb 能自動(dòng)識(shí)別“:”是否 C+的操作符,另外,需要注意的是,如果程序編譯時(shí)開啟了優(yōu)化選項(xiàng),那么在用 gdb 調(diào)試被優(yōu)化過的程序時(shí),可能會(huì)發(fā)生某些變量不能,或是取值錯(cuò)誤的情況。這個(gè)是很正常的,因?yàn)閮?yōu)化程序會(huì)刪改程序,整理程序的語句順序,剔除一些無意義的變量等。所以在 gdb 調(diào)試這種程序時(shí),運(yùn)行時(shí)的指令和所編寫的指令就不一樣,也就會(huì)出現(xiàn)想象不到的結(jié)果。對(duì)付這種情況,需要在編譯程序時(shí)關(guān)閉編譯優(yōu)化。一般來說,幾乎所有的編譯器都支持編譯優(yōu)化的開關(guān),例如,GNU 的 C/C+編譯器 GCC,可以使用-gstabs 選項(xiàng)來解決這個(gè)問題。關(guān)于編譯器的參數(shù),請(qǐng)

26、查看編譯器的使用說明文檔。1.1.6.3數(shù)組有時(shí)候需要查看一段連續(xù)的內(nèi)存空間的值。比如數(shù)組的一段,或是動(dòng)態(tài)分配的數(shù)據(jù)的大小??梢允褂?gdb 的操作符。的左邊是第一個(gè)內(nèi)存地址的值,的右邊則是想查看的內(nèi)存的長(zhǎng)度。例如,程序中有這樣的語句:*array = (*) malloc (len *sizeof ();于是,在 gdb 調(diào)試過程中,可以用如下命令顯示出這個(gè)動(dòng)態(tài)數(shù)組的取值:p *arraylen的左邊是數(shù)組的首地址的值,也就是變量 array 所指向的內(nèi)容,右邊則是數(shù)據(jù)的長(zhǎng)度,其保存在變量 len 中。其輸出結(jié)果,大約是下面這個(gè)樣子的:(gdb) p *arraylen$1=2,4,6,8,

27、10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40如果是靜態(tài)數(shù)組的話,直接用 pr數(shù)組名就可以顯示數(shù)組中所有數(shù)據(jù)的內(nèi)容了。1.1.6.4輸出格式一般來說,gdb 會(huì)根據(jù)變量的類型輸出變量的值。但也可以自定義 gdb 的輸出格式。例如,想輸出一個(gè)整數(shù)的十六進(jìn)制或是二進(jìn)制來查看這個(gè)整型變量中的位的情況。要做到這樣,可以使用 gdb 的數(shù)據(jù)顯示格式:x du按十六進(jìn)制格式顯示變量。按十進(jìn)制格式顯示變量。按十六進(jìn)制格式顯示無符號(hào)整型。按八進(jìn)制格式顯示變量。t a cf按二進(jìn)制格式顯示變量。 按十六進(jìn)制格式顯示變量。按字符格式顯示變量。按浮點(diǎn)數(shù)格式顯示變量。p

28、 i 101p/a i0 x65(gdb)$21 =(gdb)$22 =(gdb)$23 =(gdb)$24 =(gdb)$25 =(gdb)$26 =p/c 101p/fie i1.41531145e-43p/x i 0 x65p/t i11001011.1.6.5查看內(nèi)存可以使用 examine 命令(簡(jiǎn)寫是 x)來查看內(nèi)存地址中的值。x 命令的語法如下所示:x/ n、f、u 是可選的參數(shù)。n 是一個(gè)正整數(shù),表示顯示內(nèi)存的長(zhǎng)度,也就是說從當(dāng)前地址向后顯示幾個(gè)地址的內(nèi)容。f 表示顯示的格式,參見上面。如果地址所指的是字符串,那么格式可以是 s,如果是指令地址,那么格式可以是 i。u 表示從當(dāng)

29、前地址往后請(qǐng)求的字節(jié)數(shù),如果不指定的話,gdb 默認(rèn)是 4 個(gè) bytes。u參數(shù)可以用下面的字符來代替:b 表示單字節(jié),h 表示雙字節(jié),w 表示四字節(jié),g表示八字節(jié)。當(dāng)指定了字節(jié)長(zhǎng)度后,gdb 會(huì)從指定的內(nèi)存地址開始,讀寫指定字節(jié),并把其當(dāng)作一個(gè)值取出來。表示一個(gè)內(nèi)存地址。n/f/u 三個(gè)參數(shù)可以一起使用。例如:x/3uh 0 x54320表示從內(nèi)存地址 0 x54320表示按十六進(jìn)制顯示。內(nèi)容,h 表示以雙字節(jié)為 1 個(gè),3 表示 3 個(gè),u1.1.6.6自動(dòng)顯示可以設(shè)置一些自動(dòng)顯示的變量,當(dāng)程序停住時(shí),或是在單步示。相關(guān)的 gdb 命令是 display。display display/

30、 display/ 時(shí),這些變量會(huì)自動(dòng)顯expr 是一個(gè)表達(dá)式,fmt 表示顯示的格式,addr 表示內(nèi)存地址。當(dāng)用 display 設(shè)定好了一個(gè)或多個(gè)表達(dá)式后,只要程序停下來,gdb 會(huì)自動(dòng)顯示所設(shè)置的這些表達(dá)式的值。格式i 和 s 同樣被 display 支持,一個(gè)非常有用display/i $pc令是:$pc 是 gdb 的環(huán)境變量,表示指令的地址,/i 則表示輸出格式為機(jī)器指令碼,也就是匯編。于是當(dāng)程序停下后,就會(huì)出現(xiàn)源代碼和機(jī)器指令碼相對(duì)應(yīng)的情形,這是一個(gè)很有意思的功能。下面是一些和 display 相關(guān)的 gdb 命令:undisplay delete display 刪除自動(dòng)顯示

31、,dnums 意為設(shè)置好了的自動(dòng)顯示的。如果要同時(shí)刪除幾個(gè),可以用空格分隔;如果要?jiǎng)h除一個(gè)范圍內(nèi)的disable display enable display ,可以用減號(hào)表示(如:2-5)。disable 和 enalbe 不刪除自動(dòng)顯示的設(shè)置,而只是讓其失效和恢復(fù)。info display查看 display 設(shè)置的自動(dòng)顯示的信息。gdb 會(huì)顯示出一張表格,調(diào)試中設(shè)置了多少個(gè)自動(dòng)顯示設(shè)置,其中包括設(shè)置的、表達(dá)式及是否 enable。1.1.6.7查看寄存器要查看寄存器的值,很簡(jiǎn)單,可以使用如下命令:infoinfo inforegistersall-registers registers 寄存

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論