版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、1第第6 6章章 GDB GDB調(diào)試工具調(diào)試工具6.1 GDB簡介GDBGDBGNU DebuggerGNU Debugger,是,是FSFFSF的一個強大的命令的一個強大的命令行調(diào)試工具。行調(diào)試工具。雖然,它沒有圖形化的友好界面,但是它雖然,它沒有圖形化的友好界面,但是它強大的功能也足以與微軟的強大的功能也足以與微軟的VCVC工具等媲美工具等媲美。主要提供主要提供4 4個方面的功能:個方面的功能:l指定啟動程序的方式指定啟動程序的方式l可以在被調(diào)試的程序中設(shè)置斷點,斷點可以設(shè)置在程可以在被調(diào)試的程序中設(shè)置斷點,斷點可以設(shè)置在程序源文件中的某一行、某函數(shù)的入口或滿足某各條件序源文件中的某一行、
2、某函數(shù)的入口或滿足某各條件時。時。l當(dāng)程序被停住時,可以檢查此時程序中所發(fā)生的事件當(dāng)程序被停住時,可以檢查此時程序中所發(fā)生的事件l可以動態(tài)改變程序的執(zhí)行環(huán)境??梢詣討B(tài)改變程序的執(zhí)行環(huán)境。 6.1 GDB簡介GDBGDB是一個命令行工具,其常用啟動格式如下:是一個命令行工具,其常用啟動格式如下:lgdb executable-file 使用使用GDBGDB調(diào)試程序的注意事項:調(diào)試程序的注意事項:l在對源程序編譯時要加在對源程序編譯時要加-g-g選項選項,以使編譯出來的程序,以使編譯出來的程序中包含需要的調(diào)試信息。中包含需要的調(diào)試信息。l在對源程序編譯時最好不要對程序進行優(yōu)化編譯。在對源程序編譯時
3、最好不要對程序進行優(yōu)化編譯。l由于編譯器在目標(biāo)文件和可執(zhí)行文件中加入了對源代由于編譯器在目標(biāo)文件和可執(zhí)行文件中加入了對源代碼的引用,所以,碼的引用,所以,為保證調(diào)試信息可用,源代碼必須為保證調(diào)試信息可用,源代碼必須存在,且路徑不能改變存在,且路徑不能改變6.1 GDB簡介例如:rootjHL-RHL 6.3# gdb helloGNU gdb Red Hat Linux (5.3post-0.20021129.18rh)Copyright 2003 Free Software Foundation, Inc.GDB is free software, covered by the GNU Ge
4、neral Public License, and you are welcome to change it and/or distribute copies of it under certain conditions.Type show copying to see the conditions.There is absolutely no warranty for GDB. Type show warranty for details.This GDB was configured as i386-redhat-linux-gnu.(gdb) GDB的提示符GDBGDB中的常用命令如下:
5、中的常用命令如下:6.1 GDB簡介命令含義file載入程序。如file hello。當(dāng)然,程序的路徑名要正確。quit退出GDB。也可以輸入C-d來退出GDB。run執(zhí)行載入后的要調(diào)試的程序??梢暂斎?yún)?shù)。info查看程序的信息。多用來查看斷點信息。可以用help info來查看其幫助。info sourc查看當(dāng)前文件的名字,路徑,所使用的程序語言等信息。info stack 查看調(diào)用棧。info local 查看局部變量信息。info br br(break的縮寫)可以得到所設(shè)置的所有斷點的詳細信息。listlist FUNCTION列出被調(diào)試程序某個函數(shù)list LINENUM以當(dāng)前源文
6、件的某行為中間顯示一段源程序list 接著前一次繼續(xù)顯示list - 顯示前一次之前的源程序list FILENAME:FUNCTION顯示另一個文件的一段程序,GDBGDB中的常用命令如下:中的常用命令如下:6.1 GDB簡介命令含 義break最常用和最重要:設(shè)置斷點。break FUNCTION在函數(shù)入口設(shè)置斷點 break LINENUM在當(dāng)前源文件的某一行上設(shè)置斷點 break FILENAME:LINENUM在另一個源文件的某一行上設(shè)置斷點 break *ADDRESS在某個地址上設(shè)置斷點watch監(jiān)視某個表達式或變量,當(dāng)它被讀或被寫時讓程序停下。格式如下:watch EXPRES
7、SION set修改變量值。格式:set varible=valuestep單步執(zhí)行,進入遇到的函數(shù)。next單步執(zhí)行,不進入函數(shù)調(diào)用,即視函數(shù)調(diào)用為普通語句。continue恢復(fù)中斷的程序執(zhí)行,直到遇到下一個斷點。help獲取幫助,如獲得list指令:help list6.2 使用GDB調(diào)試程序6.2.1 6.2.1 基本操作基本操作l使用使用-g-g選項進行編譯:選項進行編譯:ugcc g Wall gcb_test.c o gdb_testl啟動并載入生成的可執(zhí)行程序:啟動并載入生成的可執(zhí)行程序:ugdb 如 gdb gdb_testl在在mainmain函數(shù)入口點設(shè)置斷點:函數(shù)入口點設(shè)
8、置斷點:ubreak 如 break main 或 b mainubreak 如 break 34l使用使用runrun命令運行程序,將在斷點處停下。命令運行程序,將在斷點處停下。urun 或 rurun 參數(shù)表相當(dāng)于命令行參數(shù)參數(shù)表相當(dāng)于命令行參數(shù)l使用使用next命令,可從斷點處執(zhí)行一行(不進命令,可從斷點處執(zhí)行一行(不進入函數(shù))入函數(shù))unext 或 n l使用使用step命令,可從斷點處執(zhí)行一行(進入命令,可從斷點處執(zhí)行一行(進入函數(shù))函數(shù))ustep 或 s l使用使用continuecontinue可恢復(fù)中斷了的程序繼續(xù)運行可恢復(fù)中斷了的程序繼續(xù)運行直到下一斷點或程序結(jié)束。直到下一
9、斷點或程序結(jié)束。ucontinue 或 cucontinue 繼續(xù)運行,并忽略后面若干斷點6.2.2 6.2.2 查看命令查看命令llist命令查看源程序ulist -顯示批定行號周圍的源程序ulist -顯示指定函數(shù)代碼ulist接著前一list命令繼續(xù)顯示源程序lwhere命令查看當(dāng)前程序運行位置uwherelprint命令查看程序中變量的值uprint / 下標(biāo)顯示指定變量或數(shù)組元素的值。uprint 下標(biāo)-顯示數(shù)組中從指定元素開始的n個元素的值。lwhatiswhatis命令命令查看變量的類型查看變量的類型uwhatis whatis / lptypeptype命令命令查看變量的類型查
10、看變量的類型uptype ptype /,此命令與此命令與whatiswhatis命令命令基本相同,只是能更好的顯示結(jié)構(gòu)體變量或數(shù)組的類型?;鞠嗤?,只是能更好的顯示結(jié)構(gòu)體變量或數(shù)組的類型。lclearclear命令命令清除斷點清除斷點uclear clear / 清除指定行或函數(shù)上的斷點清除指定行或函數(shù)上的斷點ldeletedelete命令命令清除斷點清除斷點udelete-delete-清除所有斷點清除所有斷點udelete delete -清除指定的斷點清除指定的斷點6.2.3 6.2.3 高級命令高級命令l設(shè)置條件斷點:設(shè)置條件斷點:uBreak Break if if 如:如:bre
11、ak 21 if ibreak 21 if i= =3 3,表示執(zhí)行到第,表示執(zhí)行到第2121行且行且i i的值為的值為3 3時停下。時停下。ucondition condition - -修改指定斷點修改指定斷點號處的停止條件為號處的停止條件為,無,無則刪除條件則刪除條件l自動化調(diào)試自動化調(diào)試 可以使用可以使用GDBGDB提供的提供的commandcommand命令來設(shè)置在停命令來設(shè)置在停止點停止后運行的命令。也就是說,當(dāng)運行的程止點停止后運行的命令。也就是說,當(dāng)運行的程序在被停止住時,我們可以讓序在被停止住時,我們可以讓GDBGDB自動運行一些自動運行一些別的命令。別的命令。ucomman
12、dscommands命令的格式為:命令的格式為:commandsbnumcommandsbnum command list command list end end u例如:例如:commands 2commands 2 printf printf “x is %dnx is %dn”,x ,x continue continueend end l設(shè)置變量的值設(shè)置變量的值uset variable set variable = l自動顯示自動顯示displaydisplay 可以設(shè)置一些自動顯示的變量,當(dāng)程序停住時,可以設(shè)置一些自動顯示的變量,當(dāng)程序停住時,或是在你單步跟蹤時,這些變量會自動顯
13、示。該命令或是在你單步跟蹤時,這些變量會自動顯示。該命令主要用于在多個斷點處均需要顯示相同變量或表達式主要用于在多個斷點處均需要顯示相同變量或表達式的值時。相關(guān)的的值時。相關(guān)的GDBGDB命令是命令是displaydisplay。display display expr expr是一個變量或表達式,當(dāng)你用是一個變量或表達式,當(dāng)你用displaydisplay設(shè)定好設(shè)定好了一個或多個表達式后,只要你的程序被停下來,了一個或多個表達式后,只要你的程序被停下來,GDBGDB會自動顯示你所設(shè)置的這些表達式的值。會自動顯示你所設(shè)置的這些表達式的值。 undisplaydnumsundisplay 或或
14、delete displaydnums delete display 刪除自動顯示,刪除自動顯示,dnumsdnums意為所設(shè)置好了的自動顯示意為所設(shè)置好了的自動顯示的編號。如果要同時刪除幾個,編號可以用空格分隔的編號。如果要同時刪除幾個,編號可以用空格分隔,如果要刪除一個范圍內(nèi)的編號,可以用減號表示(,如果要刪除一個范圍內(nèi)的編號,可以用減號表示(如:如:2-52-5)。如果不帶)。如果不帶dnumsdnums,則刪除所有自動顯示。,則刪除所有自動顯示。lfinish finish 運行程序,直到當(dāng)前函數(shù)完成返回。并打印函運行程序,直到當(dāng)前函數(shù)完成返回。并打印函數(shù)返回時的堆棧地址和返回值及參數(shù)
15、值信息數(shù)返回時的堆棧地址和返回值及參數(shù)值信息luntil until 或或 u u 當(dāng)你厭倦了在一個循環(huán)體內(nèi)單步跟蹤時,這個當(dāng)你厭倦了在一個循環(huán)體內(nèi)單步跟蹤時,這個命令可以運行程序直到退出循環(huán)體。命令可以運行程序直到退出循環(huán)體。 6.3 遠程GDB調(diào)試遠程調(diào)試用于調(diào)試器和被調(diào)試的程序運行遠程調(diào)試用于調(diào)試器和被調(diào)試的程序運行在不同的主機上時。在不同的主機上時。遠程調(diào)試是一種更適合嵌入式系統(tǒng)的遠程調(diào)試是一種更適合嵌入式系統(tǒng)的GDBGDB調(diào)試調(diào)試手段手段遠程調(diào)試使用遠程調(diào)試使用目標(biāo)機端的目標(biāo)機端的GDBGDB服務(wù)器服務(wù)器和和主機端主機端的的GDBGDB調(diào)試器調(diào)試器進行調(diào)試。進行調(diào)試。6.3.1 6.
16、3.1 本地本地GDBGDB調(diào)試和遠程調(diào)試和遠程GDBGDB調(diào)試的比較調(diào)試的比較圖圖61 X86和目標(biāo)機的本地和目標(biāo)機的本地GDB調(diào)試調(diào)試X86本地調(diào)試本地調(diào)試目標(biāo)機本地調(diào)試目標(biāo)機本地調(diào)試本地調(diào)試不適合嵌入式系統(tǒng):本地調(diào)試不適合嵌入式系統(tǒng):l嵌入式目標(biāo)機不一定具有嵌入式目標(biāo)機不一定具有GDBGDB程序運行的條件:目程序運行的條件:目標(biāo)機可能不存在標(biāo)機可能不存在GDBGDB運行所需要的一些庫。運行所需要的一些庫。lGDBGDB運行開銷大,會受到嵌入式系統(tǒng)中運行開銷大,會受到嵌入式系統(tǒng)中CPUCPU主頻和內(nèi)主頻和內(nèi)存的限制。存的限制。遠程調(diào)試更加適合于嵌入式系統(tǒng):遠程調(diào)試更加適合于嵌入式系統(tǒng):l遠
17、程遠程GDBGDB調(diào)試由調(diào)試由gdbserver(GDBgdbserver(GDB服務(wù)器,稱為調(diào)試樁服務(wù)器,稱為調(diào)試樁或調(diào)試代理或調(diào)試代理) )和和GDBGDB調(diào)試器組成調(diào)試器組成,gdbservergdbserver是一個是一個運行在目標(biāo)機端的程序(很小,運行環(huán)境要求不高運行在目標(biāo)機端的程序(很小,運行環(huán)境要求不高),),GDBGDB調(diào)試器是一個運行于主機端的程序。它們調(diào)試器是一個運行于主機端的程序。它們之間通過之間通過GDBGDB遠程協(xié)議通信,調(diào)試者在主機端的遠程協(xié)議通信,調(diào)試者在主機端的GDBGDB調(diào)試器中便可對目標(biāo)機上的程序進行調(diào)試。調(diào)試器中便可對目標(biāo)機上的程序進行調(diào)試。n遠程遠程GD
18、B調(diào)試原理調(diào)試原理6.3.2 6.3.2 遠程遠程GDBGDB調(diào)試流程調(diào)試流程l在宿主機上編輯、編譯在宿主機上編輯、編譯(-g)(-g)目標(biāo)機程序目標(biāo)機程序l將編譯后的目標(biāo)機程序下載到目標(biāo)機(將編譯后的目標(biāo)機程序下載到目標(biāo)機(NFSNFS或或TFTPTFTP)l在目標(biāo)機上啟動在目標(biāo)機上啟動gdbservergdbserver程序,由它控制被調(diào)試程程序,由它控制被調(diào)試程序的運行序的運行l(wèi)在宿主機上啟動在宿主機上啟動GDBGDB調(diào)試器,并使用調(diào)試器,并使用target remote target remote 命令連接到目標(biāo)機上的命令連接到目標(biāo)機上的gdbservergdbserver。l在宿主機
19、上設(shè)置斷點、運行程序,與本地調(diào)試基本在宿主機上設(shè)置斷點、運行程序,與本地調(diào)試基本一樣。一樣。宿主機與目標(biāo)機的連接宿主機與目標(biāo)機的連接應(yīng)該有兩條物理上獨立的連接:應(yīng)該有兩條物理上獨立的連接:l一條用于一條用于GDBGDB調(diào)試器和調(diào)試器和gdbservergdbserver之間的調(diào)試之間的調(diào)試會話(網(wǎng)絡(luò)連接);會話(網(wǎng)絡(luò)連接);l另一條用于宿主機和目標(biāo)機之間的虛擬終端另一條用于宿主機和目標(biāo)機之間的虛擬終端連接(串口連接)。連接(串口連接)。目標(biāo)機啟動目標(biāo)機啟動gdbservergdbserverlTarget$ gdbserver 如:gdbserver :12345 ./gdb_test aa
20、bb cc宿主機端啟動宿主機端啟動GDBGDB調(diào)試器調(diào)試器: :lHost$Host$ arm-linux-gdb 如:如: arm-linux-gdb ./gdb_test aa bb cc ./gdb_test aa bb cc然后將宿主機連接到目標(biāo)機:然后將宿主機連接到目標(biāo)機:u(gdb)(gdb)target reomte 如:如: ( (gdb)target reomte 01gdb)target reomte 01:1234512345連接成功后,必須創(chuàng)建斷點(連接成功后,必須創(chuàng)建斷點(重要重要)(通常第一)(通常第一個斷點設(shè)置在個斷點設(shè)
21、置在mainmain函數(shù)入口處),用函數(shù)入口處),用c(continue)(continue)運行程序運行程序( (不能用不能用run)run),直到設(shè)置的斷點處。,直到設(shè)置的斷點處。然后便可象本地調(diào)試一樣調(diào)試目標(biāo)機上的程序了然后便可象本地調(diào)試一樣調(diào)試目標(biāo)機上的程序了注意:注意:l在連接到運行在連接到運行g(shù)dbservergdbserver的遠程目標(biāo)機時,的遠程目標(biāo)機時,gdbservergdbserver已經(jīng)運行了目標(biāo)程序,只是將一個斷點已經(jīng)運行了目標(biāo)程序,只是將一個斷點設(shè)置在程序的前幾個指令處,使程序的執(zhí)行停了下設(shè)置在程序的前幾個指令處,使程序的執(zhí)行停了下來,等待連接。來,等待連接。l在連接之后使用在連接之后使用c c命令,將使程序恢復(fù)執(zhí)行,直到命令,將使
溫馨提示
- 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 房屋維修合同范本(6篇)
- 某學(xué)校外墻裝飾改造施工組織設(shè)計
- 石河子大學(xué)《網(wǎng)絡(luò)安全技術(shù)及應(yīng)用》2023-2024學(xué)年期末試卷
- 石河子大學(xué)《軟件體系結(jié)構(gòu)》2021-2022學(xué)年期末試卷
- 石河子大學(xué)《電工學(xué)實驗》2021-2022學(xué)年期末試卷
- 沈陽理工大學(xué)《現(xiàn)代控制理論》2023-2024學(xué)年期末試卷
- 沈陽理工大學(xué)《汽車制造工藝學(xué)》2022-2023學(xué)年第一學(xué)期期末試卷
- 沈陽理工大學(xué)《計算機網(wǎng)絡(luò)》2022-2023學(xué)年期末試卷
- 肝癌靶向聯(lián)合免疫治療
- 沈陽理工大學(xué)《功能高分子》2023-2024學(xué)年第一學(xué)期期末試卷
- 中小學(xué)-消防安全知識教育-課件
- 職業(yè)院?!敖鹫n”建設(shè)方案
- 新質(zhì)生產(chǎn)力-講解課件
- (完整版)遴選答題紙(A4紙直接打印)
- 大物實驗思考題
- 循證教學(xué)評價:數(shù)智化時代下高校教師教學(xué)評價的新取向
- 《各種管道的護理》PPT課件.ppt
- 世界500強企業(yè)簡要情況及在華機構(gòu)聯(lián)系方式
- EDQM分析方法驗證指導(dǎo)原則
- 商城開發(fā)合同
- 220千伏變電站現(xiàn)場運行通用規(guī)程
評論
0/150
提交評論