




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、GDB 不完全手冊(cè)巫山霏云msn:fWebSite:http:GDB 即 GNU Debuger,是 GNU 下的調(diào)試器.主要是用在 linux 下面。但是也有人把它移植到 Win32上面,這樣常常在 Windows 下面的人也有機(jī)會(huì)接觸到這個(gè)非常優(yōu)秀的調(diào)試器。Free Pascal 一直都是調(diào)用 GDB 來(lái)調(diào)試程序,F(xiàn)P 2.0.2 版本中間的 GDB版本為 6.2.1。然而 Free Pascal 的IDE 在Windows 下面一直飽受不穩(wěn)定的責(zé)難,因此很多人都不喜歡在 IDE 里面直接調(diào)試程序。但是做為調(diào)試器 GDB 還是非常優(yōu)秀,但是很多人在直接面對(duì)命令行調(diào)試程序時(shí)非常不,更重要的是
2、不會(huì)使用 GDB 的指令.對(duì)此,我給出我在使用 GDB 時(shí)的心得,希望大家能夠喜歡,從中受益。由于水平有限,時(shí)間倉(cāng)促(一天內(nèi)寫(xiě)的),錯(cuò)誤之處在所難免,之處敬WebSite請(qǐng)大家批評(píng)指正!如若有所更正,我會(huì)在咯,希望大家見(jiàn)諒。,而不會(huì)到處特別鳴謝:jyy 等幫助人。參考資料:Linux c 編程,2005 年 9 月。郁悶的是我打算寫(xiě)本手冊(cè)時(shí),這本書(shū)我找了半天沒(méi)有找到.里面對(duì) GDB 的介紹還是很不錯(cuò)的,不過(guò)不少用不到。當(dāng)年我困惑的時(shí)候這本書(shū)讓我豁然開(kāi)朗,學(xué)會(huì)了很多東西,介紹也比較詳細(xì),這個(gè)是最大的中文參考資料,搜索 GDB 即可獲得大量資料。但是我所看到的都不夠詳細(xì),遠(yuǎn)沒(méi)有好。我所使用的是 F
3、ree Pascal 2.0.2 及自帶的 GDB 6.2.1。不本的 Free Pascal,特別是 1.0.10 的 Free Pascal,已經(jīng)很老咯。使用 GDB 調(diào)試程序必須在被調(diào)試程序中間加入調(diào)試信息,F(xiàn)ree Pascal 和GCC 都是使用的 g 選項(xiàng),在命令行下使用如下方法:使用以前版這樣編譯出來(lái)的程序就帶有編譯信息咯,可以直接被 GDB 認(rèn)出來(lái)。p.s. fpc 的編譯選項(xiàng)中文解釋我已經(jīng)在 DRS,OIBH 上面了,有的可Website 查找。以去看看,也可以去在 FP 的 IDE 中可以在 Option 菜單下的 mode 中間選擇 Debug 模式,然后編譯程序,即可使
4、編譯后的程序帶有調(diào)試信息。需明的是沒(méi)人情況下直接按F9 編譯出來(lái)的程序并沒(méi)有帶調(diào)試信息,但是當(dāng)你按 F7 調(diào)試程序時(shí),F(xiàn)P 會(huì)重新按照編譯模式編譯一次代碼,從而使你可以編譯程序。直接使用GDB 有兩種形式,一種從 IDE 里面的 DeBug 菜單中GDB Window進(jìn)入 GDB 界面。這樣可以直接使用 GDB,但是仍然不是很穩(wěn)定。我不是特別推薦,當(dāng)然這個(gè)也有好處,和 IDE 結(jié)合比較緊密。比較好的方法是在命令行下面輸入 gdb temp.exe 直接進(jìn)入 GDB,如下:D:fpcbinwin32fpc.exe g E:prodataprogramtemptemp.pasFree Pascal
5、 Compiler ver2.0.2 2005/12/27 for i386 Copyright (c) 1993-2005 by FlorilaempflOS: Win32 for i386Compiling E:prodataprogramtemptemp.pas Linking E:prodataprogramtemptemp.exe99 Lines compiled, 0.1 secD:fpcbinwin32gdb.exe E:prodataprogramtemptemp.exe GNU gdb 6.2.1Copyright 2004 Free Software Foundation,
6、 Inc.GDB is free software, covered by the GNU General Public License, and you aree to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absoluy no warranty fDB. Type show warranty for details.This GDB was configured as i686-pc-cygwin.
7、(gdb)fpc g temp.pas這樣便進(jìn)入了 GDB 調(diào)試環(huán)境。當(dāng)然你也可以進(jìn)入 GDB 后用 file 再裝入要調(diào)試的程序:退出呢?quit 拉,縮寫(xiě)就是 q 拉。別隨便輸入哦,不然你設(shè)置的斷點(diǎn)監(jiān)視什么的就沒(méi)有咯,下次就會(huì)比較麻煩的咯。(gdb)是提示符,你也可以更改的,使用 set prompt userdefine 厄,我比較喜歡 GDB:可以設(shè)置成喜歡的提示符,這樣看起來(lái)更加好看些。進(jìn)入后你可以查看當(dāng)前的語(yǔ)言,GDB 能夠自動(dòng)識(shí)別你所用的編程語(yǔ)言,當(dāng)然也有可能不能識(shí)別,這時(shí)你可以設(shè)置一下:GDB 能夠自動(dòng)的識(shí)別命令的縮寫(xiě),這意味著可以不入冗長(zhǎng)的代碼,而只需輸入部分縮寫(xiě),例如 li
8、st 可以縮寫(xiě)成 l,break 可以縮寫(xiě)成 b,這樣的簡(jiǎn)寫(xiě)還有很多。你可以在 GDB 中嘗試輸入,如果 GDB 不能自動(dòng)識(shí)別,也會(huì)給出所有的可能,然后讓你選擇。List 指令是列出代碼的意思:GDBlist 1ID:bete1LANG: PASCALPROG: beads5GDBshow languageThe current source language is auto; currently pascal. GDBset language pascalGDBshow languageThe current source language is pascal. GDBset languag
9、e cGDBshow languageThe current source language is c. GDBset language pascalGDBshow languageThe current source language is pascal.(gdb) set prompt GDBGDB(gdb)file temp.exe Reading symbols from/cygdrive/e/prodata/program/temp/temp.exe.done.List 默認(rèn)列出 10 行代碼,你也可以指定列出哪 10 行,用 list n,這樣 n 上下 5 行都會(huì)列出來(lái),list
10、 則顯示上次顯示的 10 行的上面的 10 行,具體看下面的例子:GDBlko:;i:Word;Beginko:=True;For i:=1 To count DoIf datibThen ko:=False;If ko Then Exit(True);ko:=True;For i:=1 To count DoIf datiwThen ko:=False; GDBlIf ko Then Exit(True);ko:=True;For i:=1 To count DoIf datirThen ko:=False;same:=ko;End;73Procedure main;Vari,tmp:Wor
11、d; GDBl -Vardat:Array1.350Of Char;fin,fout:Text;count,zoo:Word; 10GDBlProcedure Init;Vari:Word;BeginAssign(fin,beads.in);Reset(fin);Readln(fin,count);FillChar(dat,sizeof(dat),#0);For i:=1 To count Do Read(fin,dati);Close(fin);Run 命令可以讓程序運(yùn)行,可以簡(jiǎn)寫(xiě)為 r。不過(guò)是來(lái)調(diào)試的,當(dāng)然不要直接運(yùn)行拉,調(diào)試就少不了斷點(diǎn),斷點(diǎn)使用b 即 break 來(lái)設(shè)置,用法是 b 行
12、號(hào),譬如 b 12,如果沒(méi)有行號(hào)就是在當(dāng)前設(shè)置斷點(diǎn),這個(gè)在進(jìn)入棧調(diào)試時(shí)很有用。也可以設(shè)置在進(jìn)入某一個(gè)函數(shù)時(shí)停止,如 b find,注意:主程序的斷點(diǎn)名稱(chēng)是 main,和 C 里面的一樣的名字!Break 也有高級(jí)應(yīng)用,如可以條件判斷Break if 例如:break if x=1當(dāng) x=1 時(shí),程序會(huì)自動(dòng)暫停!Break find if i=5當(dāng) find 函數(shù)中的 i=5 時(shí),程序會(huì)自動(dòng)暫停。我設(shè)置了斷點(diǎn)如何查看呢?使用 info break 就會(huì)列出所有的斷點(diǎn)詳細(xì)信息:設(shè)置了斷點(diǎn)我停是停下來(lái)咯,我還要繼續(xù)運(yùn)行程序啊!當(dāng)然,使用 c 即 continue 來(lái)繼續(xù)運(yùn)行程序。可以GDBb 62B
13、reakpo1 at $4012c4: file temp.pas, line 62. GDBb mainBreakpo2 at $40149c: file temp.pas, line 97. GDBinfo bNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62breakpokeep y $0040149cain at temp.pas:97ko:;i:Word;Beginko:=True;For i:=1 To count DoIf datibThen ko:=False;If ko Then
14、 Exit(True);ko:=True;For i:=1 To count DoIf datiwThen ko:=False;厄,設(shè)置錯(cuò)誤了怎么辦?退出重新來(lái)唄!嘿嘿,當(dāng)然不要那么麻煩拉! Del 即可!用法:del n (n 為斷點(diǎn)號(hào))。那如果我要暫時(shí)使某個(gè)斷點(diǎn)不可用怎么辦???disable n(n enable n 就是恢復(fù)斷點(diǎn)的使用拉!為斷點(diǎn)號(hào))厄,斷點(diǎn)我是知道使用了,只有斷點(diǎn)也沒(méi)有用??!我又不能查看變量的值,怎么弄啊。呵呵,這個(gè)當(dāng)然要有的拉 pr先啟動(dòng)程序:x(x 為變量名稱(chēng))。厄,還得補(bǔ)充點(diǎn)知識(shí),在 FE 中間按 F7,F(xiàn)8,時(shí)是步進(jìn),GDB 中F7 是什么指令呢?Step!即 s
15、 n(n 表示前進(jìn)幾步)F8 是 n 即 next,大家自己試試吧。和 S 一樣的屬性哦。GDBsINIT () at temp.pas:15Assign(fin,beads.in); GDBsReset(fin); GDBsReadln(fin,count);GDBprcount$1 = 0GDBRStarting program: /cygdrive/e/prodata/program/temp/temp.exe Breakpo2, main () at temp.pas:9797Init;GDBdisable 1 GDBinfo bNum TypeDisp Enb AddressWhat
16、breakpokeep n $004012c4 in SAME at temp.pas:62breakpokeep y $0040149cain at temp.pas:97 GDBenable 1GDBinfo bNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62breakpokeep y $0040149cain at temp.pas:97 GDBdel 1GDBinfo bNum TypeDisp Enb AddressWhat2 breakpokeep y $0040149cain at
17、 temp.pas:97Pr使用還是很方便的,可以用來(lái)輸出一個(gè)表達(dá)式的值,并輸出下一行的代碼。與 P 類(lèi)似的是 echo,大家可以輸入 help echo 了解。另外有個(gè) output只輸出值,而不輸出下一行代碼,而且不把打印的值在歷史中間。Display 可以設(shè)置一些自動(dòng)顯示的變量,當(dāng)程序停住時(shí),或是在但不這些變量會(huì)自動(dòng)顯示,用法:時(shí),Expr 為一個(gè)表達(dá)式。如果進(jìn)入一個(gè)函數(shù)了, 直接退出怎么辦啊,老在里面轉(zhuǎn)很暈?zāi)兀琌K,沒(méi)有問(wèn)題,你可以使用 u 即 until 來(lái)返回,它將運(yùn)行到函數(shù)返回,除非中間還有別的斷點(diǎn)。用 IDE 中間的 Watch 功能呢,厄.當(dāng)然還是 watch 拉,而且遠(yuǎn)比I
18、DE 中間的功能強(qiáng)大!Watch exp exp 為表達(dá)式,可以簡(jiǎn)單的就只要監(jiān)視變量的值的改變就有咯。而且,當(dāng)你的程序運(yùn)行時(shí),倘若監(jiān)視的變量的值發(fā)生了改變,程序會(huì)自動(dòng)暫停下來(lái),并輸出值和下一行代碼。這樣你可以很方便的查看咯!怎么樣,比 IDE中間的功能強(qiáng)大吧,Display GDBs18FillChar(dat,sizeof(dat),#0);GDBprcount$2 = 29GDBli:Word;BeginAssign(fin,beads.in);Reset(fin);Readln(fin,count);FillChar(dat,sizeof(dat),#0);For i:=1 To cou
19、nt Do Read(fin,dati);Close(fin);End;22GDBnFor i:=1 To count Do Read(fin,dati); GDBnClose(fin); GDBnEnd;GDBnmain () at temp.pas:9898main;GDBwatch iHardware watchpo3: I GDBwatch countHardware watchpo4: COUNT GDBinfo watchNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62 breakp
20、oalready hit 1 timebreakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1 timehw watchpokeep yIhw watchpokeep yCOUNT GDBinfo breakNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62 breakpoalready hit 1 timebreakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1
21、 timehw watchpokeep yIhw watchpokeep yCOUNTGDBcContinuing.Program received signal SIGTRAP, Trace/breakpotrap.$00401070 in INIT () at temp.pas:1717Readln(fin,count);GDBprcount$5 = 29GDBcContinuing.Breakpo1, SAME () at temp.pas:6262If datibThen ko:=False; GDBp i$6 = 1GDBcContinuing.Breakpo1, SAME () a
22、t temp.pas:6262If datibThen ko:=False; GDBp i$7 = 2刪除監(jiān)視和刪除斷點(diǎn)一樣的方法,直接 delete n(n 為)。另外還有 rwatch 和 awatch,一個(gè)是當(dāng)表達(dá)式被讀時(shí)暫停程序,一個(gè)是當(dāng)表達(dá)式被讀或?qū)憰r(shí)暫停程序。感覺(jué)要的功能差不多了,但是我發(fā)現(xiàn)程序運(yùn)行過(guò)頭了,重新運(yùn)行,怎么辦啊?暈死,這還不簡(jiǎn)單啊,看見(jiàn)那個(gè) X 咯么?點(diǎn)擊就有咯?。《?,其實(shí)可以很簡(jiǎn)單的,輸入 k 即 kill 就可以把調(diào)試的程序進(jìn)程 cut 咯!而且設(shè)置的斷點(diǎn)什么全部保存咯。不知道程序什么狀態(tài)?很簡(jiǎn)單嘛,輸入 info program 就會(huì)顯示程序當(dāng)前狀態(tài),運(yùn)行還是
23、ready。GDBkGDBinfo programThe program being debugged is not being run.GDBinfo bNum TypeDisp Enb AddressWhatbreakpokeep y $004012c4 in SAME at temp.pas:62 breakpoalready hit 3 timesbreakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1 time4 hw watchpokeep yCOUNT GDBd 1GDBinfo bNum TypeDisp En
24、b AddressWhat2 breakpokeep y $0040149cain at temp.pas:97 breakpoalready hit 1 time4 hw watchpokeep yCOUNT好拉,不完全手冊(cè)到這里就基本結(jié)束咯,已經(jīng)足夠應(yīng)付調(diào)試程序咯。下面再次回顧 GDB 的常用命令:命令縮寫(xiě)用法作用、備注HelpHHd顯示命令的幫助,不懂就要多多使用File無(wú)File filename裝入要調(diào)試的可執(zhí)行文件InfoIInfo optionoption 可以是 program,break.RunRR運(yùn)行要調(diào)試的程序Step步進(jìn),相當(dāng)于 F7,n 為步進(jìn)次數(shù)NextNN n下一
25、步,相當(dāng)于F8,n 為下一步的次數(shù)ContinueCC繼續(xù)執(zhí)行程序BreakBB optionOption 可以是 num 或者 functioonWatchWW exp監(jiān)視表達(dá)式的值KillKK結(jié)束當(dāng)前調(diào)試的程序PrPP exp打印表達(dá)式的值OutputOO exp同 pr,但是不輸出下一行的語(yǔ)句EchoEE e同 prPwdPwdPwd顯示當(dāng)前路徑,用過(guò)linux 的人都知道info watch|break顯示斷點(diǎn)和監(jiān)視DeleteDD num刪除為 num 的斷點(diǎn)和監(jiān)視Show language顯示當(dāng)前語(yǔ)言Set language pascal設(shè)置代碼語(yǔ)言DisableDisable n
26、為 n 的斷點(diǎn)暫時(shí)無(wú)效無(wú)EnableEnable n與 disable 相反無(wú)DiplayDisplay expr無(wú)暫停,步進(jìn)時(shí)自動(dòng)顯示表達(dá)式的值附源代碼:ID:bete1LANG: PASCALPROG: beads/盡管完成咯, Var還不是最佳的dat:Array1.350Of Char; fin,fout:Text; count,zoo:Word;Procedure Init;Vari:Word;BeginAssign(fin,beads.in); Reset(fin); Readln(fin,count); FillChar(dat,sizeof(dat),#0);For i:=1 To count Do Read(fin,dati); Close(fin);End;Function find(n:Word):Word;Vark,ok,nk:Word; ch,tmp:Char;did:Begink:=n; ch:=datk; tmp:=ch; did:=False; RepeatInc(k);If k=n Then Exit(count);If k=count+1 Then If not did Then Begin k:=1;did:=True;End Else Brea
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 全無(wú)機(jī)零維無(wú)鉛鈣鈦礦單晶的結(jié)晶生長(zhǎng)調(diào)控及X射線探測(cè)器研究
- 退火處理對(duì)Pt基塊體金屬玻璃納米力學(xué)行為的影響研究
- 深度學(xué)習(xí)指向下高中英語(yǔ)閱讀課教學(xué)評(píng)一體化實(shí)踐研究
- 烏鎮(zhèn)旅游電子商務(wù)
- 針刺治療失眠
- 腰椎間盤(pán)突出癥日常護(hù)理
- 閩臺(tái)師資培訓(xùn)總結(jié)
- 股骨頸骨折臨床表現(xiàn)及護(hù)理
- 過(guò)程檢驗(yàn)員培訓(xùn)
- 電視片新媒體發(fā)行協(xié)議
- 2024年福建省公務(wù)員錄用考試《行測(cè)》試題及答案解析
- 供熱管網(wǎng)維保服務(wù)方案
- 現(xiàn)代家政導(dǎo)論-課件 4.1.1認(rèn)識(shí)家政教育及意義
- 浙江省【高等職業(yè)技術(shù)教育招生考試】-商業(yè)類(lèi)(電子商務(wù))-職業(yè)技能理論知識(shí)(一)(答案版)
- 人教版小學(xué)六年級(jí)下冊(cè)音樂(lè)教案全冊(cè)
- DBJT 13-460-2024 既有多層住宅建筑增設(shè)電梯工程技術(shù)標(biāo)準(zhǔn)
- 2024年資格考試-WSET二級(jí)認(rèn)證考試近5年真題附答案
- 貨物類(lèi)投標(biāo)方案(技術(shù)標(biāo))
- 《與朱元思書(shū)》課件
- 肺栓塞患者護(hù)理查房完整版
- 2024年煉鋼工職業(yè)技能競(jìng)賽理論考試題庫(kù)500題(含答案)
評(píng)論
0/150
提交評(píng)論