嵌入式Linux上的C語(yǔ)言編程實(shí)踐--第6章GDB調(diào)試工具_(dá)第1頁(yè)
嵌入式Linux上的C語(yǔ)言編程實(shí)踐--第6章GDB調(diào)試工具_(dá)第2頁(yè)
嵌入式Linux上的C語(yǔ)言編程實(shí)踐--第6章GDB調(diào)試工具_(dá)第3頁(yè)
嵌入式Linux上的C語(yǔ)言編程實(shí)踐--第6章GDB調(diào)試工具_(dá)第4頁(yè)
嵌入式Linux上的C語(yǔ)言編程實(shí)踐--第6章GDB調(diào)試工具_(dá)第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、1第第6 6章章 GDB GDB調(diào)試工具調(diào)試工具6.1 GDB簡(jiǎn)介GDBGDBGNU DebuggerGNU Debugger,是,是FSFFSF的一個(gè)強(qiáng)大的命令的一個(gè)強(qiáng)大的命令行調(diào)試工具。行調(diào)試工具。雖然,它沒(méi)有圖形化的友好界面,但是它雖然,它沒(méi)有圖形化的友好界面,但是它強(qiáng)大的功能也足以與微軟的強(qiáng)大的功能也足以與微軟的VCVC工具等媲美工具等媲美。主要提供主要提供4 4個(gè)方面的功能:個(gè)方面的功能:l指定啟動(dòng)程序的方式指定啟動(dòng)程序的方式l可以在被調(diào)試的程序中設(shè)置斷點(diǎn),斷點(diǎn)可以設(shè)置在程可以在被調(diào)試的程序中設(shè)置斷點(diǎn),斷點(diǎn)可以設(shè)置在程序源文件中的某一行、某函數(shù)的入口或滿足某各條件序源文件中的某一行、

2、某函數(shù)的入口或滿足某各條件時(shí)。時(shí)。l當(dāng)程序被停住時(shí),可以檢查此時(shí)程序中所發(fā)生的事件當(dāng)程序被停住時(shí),可以檢查此時(shí)程序中所發(fā)生的事件l可以動(dòng)態(tài)改變程序的執(zhí)行環(huán)境。可以動(dòng)態(tài)改變程序的執(zhí)行環(huán)境。 6.1 GDB簡(jiǎn)介GDBGDB是一個(gè)命令行工具,其常用啟動(dòng)格式如下:是一個(gè)命令行工具,其常用啟動(dòng)格式如下:lgdb executable-file 使用使用GDBGDB調(diào)試程序的注意事項(xiàng):調(diào)試程序的注意事項(xiàng):l在對(duì)源程序編譯時(shí)要加在對(duì)源程序編譯時(shí)要加-g-g選項(xiàng)選項(xiàng),以使編譯出來(lái)的程序,以使編譯出來(lái)的程序中包含需要的調(diào)試信息。中包含需要的調(diào)試信息。l在對(duì)源程序編譯時(shí)最好不要對(duì)程序進(jìn)行優(yōu)化編譯。在對(duì)源程序編譯時(shí)

3、最好不要對(duì)程序進(jìn)行優(yōu)化編譯。l由于編譯器在目標(biāo)文件和可執(zhí)行文件中加入了對(duì)源代由于編譯器在目標(biāo)文件和可執(zhí)行文件中加入了對(duì)源代碼的引用,所以,碼的引用,所以,為保證調(diào)試信息可用,源代碼必須為保證調(diào)試信息可用,源代碼必須存在,且路徑不能改變存在,且路徑不能改變6.1 GDB簡(jiǎn)介例如: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簡(jiǎn)介命令含義file載入程序。如file hello。當(dāng)然,程序的路徑名要正確。quit退出GDB。也可以輸入C-d來(lái)退出GDB。run執(zhí)行載入后的要調(diào)試的程序??梢暂斎?yún)?shù)。info查看程序的信息。多用來(lái)查看斷點(diǎn)信息??梢杂胔elp info來(lái)查看其幫助。info sourc查看當(dāng)前文件的名字,路徑,所使用的程序語(yǔ)言等信息。info stack 查看調(diào)用棧。info local 查看局部變量信息。info br br(break的縮寫)可以得到所設(shè)置的所有斷點(diǎn)的詳細(xì)信息。listlist FUNCTION列出被調(diào)試程序某個(gè)函數(shù)list LINENUM以當(dāng)前源文

6、件的某行為中間顯示一段源程序list 接著前一次繼續(xù)顯示list - 顯示前一次之前的源程序list FILENAME:FUNCTION顯示另一個(gè)文件的一段程序,GDBGDB中的常用命令如下:中的常用命令如下:6.1 GDB簡(jiǎn)介命令含 義break最常用和最重要:設(shè)置斷點(diǎn)。break FUNCTION在函數(shù)入口設(shè)置斷點(diǎn) break LINENUM在當(dāng)前源文件的某一行上設(shè)置斷點(diǎn) break FILENAME:LINENUM在另一個(gè)源文件的某一行上設(shè)置斷點(diǎn) break *ADDRESS在某個(gè)地址上設(shè)置斷點(diǎn)watch監(jiān)視某個(gè)表達(dá)式或變量,當(dāng)它被讀或被寫時(shí)讓程序停下。格式如下:watch EXPRES

7、SION set修改變量值。格式:set varible=valuestep單步執(zhí)行,進(jìn)入遇到的函數(shù)。next單步執(zhí)行,不進(jìn)入函數(shù)調(diào)用,即視函數(shù)調(diào)用為普通語(yǔ)句。continue恢復(fù)中斷的程序執(zhí)行,直到遇到下一個(gè)斷點(diǎn)。help獲取幫助,如獲得list指令:help list6.2 使用GDB調(diào)試程序6.2.1 6.2.1 基本操作基本操作l使用使用-g-g選項(xiàng)進(jìn)行編譯:選項(xiàng)進(jìn)行編譯:ugcc g Wall gcb_test.c o gdb_testl啟動(dòng)并載入生成的可執(zhí)行程序:?jiǎn)?dòng)并載入生成的可執(zhí)行程序:ugdb 如 gdb gdb_testl在在mainmain函數(shù)入口點(diǎn)設(shè)置斷點(diǎn):函數(shù)入口點(diǎn)設(shè)

8、置斷點(diǎn):ubreak 如 break main 或 b mainubreak 如 break 34l使用使用runrun命令運(yùn)行程序,將在斷點(diǎn)處停下。命令運(yùn)行程序,將在斷點(diǎn)處停下。urun 或 rurun 參數(shù)表相當(dāng)于命令行參數(shù)參數(shù)表相當(dāng)于命令行參數(shù)l使用使用next命令,可從斷點(diǎn)處執(zhí)行一行(不進(jìn)命令,可從斷點(diǎn)處執(zhí)行一行(不進(jìn)入函數(shù))入函數(shù))unext 或 n l使用使用step命令,可從斷點(diǎn)處執(zhí)行一行(進(jìn)入命令,可從斷點(diǎn)處執(zhí)行一行(進(jìn)入函數(shù))函數(shù))ustep 或 s l使用使用continuecontinue可恢復(fù)中斷了的程序繼續(xù)運(yùn)行可恢復(fù)中斷了的程序繼續(xù)運(yùn)行直到下一斷點(diǎn)或程序結(jié)束。直到下一

9、斷點(diǎn)或程序結(jié)束。ucontinue 或 cucontinue 繼續(xù)運(yùn)行,并忽略后面若干斷點(diǎn)6.2.2 6.2.2 查看命令查看命令llist命令查看源程序ulist -顯示批定行號(hào)周圍的源程序ulist -顯示指定函數(shù)代碼ulist接著前一list命令繼續(xù)顯示源程序lwhere命令查看當(dāng)前程序運(yùn)行位置uwherelprint命令查看程序中變量的值uprint / 下標(biāo)顯示指定變量或數(shù)組元素的值。uprint 下標(biāo)-顯示數(shù)組中從指定元素開(kāi)始的n個(gè)元素的值。lwhatiswhatis命令命令查看變量的類型查看變量的類型uwhatis whatis / lptypeptype命令命令查看變量的類型查

10、看變量的類型uptype ptype /,此命令與此命令與whatiswhatis命令命令基本相同,只是能更好的顯示結(jié)構(gòu)體變量或數(shù)組的類型?;鞠嗤皇悄芨玫娘@示結(jié)構(gòu)體變量或數(shù)組的類型。lclearclear命令命令清除斷點(diǎn)清除斷點(diǎn)uclear clear / 清除指定行或函數(shù)上的斷點(diǎn)清除指定行或函數(shù)上的斷點(diǎn)ldeletedelete命令命令清除斷點(diǎn)清除斷點(diǎn)udelete-delete-清除所有斷點(diǎn)清除所有斷點(diǎn)udelete delete -清除指定的斷點(diǎn)清除指定的斷點(diǎn)6.2.3 6.2.3 高級(jí)命令高級(jí)命令l設(shè)置條件斷點(diǎn):設(shè)置條件斷點(diǎn):uBreak Break if if 如:如:bre

11、ak 21 if ibreak 21 if i= =3 3,表示執(zhí)行到第,表示執(zhí)行到第2121行且行且i i的值為的值為3 3時(shí)停下。時(shí)停下。ucondition condition - -修改指定斷點(diǎn)修改指定斷點(diǎn)號(hào)處的停止條件為號(hào)處的停止條件為,無(wú),無(wú)則刪除條件則刪除條件l自動(dòng)化調(diào)試自動(dòng)化調(diào)試 可以使用可以使用GDBGDB提供的提供的commandcommand命令來(lái)設(shè)置在停命令來(lái)設(shè)置在停止點(diǎn)停止后運(yùn)行的命令。也就是說(shuō),當(dāng)運(yùn)行的程止點(diǎn)停止后運(yùn)行的命令。也就是說(shuō),當(dāng)運(yùn)行的程序在被停止住時(shí),我們可以讓序在被停止住時(shí),我們可以讓GDBGDB自動(dòng)運(yùn)行一些自動(dòng)運(yùn)行一些別的命令。別的命令。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自動(dòng)顯示自動(dòng)顯示displaydisplay 可以設(shè)置一些自動(dòng)顯示的變量,當(dāng)程序停住時(shí),可以設(shè)置一些自動(dòng)顯示的變量,當(dāng)程序停住時(shí),或是在你單步跟蹤時(shí),這些變量會(huì)自動(dòng)顯

13、示。該命令或是在你單步跟蹤時(shí),這些變量會(huì)自動(dòng)顯示。該命令主要用于在多個(gè)斷點(diǎn)處均需要顯示相同變量或表達(dá)式主要用于在多個(gè)斷點(diǎn)處均需要顯示相同變量或表達(dá)式的值時(shí)。相關(guān)的的值時(shí)。相關(guān)的GDBGDB命令是命令是displaydisplay。display display expr expr是一個(gè)變量或表達(dá)式,當(dāng)你用是一個(gè)變量或表達(dá)式,當(dāng)你用displaydisplay設(shè)定好設(shè)定好了一個(gè)或多個(gè)表達(dá)式后,只要你的程序被停下來(lái),了一個(gè)或多個(gè)表達(dá)式后,只要你的程序被停下來(lái),GDBGDB會(huì)自動(dòng)顯示你所設(shè)置的這些表達(dá)式的值。會(huì)自動(dòng)顯示你所設(shè)置的這些表達(dá)式的值。 undisplaydnumsundisplay 或或

14、delete displaydnums delete display 刪除自動(dòng)顯示,刪除自動(dòng)顯示,dnumsdnums意為所設(shè)置好了的自動(dòng)顯示意為所設(shè)置好了的自動(dòng)顯示的編號(hào)。如果要同時(shí)刪除幾個(gè),編號(hào)可以用空格分隔的編號(hào)。如果要同時(shí)刪除幾個(gè),編號(hào)可以用空格分隔,如果要?jiǎng)h除一個(gè)范圍內(nèi)的編號(hào),可以用減號(hào)表示(,如果要?jiǎng)h除一個(gè)范圍內(nèi)的編號(hào),可以用減號(hào)表示(如:如:2-52-5)。如果不帶)。如果不帶dnumsdnums,則刪除所有自動(dòng)顯示。,則刪除所有自動(dòng)顯示。lfinish finish 運(yùn)行程序,直到當(dāng)前函數(shù)完成返回。并打印函運(yùn)行程序,直到當(dāng)前函數(shù)完成返回。并打印函數(shù)返回時(shí)的堆棧地址和返回值及參數(shù)

15、值信息數(shù)返回時(shí)的堆棧地址和返回值及參數(shù)值信息luntil until 或或 u u 當(dāng)你厭倦了在一個(gè)循環(huán)體內(nèi)單步跟蹤時(shí),這個(gè)當(dāng)你厭倦了在一個(gè)循環(huán)體內(nèi)單步跟蹤時(shí),這個(gè)命令可以運(yùn)行程序直到退出循環(huán)體。命令可以運(yùn)行程序直到退出循環(huán)體。 6.3 遠(yuǎn)程GDB調(diào)試遠(yuǎn)程調(diào)試用于調(diào)試器和被調(diào)試的程序運(yùn)行遠(yuǎn)程調(diào)試用于調(diào)試器和被調(diào)試的程序運(yùn)行在不同的主機(jī)上時(shí)。在不同的主機(jī)上時(shí)。遠(yuǎn)程調(diào)試是一種更適合嵌入式系統(tǒng)的遠(yuǎn)程調(diào)試是一種更適合嵌入式系統(tǒng)的GDBGDB調(diào)試調(diào)試手段手段遠(yuǎn)程調(diào)試使用遠(yuǎn)程調(diào)試使用目標(biāo)機(jī)端的目標(biāo)機(jī)端的GDBGDB服務(wù)器服務(wù)器和和主機(jī)端主機(jī)端的的GDBGDB調(diào)試器調(diào)試器進(jìn)行調(diào)試。進(jìn)行調(diào)試。6.3.1 6.

16、3.1 本地本地GDBGDB調(diào)試和遠(yuǎn)程調(diào)試和遠(yuǎn)程GDBGDB調(diào)試的比較調(diào)試的比較圖圖61 X86和目標(biāo)機(jī)的本地和目標(biāo)機(jī)的本地GDB調(diào)試調(diào)試X86本地調(diào)試本地調(diào)試目標(biāo)機(jī)本地調(diào)試目標(biāo)機(jī)本地調(diào)試本地調(diào)試不適合嵌入式系統(tǒng):本地調(diào)試不適合嵌入式系統(tǒng):l嵌入式目標(biāo)機(jī)不一定具有嵌入式目標(biāo)機(jī)不一定具有GDBGDB程序運(yùn)行的條件:目程序運(yùn)行的條件:目標(biāo)機(jī)可能不存在標(biāo)機(jī)可能不存在GDBGDB運(yùn)行所需要的一些庫(kù)。運(yùn)行所需要的一些庫(kù)。lGDBGDB運(yùn)行開(kāi)銷大,會(huì)受到嵌入式系統(tǒng)中運(yùn)行開(kāi)銷大,會(huì)受到嵌入式系統(tǒng)中CPUCPU主頻和內(nèi)主頻和內(nèi)存的限制。存的限制。遠(yuǎn)程調(diào)試更加適合于嵌入式系統(tǒng):遠(yuǎn)程調(diào)試更加適合于嵌入式系統(tǒng):l遠(yuǎn)

17、程遠(yuǎn)程GDBGDB調(diào)試由調(diào)試由gdbserver(GDBgdbserver(GDB服務(wù)器,稱為調(diào)試樁服務(wù)器,稱為調(diào)試樁或調(diào)試代理或調(diào)試代理) )和和GDBGDB調(diào)試器組成調(diào)試器組成,gdbservergdbserver是一個(gè)是一個(gè)運(yùn)行在目標(biāo)機(jī)端的程序(很小,運(yùn)行環(huán)境要求不高運(yùn)行在目標(biāo)機(jī)端的程序(很小,運(yùn)行環(huán)境要求不高),),GDBGDB調(diào)試器是一個(gè)運(yùn)行于主機(jī)端的程序。它們調(diào)試器是一個(gè)運(yùn)行于主機(jī)端的程序。它們之間通過(guò)之間通過(guò)GDBGDB遠(yuǎn)程協(xié)議通信,調(diào)試者在主機(jī)端的遠(yuǎn)程協(xié)議通信,調(diào)試者在主機(jī)端的GDBGDB調(diào)試器中便可對(duì)目標(biāo)機(jī)上的程序進(jìn)行調(diào)試。調(diào)試器中便可對(duì)目標(biāo)機(jī)上的程序進(jìn)行調(diào)試。n遠(yuǎn)程遠(yuǎn)程GD

18、B調(diào)試原理調(diào)試原理6.3.2 6.3.2 遠(yuǎn)程遠(yuǎn)程GDBGDB調(diào)試流程調(diào)試流程l在宿主機(jī)上編輯、編譯在宿主機(jī)上編輯、編譯(-g)(-g)目標(biāo)機(jī)程序目標(biāo)機(jī)程序l將編譯后的目標(biāo)機(jī)程序下載到目標(biāo)機(jī)(將編譯后的目標(biāo)機(jī)程序下載到目標(biāo)機(jī)(NFSNFS或或TFTPTFTP)l在目標(biāo)機(jī)上啟動(dòng)在目標(biāo)機(jī)上啟動(dòng)gdbservergdbserver程序,由它控制被調(diào)試程程序,由它控制被調(diào)試程序的運(yùn)行序的運(yùn)行l(wèi)在宿主機(jī)上啟動(dòng)在宿主機(jī)上啟動(dòng)GDBGDB調(diào)試器,并使用調(diào)試器,并使用target remote target remote 命令連接到目標(biāo)機(jī)上的命令連接到目標(biāo)機(jī)上的gdbservergdbserver。l在宿主機(jī)

19、上設(shè)置斷點(diǎn)、運(yùn)行程序,與本地調(diào)試基本在宿主機(jī)上設(shè)置斷點(diǎn)、運(yùn)行程序,與本地調(diào)試基本一樣。一樣。宿主機(jī)與目標(biāo)機(jī)的連接宿主機(jī)與目標(biāo)機(jī)的連接應(yīng)該有兩條物理上獨(dú)立的連接:應(yīng)該有兩條物理上獨(dú)立的連接:l一條用于一條用于GDBGDB調(diào)試器和調(diào)試器和gdbservergdbserver之間的調(diào)試之間的調(diào)試會(huì)話(網(wǎng)絡(luò)連接);會(huì)話(網(wǎng)絡(luò)連接);l另一條用于宿主機(jī)和目標(biāo)機(jī)之間的虛擬終端另一條用于宿主機(jī)和目標(biāo)機(jī)之間的虛擬終端連接(串口連接)。連接(串口連接)。目標(biāo)機(jī)啟動(dòng)目標(biāo)機(jī)啟動(dòng)gdbservergdbserverlTarget$ gdbserver 如:gdbserver :12345 ./gdb_test aa

20、bb cc宿主機(jī)端啟動(dòng)宿主機(jī)端啟動(dòng)GDBGDB調(diào)試器調(diào)試器: :lHost$Host$ arm-linux-gdb 如:如: arm-linux-gdb ./gdb_test aa bb cc ./gdb_test aa bb cc然后將宿主機(jī)連接到目標(biāo)機(jī):然后將宿主機(jī)連接到目標(biāo)機(jī):u(gdb)(gdb)target reomte 如:如: ( (gdb)target reomte 01gdb)target reomte 01:1234512345連接成功后,必須創(chuàng)建斷點(diǎn)(連接成功后,必須創(chuàng)建斷點(diǎn)(重要重要)(通常第一)(通常第一個(gè)斷點(diǎn)設(shè)置在個(gè)斷點(diǎn)設(shè)

21、置在mainmain函數(shù)入口處),用函數(shù)入口處),用c(continue)(continue)運(yùn)行程序運(yùn)行程序( (不能用不能用run)run),直到設(shè)置的斷點(diǎn)處。,直到設(shè)置的斷點(diǎn)處。然后便可象本地調(diào)試一樣調(diào)試目標(biāo)機(jī)上的程序了然后便可象本地調(diào)試一樣調(diào)試目標(biāo)機(jī)上的程序了注意:注意:l在連接到運(yùn)行在連接到運(yùn)行g(shù)dbservergdbserver的遠(yuǎn)程目標(biāo)機(jī)時(shí),的遠(yuǎn)程目標(biāo)機(jī)時(shí),gdbservergdbserver已經(jīng)運(yùn)行了目標(biāo)程序,只是將一個(gè)斷點(diǎn)已經(jīng)運(yùn)行了目標(biāo)程序,只是將一個(gè)斷點(diǎn)設(shè)置在程序的前幾個(gè)指令處,使程序的執(zhí)行停了下設(shè)置在程序的前幾個(gè)指令處,使程序的執(zhí)行停了下來(lái),等待連接。來(lái),等待連接。l在連接之后使用在連接之后使用c c命令,將使程序恢復(fù)執(zhí)行,直到命令,將使

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 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ì)用戶上傳內(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)論