網(wǎng)上找的一些語言gdb不完全手冊_第1頁
網(wǎng)上找的一些語言gdb不完全手冊_第2頁
網(wǎng)上找的一些語言gdb不完全手冊_第3頁
網(wǎng)上找的一些語言gdb不完全手冊_第4頁
網(wǎng)上找的一些語言gdb不完全手冊_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、GDB 不完全手冊巫山霏云msn:fWebSite:http:GDB 即 GNU Debuger,是 GNU 下的調(diào)試器.主要是用在 linux 下面。但是也有人把它移植到 Win32上面,這樣常常在 Windows 下面的人也有機(jī)會接觸到這個非常優(yōu)秀的調(diào)試器。Free Pascal 一直都是調(diào)用 GDB 來調(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)秀,但是很多人在直接面對命令行調(diào)試程序時非常不,更重要的是

2、不會使用 GDB 的指令.對此,我給出我在使用 GDB 時的心得,希望大家能夠喜歡,從中受益。由于水平有限,時間倉促(一天內(nèi)寫的),錯誤之處在所難免,之處敬WebSite請大家批評指正!如若有所更正,我會在咯,希望大家見諒。,而不會到處特別鳴謝:jyy 等幫助人。參考資料:Linux c 編程,2005 年 9 月。郁悶的是我打算寫本手冊時,這本書我找了半天沒有找到.里面對 GDB 的介紹還是很不錯的,不過不少用不到。當(dāng)年我困惑的時候這本書讓我豁然開朗,學(xué)會了很多東西,介紹也比較詳細(xì),這個是最大的中文參考資料,搜索 GDB 即可獲得大量資料。但是我所看到的都不夠詳細(xì),遠(yuǎn)沒有好。我所使用的是 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 選項,在命令行下使用如下方法:使用以前版這樣編譯出來的程序就帶有編譯信息咯,可以直接被 GDB 認(rèn)出來。p.s. fpc 的編譯選項中文解釋我已經(jīng)在 DRS,OIBH 上面了,有的可Website 查找。以去看看,也可以去在 FP 的 IDE 中可以在 Option 菜單下的 mode 中間選擇 Debug 模式,然后編譯程序,即可使

4、編譯后的程序帶有調(diào)試信息。需明的是沒人情況下直接按F9 編譯出來的程序并沒有帶調(diào)試信息,但是當(dāng)你按 F7 調(diào)試程序時,F(xiàn)P 會重新按照編譯模式編譯一次代碼,從而使你可以編譯程序。直接使用GDB 有兩種形式,一種從 IDE 里面的 DeBug 菜單中GDB Window進(jìn)入 GDB 界面。這樣可以直接使用 GDB,但是仍然不是很穩(wěn)定。我不是特別推薦,當(dāng)然這個也有好處,和 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 拉,縮寫就是 q 拉。別隨便輸入哦,不然你設(shè)置的斷點監(jiān)視什么的就沒有咯,下次就會比較麻煩的咯。(gdb)是提示符,你也可以更改的,使用 set prompt userdefine 厄,我比較喜歡 GDB:可以設(shè)置成喜歡的提示符,這樣看起來更加好看些。進(jìn)入后你可以查看當(dāng)前的語言,GDB 能夠自動識別你所用的編程語言,當(dāng)然也有可能不能識別,這時你可以設(shè)置一下:GDB 能夠自動的識別命令的縮寫,這意味著可以不入冗長的代碼,而只需輸入部分縮寫,例如 li

8、st 可以縮寫成 l,break 可以縮寫成 b,這樣的簡寫還有很多。你可以在 GDB 中嘗試輸入,如果 GDB 不能自動識別,也會給出所有的可能,然后讓你選擇。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 行都會列出來,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)行,可以簡寫為 r。不過是來調(diào)試的,當(dāng)然不要直接運(yùn)行拉,調(diào)試就少不了斷點,斷點使用b 即 break 來設(shè)置,用法是 b 行

12、號,譬如 b 12,如果沒有行號就是在當(dāng)前設(shè)置斷點,這個在進(jìn)入棧調(diào)試時很有用。也可以設(shè)置在進(jìn)入某一個函數(shù)時停止,如 b find,注意:主程序的斷點名稱是 main,和 C 里面的一樣的名字!Break 也有高級應(yīng)用,如可以條件判斷Break if 例如:break if x=1當(dāng) x=1 時,程序會自動暫停!Break find if i=5當(dāng) find 函數(shù)中的 i=5 時,程序會自動暫停。我設(shè)置了斷點如何查看呢?使用 info break 就會列出所有的斷點詳細(xì)信息:設(shè)置了斷點我停是停下來咯,我還要繼續(xù)運(yùn)行程序??!當(dāng)然,使用 c 即 continue 來繼續(xù)運(yùn)行程序??梢訥DBb 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è)置錯誤了怎么辦?退出重新來唄!嘿嘿,當(dāng)然不要那么麻煩拉! Del 即可!用法:del n (n 為斷點號)。那如果我要暫時使某個斷點不可用怎么辦???disable n(n enable n 就是恢復(fù)斷點的使用拉!為斷點號)厄,斷點我是知道使用了,只有斷點也沒有用啊!我又不能查看變量的值,怎么弄啊。呵呵,這個當(dāng)然要有的拉 pr先啟動程序:x(x 為變量名稱)。厄,還得補(bǔ)充點知識,在 FE 中間按 F7,F(xiàn)8,時是步進(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使用還是很方便的,可以用來輸出一個表達(dá)式的值,并輸出下一行的代碼。與 P 類似的是 echo,大家可以輸入 help echo 了解。另外有個 output只輸出值,而不輸出下一行代碼,而且不把打印的值在歷史中間。Display 可以設(shè)置一些自動顯示的變量,當(dāng)程序停住時,或是在但不這些變量會自動顯示,用法:時,Expr 為一個表達(dá)式。如果進(jìn)入一個函數(shù)了, 直接退出怎么辦啊,老在里面轉(zhuǎn)很暈?zāi)兀琌K,沒有問題,你可以使用 u 即 until 來返回,它將運(yùn)行到函數(shù)返回,除非中間還有別的斷點。用 IDE 中間的 Watch 功能呢,厄.當(dāng)然還是 watch 拉,而且遠(yuǎn)比I

18、DE 中間的功能強(qiáng)大!Watch exp exp 為表達(dá)式,可以簡單的就只要監(jiān)視變量的值的改變就有咯。而且,當(dāng)你的程序運(yùn)行時,倘若監(jiān)視的變量的值發(fā)生了改變,程序會自動暫停下來,并輸出值和下一行代碼。這樣你可以很方便的查看咯!怎么樣,比 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)視和刪除斷點一樣的方法,直接 delete n(n 為)。另外還有 rwatch 和 awatch,一個是當(dāng)表達(dá)式被讀時暫停程序,一個是當(dāng)表達(dá)式被讀或?qū)憰r暫停程序。感覺要的功能差不多了,但是我發(fā)現(xiàn)程序運(yùn)行過頭了,重新運(yùn)行,怎么辦???暈死,這還不簡單啊,看見那個 X 咯么?點擊就有咯啊!厄,其實可以很簡單的,輸入 k 即 kill 就可以把調(diào)試的程序進(jìn)程 cut 咯!而且設(shè)置的斷點什么全部保存咯。不知道程序什么狀態(tài)?很簡單嘛,輸入 info program 就會顯示程序當(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好拉,不完全手冊到這里就基本結(jié)束咯,已經(jīng)足夠應(yīng)付調(diào)試程序咯。下面再次回顧 GDB 的常用命令:命令縮寫用法作用、備注HelpHHd顯示命令的幫助,不懂就要多多使用File無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,但是不輸出下一行的語句EchoEE e同 prPwdPwdPwd顯示當(dāng)前路徑,用過linux 的人都知道info watch|break顯示斷點和監(jiān)視DeleteDD num刪除為 num 的斷點和監(jiān)視Show language顯示當(dāng)前語言Set language pascal設(shè)置代碼語言DisableDisable n

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

評論

0/150

提交評論