




版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、GDB 不完全手冊巫山霏云msn:fWebSite:http:GDB 即 GNU Debuger,是 GNU 下的調試器.主要是用在 linux 下面。但是也有人把它移植到 Win32上面,這樣常常在 Windows 下面的人也有機會接觸到這個非常優秀的調試器。Free Pascal 一直都是調用 GDB 來調試程序,FP 2.0.2 版本中間的 GDB版本為 6.2.1。然而 Free Pascal 的IDE 在Windows 下面一直飽受不穩定的責難,因此很多人都不喜歡在 IDE 里面直接調試程序。但是做為調試器 GDB 還是非常優秀,但是很多人在直接面對命令行調試程序時非常不,更重要的是
2、不會使用 GDB 的指令.對此,我給出我在使用 GDB 時的心得,希望大家能夠喜歡,從中受益。由于水平有限,時間倉促(一天內寫的),錯誤之處在所難免,之處敬WebSite請大家批評指正!如若有所更正,我會在咯,希望大家見諒。,而不會到處特別鳴謝:jyy 等幫助人。參考資料:Linux c 編程,2005 年 9 月。郁悶的是我打算寫本手冊時,這本書我找了半天沒有找到.里面對 GDB 的介紹還是很不錯的,不過不少用不到。當年我困惑的時候這本書讓我豁然開朗,學會了很多東西,介紹也比較詳細,這個是最大的中文參考資料,搜索 GDB 即可獲得大量資料。但是我所看到的都不夠詳細,遠沒有好。我所使用的是 F
3、ree Pascal 2.0.2 及自帶的 GDB 6.2.1。不本的 Free Pascal,特別是 1.0.10 的 Free Pascal,已經很老咯。使用 GDB 調試程序必須在被調試程序中間加入調試信息,Free Pascal 和GCC 都是使用的 g 選項,在命令行下使用如下方法:使用以前版這樣編譯出來的程序就帶有編譯信息咯,可以直接被 GDB 認出來。p.s. fpc 的編譯選項中文解釋我已經在 DRS,OIBH 上面了,有的可Website 查找。以去看看,也可以去在 FP 的 IDE 中可以在 Option 菜單下的 mode 中間選擇 Debug 模式,然后編譯程序,即可使
4、編譯后的程序帶有調試信息。需明的是沒人情況下直接按F9 編譯出來的程序并沒有帶調試信息,但是當你按 F7 調試程序時,FP 會重新按照編譯模式編譯一次代碼,從而使你可以編譯程序。直接使用GDB 有兩種形式,一種從 IDE 里面的 DeBug 菜單中GDB Window進入 GDB 界面。這樣可以直接使用 GDB,但是仍然不是很穩定。我不是特別推薦,當然這個也有好處,和 IDE 結合比較緊密。比較好的方法是在命令行下面輸入 gdb temp.exe 直接進入 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這樣便進入了 GDB 調試環境。當然你也可以進入 GDB 后用 file 再裝入要調試的程序:退出呢?quit 拉,縮寫就是 q 拉。別隨便輸入哦,不然你設置的斷點監視什么的就沒有咯,下次就會比較麻煩的咯。(gdb)是提示符,你也可以更改的,使用 set prompt userdefine 厄,我比較喜歡 GDB:可以設置成喜歡的提示符,這樣看起來更加好看些。進入后你可以查看當前的語言,GDB 能夠自動識別你所用的編程語言,當然也有可能不能識別,這時你可以設置一下: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 默認列出 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 命令可以讓程序運行,可以簡寫為 r。不過是來調試的,當然不要直接運行拉,調試就少不了斷點,斷點使用b 即 break 來設置,用法是 b 行
12、號,譬如 b 12,如果沒有行號就是在當前設置斷點,這個在進入棧調試時很有用。也可以設置在進入某一個函數時停止,如 b find,注意:主程序的斷點名稱是 main,和 C 里面的一樣的名字!Break 也有高級應用,如可以條件判斷Break if 例如:break if x=1當 x=1 時,程序會自動暫停!Break find if i=5當 find 函數中的 i=5 時,程序會自動暫停。我設置了斷點如何查看呢?使用 info break 就會列出所有的斷點詳細信息:設置了斷點我停是停下來咯,我還要繼續運行程序啊!當然,使用 c 即 continue 來繼續運行程序。可以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;厄,設置錯誤了怎么辦?退出重新來唄!嘿嘿,當然不要那么麻煩拉! Del 即可!用法:del n (n 為斷點號)。那如果我要暫時使某個斷點不可用怎么辦啊?disable n(n enable n 就是恢復斷點的使用拉!為斷點號)厄,斷點我是知道使用了,只有斷點也沒有用啊!我又不能查看變量的值,怎么弄啊。呵呵,這個當然要有的拉 pr先啟動程序:x(x 為變量名稱)。厄,還得補充點知識,在 FE 中間按 F7,F8,時是步進,GDB 中F7 是什么指令呢?Step!即 s
15、 n(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使用還是很方便的,可以用來輸出一個表達式的值,并輸出下一行的代碼。與 P 類似的是 echo,大家可以輸入 help echo 了解。另外有個 output只輸出值,而不輸出下一行代碼,而且不把打印的值在歷史中間。Display 可以設置一些自動顯示的變量,當程序停住時,或是在但不這些變量會自動顯示,用法:時,Expr 為一個表達式。如果進入一個函數了, 直接退出怎么辦啊,老在里面轉很暈呢,OK,沒有問題,你可以使用 u 即 until 來返回,它將運行到函數返回,除非中間還有別的斷點。用 IDE 中間的 Watch 功能呢,厄.當然還是 watch 拉,而且遠比I
18、DE 中間的功能強大!Watch exp exp 為表達式,可以簡單的就只要監視變量的值的改變就有咯。而且,當你的程序運行時,倘若監視的變量的值發生了改變,程序會自動暫停下來,并輸出值和下一行代碼。這樣你可以很方便的查看咯!怎么樣,比 IDE中間的功能強大吧,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刪除監視和刪除斷點一樣的方法,直接 delete n(n 為)。另外還有 rwatch 和 awatch,一個是當表達式被讀時暫停程序,一個是當表達式被讀或寫時暫停程序。感覺要的功能差不多了,但是我發現程序運行過頭了,重新運行,怎么辦啊?暈死,這還不簡單啊,看見那個 X 咯么?點擊就有咯啊!厄,其實可以很簡單的,輸入 k 即 kill 就可以把調試的程序進程 cut 咯!而且設置的斷點什么全部保存咯。不知道程序什么狀態?很簡單嘛,輸入 info program 就會顯示程序當前狀態,運行還是
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好拉,不完全手冊到這里就基本結束咯,已經足夠應付調試程序咯。下面再次回顧 GDB 的常用命令:命令縮寫用法作用、備注HelpHHd顯示命令的幫助,不懂就要多多使用File無File filename裝入要調試的可執行文件InfoIInfo optionoption 可以是 program,break.RunRR運行要調試的程序Step步進,相當于 F7,n 為步進次數NextNN n下一
25、步,相當于F8,n 為下一步的次數ContinueCC繼續執行程序BreakBB optionOption 可以是 num 或者 functioonWatchWW exp監視表達式的值KillKK結束當前調試的程序PrPP exp打印表達式的值OutputOO exp同 pr,但是不輸出下一行的語句EchoEE e同 prPwdPwdPwd顯示當前路徑,用過linux 的人都知道info watch|break顯示斷點和監視DeleteDD num刪除為 num 的斷點和監視Show language顯示當前語言Set language pascal設置代碼語言DisableDisable n
26、為 n 的斷點暫時無效無EnableEnable n與 disable 相反無DiplayDisplay expr無暫停,步進時自動顯示表達式的值附源代碼: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. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030中國植保無人機行業前景展望及投資策略研究研究報告
- 2025-2030中國桂圓市場消費趨勢預測與未來供需格局研究研究報告
- 2025-2030中國朗姆酒行業發展分析及投資價值評估研究報告
- 2025-2030中國智慧園區行業市場深度調研及發展策略與投資前景研究報告
- 2025-2030中國無線電發射塔行業市場現狀供需分析及投資評估規劃分析研究報告
- 2025-2030中國新風量檢測儀行業市場深度調研及前景趨勢與投資研究報告
- 九年級語文課程內容整合計劃
- 化學能源轉換的多學科交叉研究-洞察闡釋
- 多設備協同的鍵盤隱藏模型研究與實現-洞察闡釋
- 品牌故事與情感營銷-洞察闡釋
- 智能教育技術驅動的個性化學習路徑優化研究
- 基層治理現代化視角下“楓橋經驗”的實踐路徑與創新研究
- 通信光纜租用協議合同書
- 2024-2025部編版小學道德與法治一年級下冊期末考試卷及答案(三套)
- 醫療救助資金動態調整機制-洞察闡釋
- 籃球培訓報名合同協議
- 金屬非金屬礦山重大事故隱患判定標準-尾礦庫
- 自考00061國家稅收歷年真題及答案
- 公共組織績效評估-形考任務一(占10%)-國開(ZJ)-參考資料
- 冠狀動脈介入診斷治療
- 高效催化劑的開發與應用-全面剖析
評論
0/150
提交評論