linux下GDB教程_第1頁
linux下GDB教程_第2頁
linux下GDB教程_第3頁
linux下GDB教程_第4頁
linux下GDB教程_第5頁
已閱讀5頁,還剩20頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、GDB 教程GDB 是一個強大的命令行調試工具。大家知道命令行的強大就是在于,其可以形成執行 序列,形成腳本。 UNIX 下的軟件全是命令行的,這給程序開發提供了極大的便利,命令行 軟件的優勢在于, 他們可以非常容易的集成在一起, 使用幾個簡單的已有工具的命令, 就可 以做出一個非常強大的功能。于是 UNIX 下的軟件比 windows 下的軟件更能有機的結合,各自發揮各自的長處,組合 成更為強筋的功能。而 windows 下的圖形軟件基本上各自為營,互相不能條用,很不利于 各種軟件的相互集成。在這里并不是要和 windows 做個什么比較,所謂“寸有所長,尺有 所短”,圖形化工具還是有不如命

2、令行的地方。用 GDB 調試程序GDB 概述GDB 是 GNU 開源組織發布的一個強大的 UNIX 下調試程序工具。 或許各位比較喜歡那種 圖形界面方式的,像 VC ,BCB 等 IDE 的調試,但如果你是在 UNIX 平臺下作軟件,你會 發現 GDB 這個調試工具有比 VC ,BCB 的圖形化調試器更強大的功能。所謂“寸有所長, 尺有所短”就是這個道理。一般來說, GDB 主要幫助你完成下面四個方面的功能:1、啟動你的程序,可以按照你自定義的要求隨心所欲的運行程序。2、可以讓調試程序在你所指定的位置的斷點處停止。3、當程序停止時,可以檢查此時你的程序中所發生的事情。4、動態的改變你程序的執行

3、環境。從上面看來, GDB 和一般的調試工具沒有什么兩樣,基本上也是完成這些功能,不過在 細節上, 你會發現 GDB 這個調試工具的強大, 大家可能習慣圖形化的調試工具, 但有時候 , 命令行的調試工具卻有著圖形化工具所不能完成的功能。讓我們來看一個例子:源程序: test.c1 #include 23 int func(int n)45int sum=0,i;6for(i=0; in; i+)78 sum+=i;910 return sum;11 12131914 main()15 16 int i;17 long result= 0;18 for(i=1;i=100; i+)19 20 r

4、esult += i;21 2223 printf(result1-100 = %d n, result );24 printf(result1-250 = %d n, func(250) );25 編譯生成執行文件:gcc -gest.c -otest使用 GDB 調試:gdb test 啟動 GDBGNU gdb 5.1.1Copyright 2002 Free Software Foundation, Inc.GDB is free software, covered by the GNU General Public License, and you are welcome to ch

5、ange 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-suse-linux.(gdb) list 從第一行列出源碼1 #include 23int func(int n)45 int sum=0,i;6 for(i=0; in; i+)7

6、8sum+=i;910 return sum;(gdb) 直接回車表示,重復上一次命令11 121314 main()15 16 int i;17 long result = 0;18 for(i=1; i=100;i+)20 result += i;(gdb) break 16 設置斷點,在源程序第 16 行處。Breakpoint 1 at 0x8048496: file tst.c, line 16.(gdb) break func 設置斷點,在函數 func() 入口處。Breakpoint 2 at 0x8048456: file tst.c, line 5.(gdb) info b

7、reak 查看斷點信息。Num Type1 breakpoint2 breakpoint (gdb) runDisp Enb Address Whatkeep y 0x08048496 in main at tst.c:16 keep y 0x08048456 in func at tst.c:5 運行程序Starting program: /home/hchen/test/tstBreakpoint 1, main () at tst.c:17 在斷點處停住。 17long result = 0;(gdb) next 單條語句執行。18for(i=1; i=100; i+)(gdb) n20

8、 result += i;(gdb) n18 for(i=1; i=100; i+)(gdb) n20 result += i;(gdb) continue 繼續運行程序Continuing.result1-100 = 5050 程序輸出。Breakpoint 2, func (n=250) at tst.c:55int sum=0,i;(gdb) n6for(i=1; i=n; i+)(gdb) print i 打印變量 i 的值。 $1 = 134513808(gdb) n8 sum+=i;(gdb) n6 for(i=1; i=n; i+)(gdb) p sum$2 = 1(gdb) n

9、8 sum+=i;(gdb) p i$3 = 2(gdb) n6 for(i=1; i=n; i+)(gdb) p sum p 是 print 的縮寫#0 func (n=250)#1 0x080484e4at tst.c:5in main () at tst.c:24#2 0x400409edin _libc_start_main () from /lib/libc.so.6(gdb) finish推出函數查看函數堆棧$4 = 3 (gdb) btRun till exit from #0 func (n=250) at tst.c:5 0x080484e4 in main () at ts

10、t.c:2424 printf(result1-250 = %d n, func(250) ); Value returned is $6 = 31375(gdb) continueContinuing.result1-250 = 31375 程序輸出。Program exited with code 027. 程序退出,調試結束。 (gdb) quit 退出 gdb好了,有了以上的感性認識,還是讓我們來系統的認識一下 gdb 吧。使用 GDB一般來說GDB主要調試的是 C/C+程序。要調試 C/C+程序,首先在編譯時,我們必須 要把調試信息加到可執行文件中。使用編譯器( cc/gcc/g+

11、)的 -g 參數可以做到這一點,如:$ cc -gello.c -ohello$ g+ -g hello.cpp - ohello如果沒有-g,你將看不見程序的函數名,變量名,所代替的全是運行的內存地址。當你用-g 把調試信息假如之后,并成功編譯目標代碼以后,讓我們來看看如果用GDB 調試它。啟動 GDB 的方法有以下幾種:1、gdb program 也就是你的執行文件,一般在當前目錄下。2、gdb core用 gdb 同時調試一個運行程序和 core 文件, core 是程序非法執行后 core dump 后產生 的文件。3、gdb 如果你的程序是一個服務程序,那么你可以指定這個服務程序運行

12、時的進程ID。 gdb會自動 attach 上去,并調試它。 program 應該在 PATH 環境變量中搜索到。GDB啟動時,可以加上一些GDB的啟動開關,詳細的開關可以用gdb - help來查看。下面只列舉一些比較常用的參數:-symbols -s 從指定文件中讀取符號表。-se file從指定文件中讀取符號表信息,并把他用在可執行文件中。-core -c 調試 core dump 的 core 文件。-directory -d 加入一個源文件的搜索路徑。默認搜索路徑是環境變量中 PATH 所定義的路徑。GDB 的命令概貌啟動 gdb 后,就進入了 gdb 的調試環境,就可以使用 gdb

13、 的命令開始調試程序了, gdb 的 命令可以使用 help 命令來查看,如下所示:(gdb) helpList of classesof commands: aliases - Aliases of other commands breakpoints - Making program stop at certain points data - Examining data files - Specifying and examining files internals - Maintenance commands obscure - Obscure features running - R

14、unning the program stack - Examining the stack status- Status inquiries support - Support facilities tracepoints - Tracing of program execution without stopping the program user-defined - User-defined commandsType help followed by a classname for alist of commands in that class.Type help followed by

15、 command name for full documentation. Command name abbreviations are allowed if unambiguous. (gdb)gdb 的命令很多, gdb 把之分成很多種類。 help 命令只是列出了 gdb 的命令種類,如果要 看種類中的命令,使用help 命令,如:help breakpoints,查看設置斷點的所有命令。也可以直接 help 來查看命令的幫助。Gdb 中,輸入命令時,可以不用打全命令,只用打命令的前幾個字符就可以了,當然,命 令的前幾個字符要標志著一個唯一的命令, 在 linux 下,可以敲擊兩次 TA

16、B 鍵來補齊命令的 全稱,如果有重復的, gdb 會把其列出來。示例一:在進入函數 func時,設置一個斷點??梢郧脫鬮reakfunc,或者直接就是 b func(gdb) b funcBreakpoint 1 at 0x8048458: file hello.c, line 10.示例二:敲入 b 按兩次 TAB 鍵,你會看到所有 b 開頭的命令:(gdb) bbacktrace break bt示例三:只記得函數的前綴,可以這樣:(gdb) b make_make_a_section_from_filemake_environmake_abs_sectionmake_function_t

17、ypemake_blockvector make_cleanup make_commandmake_pointer_typemake_reference_typemake_symbol_completion_list(gdb) b make_GDB 把所有 make 開頭的函數全部列出來給你查看。示例四:調試 C+ 程序,可以函數名一樣。如:(gdb) b bubble(按兩次 TAB 鍵 bubble(double,double) bubble(int,int) (gdb) b bubble你可以查看到 C+ 中所有的重載函數以及參數要退出 GDB ,只要 quit 或命令簡稱 q 就行了。

18、GDB 中運行 UNIX 的 Shell 程序在 gdb 環境中,你可以執行 UNIX 的 shell 命令,使用 gdb 的 shell 命令來完成: shell 調用 UNIX 的 shell 來執行 ,環境變量 SHELL 中定義的 UNIX 的 shell 將會被用來執行 ,如果 SHELL 沒有定義,那就使用 UNIX 的標準 shell: /bin/sh還有一個 gdb 命令是 make:make 可以在 gdb 中執行 make 命令來重新 build 自己的程序。 這個命令等價于 “make make ”在 GDB 中運行程序當以gdb方式啟動gdb后,gdb會在PATH路徑和

19、當前目錄中所搜 的 源文件。 如要確認 gdb 是否讀到源文件, 可使用 l 或者 list 命令, 看 gdb 是否能列出源代碼。在gdb中,運行程序使用r或者run命令,程序的運行,有可能需要設置下面四方面的事:1、程序的運行參數。setargs 可指定運行時參數。 (如: setargs10 2030 40 50)show args 命令可以查看設置好的運行參數。2、運行環境path 可設定程序的運行路徑。show paths 查看程序的運行路徑。 setenvironment varname=value 設置環境變量。如: setenv USER=hchen show environm

20、entvarname 查看環境變量3、工作目錄 cd 相當于 shell 的 cd 命令。 pwd 顯示當前的工作目錄。4、程序的輸入輸出 info terminal 顯示程序用到的終端的模式 使用重定向空值程序輸出。如 runoutfile tty 命令可以指定寫輸入輸出的終端設備。如 tty /dev/ttyb調試已運行的程序兩種方法:1、在 UNIX 下用 ps 查看正在運行的程序的 PID (進程 ID ),然后用 gdb PID 格式掛接正在運行的程序。2、先用gdb關聯上源代碼,并進行 gdb,在gdb中用attach命令來掛接進程的 PID,并用detach來取消掛接的程序。暫停

21、/恢復程序運行 調試程序中,暫停進程運行時必須的, GDB 可以方便的暫停程序的運行。你可以設置程 序在哪停住,在什么條件下停住,在收到什么信號時停住等等。你便于你查看運行的變量, 以及運行時的流程。當進程被 gdb 停住時,你可以使用 info program 來查看程序是否在運行、進程號、被暫停 的原因。在gdb中,我們可以有以下幾種暫停方式:斷點(breakpoint)、觀察點(watchpoint )、捕捉點(catchpoint )、信號(signals)、線程停止(thread stops)o如果要恢復程序運行,可以 使用 c 或者 continue 命令。一、設置斷點( brea

22、kpoint )我們用 break 命令設置斷點。下面有幾點設置斷點的方法:break在進入指定函數時停住。 C+ 中可以使用 class:function 或 function(type,type) 格式來指 定函數名。break 在指定行號停住。break +offsetbreak - offset 在當前行號的前面或者后面的 offset 行停住。 Offset 為自然數。break filename:linenum 在源文件 filename 的 linenum 行處停住。break filename:function 在源文件 filename 的 function 函數的入口處停住

23、。break *addressbreakbreak 命令沒有參數時,表示在下一條指令處停住。break if可以是上述的參數,condition表示條件,在條件成立時停住。比如在循環體 中,可以設置 break if i=100 ,表示當 i 為 100 時停住程序。查看斷點時,可使用命令 info 命令,如下所示: (注: n 表示斷點號) info breakpointsninfo breakn二、設置捕捉點( catchpoint )我們可以設置捕捉點來捕捉程序運行時的一些事件。如:載入共享庫(動態鏈接庫)或是C+的一場,設置捕捉點的格式為:catch 當 event 發生時,停住程序。

24、 Event 可以是下面的內容:1、throw 一個C+拋出的異常(throw為關鍵字),2、catch 一個C+捕捉到的異常(catch為關鍵字),3、 exec調用系統調用exec時(exec為關鍵字,目前此功能只在 HP-UX下有用)4、fork調用系統調用fork時。(fork為關鍵字,目前此功能只在 HP-UX下有用)5、 vfork調用系統調用vfork時。(vfork為關鍵字,目前此功能只在HP-UX下 有用)6、load 或 load 載入共享庫(動態鏈接庫)時。 ( load 為關鍵字, 目前此功能只在 HP-UX 下有用)7、unload 或 unload 卸載共享庫(動態

25、鏈接庫)時。 ( unload 為關 鍵字,目前此功能只在 HP-UX 下有用)tcatch 只設置一次捕捉,當程序停住后,斷點被自動刪除。三、維護停止點上面說了如何設置程序的停止點, GDB 中的停止點也就是上述的三類。 在 GDB 中,如 果你覺得已定義好的停止點沒有用了,你可以使用delete、clear、disable、enable這幾個命令來進程維護。clear清楚所有已定義的停止點。clearclear 清楚所有設置在函數上的停止點。clearclear 清楚所有設定在指定行上的停止。delete breakpo in tsra nge 刪除指定的斷點, breakpoints 為

26、斷點號。 如果不指定斷點號, 則表示刪除所有的 斷點。 range 表示斷點號的范圍(如 2-7),其簡寫命令為 d。比刪除更好的一種方法是 disable 停止點, disable 了的停止點, GDB 不會刪除, 當你還需要時,en able即可,就好像回收站一樣。enablebreakpointsrangeenable 所指定的停止點, breakpoints 為停止號。enablebreakpoints once rangeenable所指定的停止點一次,當程序停止后,該停止點馬上被 GDB自動disable。enablebreakpoints delete rangeenable所指

27、定的停止點一次,當程序停止后,該停止點馬上被GDB自動刪除。四、停止條件維護 前面在說到設置斷點時,我們提到過可設置一個條件,當條件成立時,程序自動停止,這是一個非常強大的功能,這里,專門說說這個條件相關維護命令。一般來說,為斷點設 置一個條件,我們使用 if 關鍵字,后面跟其斷點條件。并且條件設置好后,我們可以用 condition 命令來修改斷點的條件 (只有 break 和 watch 命令支持 if, catch 目前暫不支持 if) condition修改斷點號為 bnum 的停止條件為 expressioncondition清除斷點號為 bnum 的停止條件。還有一個比較特殊的維護

28、命令ignore,可以指定程序運行時,忽略停止條件幾次。ignore表示忽略斷點號為 bnum 的停止條件 count 次。五、為停止點設定運行命令我們可以使用 GDB 提供的 command 命令來設置停止點的運行命令。 也就是說, 當運行 的程序在被停止住時, 我們可以讓你自動運行一些別的命令, 這很有利于自動化調試。 對 給予 GDB 的自動化調試是一個很強大的支持。commandbnumcomma nd - list end為斷點號 bnum 指定一個命令列表。當程序被該斷點停住時, gdb 會依次運行命 令列表中的命令。例如:break foo if x0 commands prin

29、tf “xis %dn”,xcontinueend斷點設置在函數 foo 中,斷點條件是 x0 ,如果程序符合條件被停住后,也就是,一旦x 的值在 foo 函數中大于 0, GDB 會自動打印出 x 的值,并繼續運行程序。 如果要清楚斷點上的命令序列, 那么只要簡單的執行以下 commands 命令, 并直接再打 個 end 就行了。六、斷點菜單在 C+ 中,可能會出現同一個名字的函數若干次(函數重載) ,在這種情況下, break 不 能 告 訴 GDB 要 停 在 哪 個 函 數 的 入 口 。 當 然 , 你 也 可 以 使 用 break 也就是把函數的參數類型告訴 GDB ,以指定一

30、個函數。否則的話, GDB 會給你列出一個斷點菜單供你選擇你所需要的斷點。你只要輸入菜單列表中的編號 就可以了。如:(gdb) b String:after0 cancel1 all2 file:String.cc;3 file:String.cc;4 file:String.cc;5 file:String.cc;6 file:String.cc;7 file:String.cc;246line number:867 line number:860 line number:875 line number:853 line number:846 line number:735Breakpoin

31、t 1 at 0xb26c: file String.cc, line 867.Breakpoint 2 at 0xb344: file String.cc, line 875.Breakpoint 3 at 0xafcc: file String.cc, line 846.Multiple breakpoints were set.Use the delete command to delete unwanted breakpoints.(gdb)可見, GDB 列出了所有 after 的重載函數,你可以選以下列表編號就行了。0 表示放棄設置斷點, 1 表示所有函數都設置斷點。七、恢復程序運

32、行和單步調試當程序被停住后, 你可以用 continue 命令恢復程序的運行直到程序結束, 或下一個斷點 的到來。也可以使用step或next命令單步跟蹤程序。continue ignore-countc ignore-countfg ignore-count恢復程序運行,直到程序結束,或是下一個斷點到來。 Ignore-count 表示忽略其后的斷 點次數。 continue ,c,fg 三個命令都是一樣的意思。step單步跟蹤,如果有函數調用,他會進入該函數。進入函數的前提是,次函數被編譯有 debug 信息。像 VC 等工具中的 step in 。后面可以加 count ,也可以 不加,

33、不加表示一條一條地執行, 加表示執行后面的 count 條指令, 然后再停住 。next同樣單步跟蹤,如果有函數調用,他不會進入函數。想 VC 等工具中的 step over 。后面可以加 count ,也可以不加。不加表示一條條的執行,加表示執行后 面的 count 指令,然后再停住。set step-modeset step-mode on打開 step-mode 模式,于是,在進行單步跟蹤時,程序不會因為沒有 debug 信息而不停住。這個參數很有利于查看機器碼。set step-mode off 運行程序,直到當前函數完成返回。并打印函數返回時的堆棧地址和返回值 及參數值信息。fini

34、sh 運行程序,直到當前函數完成返回。并打印函數返回時的堆棧地址和返回值 及參數值信心。until 或 u 當你厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序知道退出循 環體。stepi 或 sinexti 或 ni單步跟蹤一條機器指令!一條程序代碼有可能由數條機器指令完成, stepi 和 nexti 可以單步執行機器指令。與之一樣有相同功能的命令式“ display/I $pc ”, 當運行完這個命令后,單步跟蹤會在打出代碼的同時打出機器指令(也就是匯 編代碼)八、信號( signals )信號是一種軟中斷, 是一種處理異步事件的方法。 一般來說, 操作系統都支持許多信號 。 尤其是

35、 UNIX ,比較重要的應用程序一般都會處理信號。 UNIX 定義了很多信號,比如 SIGINT 表示中斷字符信號,也就是 ctrl+C 的信號, SIGBUS 表示硬件故障的信號, SIGCHLD 表示子進程狀態改變信號, SIGKILL 表示終止程序運行的信號等等。信號量編 程時 UNIX 下非常重要的一種技術。GDB 有能力在你調試程序的時候處理任何一種信號, 我們可以告訴 GDB 需要處理哪一 種信號。我們可以要求 GDB 收到你所指定的信號時,馬上停住正在運行的程序,以供你 進行調試。你可以用 GDB 的 handle 命令來完成這一功能。han dlesig nalxkeyword

36、s在GDB中定義一個信號處理。信號 可以以SIG開頭或不以SIG開頭, 可以用定義一個要處理信號范圍(如: SIGIO-SIGKILL ,表示處理從 ISGIO 信號 到 SIGKILL 的信號,其中包括 SIGIO, SIGIOT , SIGKILL 三個信號),也可以使用關鍵字 all 來表明要處理的所有信號。一旦被調試的程序接收到信號,運行程序 馬上會被 GDB 停住,以供調試。其 可以是以下幾種關鍵字的一個或多 個。nostopGDB 不會停住程序的運行,但會打出消息告訴當被調試的程序收到信號時, 你收到這種信號。stop當被調試的程序收到信號時,GDB 會停住你的程序。print當被

37、調試的程序收到信號時,GDB 會顯示出一條信息。noprint當被調試的程序收到信號時,GDB 不會告訴你收到信號的信息。passnoignoreGDB 不處理信號。這表示, GDB 會把這個信號交GDB 不會讓被調試程序來處理這個信號當被調試程序收到信號時, 給調試程序處理。nopass ignore當被調試的程序收到信號時,info signalsinfo handle 查看有哪些信號在被 GDB 檢測中。九、線程( thread stops) 如果你的程序時多線程的話, 你可以定義你的斷點是否在所有的線程上, 或是在某個特 定的線程。 GDB 很容易幫你完成這一工作。breakthrea

38、dbreakthreadiflinespec 指定了斷點是這在源程序的行號。 Threadno 指定了線程 ID ,注意,這個 ID是GDB分配的,你可以通過“ info threads”命令來查看正在運行程序中的線程 信息。如果你不指定 thread則表示你的斷點設在所有的線程上面。還可 以為某個線程指定斷點條件,如:(gdb) breadk frik.c:13 thread 28 if bartablim當程序被 GDB 停住時,所有的運行線程都會被停住。這方便你查看運行程序的 總體情況。而在你恢復程序運行時,所有的線程也會被恢復運行。哪怕是主進程 在被單步調試時。查看棧信息當程序被停住了

39、, 你需要做的第一件事就是查看程序是在哪里停住了。 當你的程序調用了一個函數,函數的地址,函數的參數,函數內的局部變量都會被壓入“棧(stack) ”中。你可以使用 GDB 命令來查看當前的棧中的信息。下面是一些查看函數調用棧信息的 GDB 命令:backtracebt打印當前的函數調用棧的所有信息。如:(gdb) bt#0 func (n=250) at tst.c:6#1 0x08048524 in main (argc=1, argv=0xbffff674) at tst.c:30#2 0x400409ed in _libc_start_main () from /lib/libc.so

40、.6 從上可以看出函數的調用棧信息:_libc_start_main - main() - func()backtracebtn 是一個正整數,表示只打印棧頂上 n 層的棧信息。backtracebt-n 是一個負整數,表示只打印棧底下 n 層的棧信息。如果你要查看某一層的信息,你需要切換當前的棧,一般來說,程序停止時,最頂層的棧就是當前的棧,如果你要查看棧下面層的詳細信息,首先要做的是切換當前棧。framefn 是一個從 0 開始的整數,是棧中的層編號。比如: frame 0,表示棧頂, frame ,表示棧的第二層。up表示向棧的上面移動 n層,可以不打n,表示向上移動一層。down表示向

41、棧的下面移動 n層,可以不打n,表示向下移動一層。上面的命令, 都會打印出移動到的棧層的信息。 如果你不想讓其打印出信息。 你可以使用 這三個命令。select-frame 對應于 frame 命令。up-silently 對應于 up 命令。down-silently 對應于 down 命令。查看當前棧層的信息,你可以用以下 GDB 命令: frame 或 f會打印出這些信息: 棧的層編號, 當前的函數名, 函數參數值, 函數所在的文件及行號 函數執行到的語句。info frameinfo f這個命令會打印出更為詳細的當前棧層的信息, 只不過,大多數都是運行時的內存地址 。 比如函數的地址,

42、 調用函數的地址, 被調用函數的地址, 目前的函數是由什么樣的程序語 言寫成的、函數參數地址及值,局部變量的地址等等。如:(gdb) info fStack level 0, frame at 0xbffff5d4:eip = 0x804845d in func (tst.c:6); saved eip 0x8048524called by frame at 0xbffff60csource language c.Arglist at 0xbffff5d4, args: n=250Locals at 0xbffff5d4, Previous frames sp is 0x0Saved regi

43、sters:ebp at 0xbffff5d4, eip at 0xbffff5d8info args 打印出當前函數的參數名及其值。info locals 打印出當前函數中所有局部變量及其值。info catch 打印出當前函數中的異常處理信息。查看源代碼一、顯示源代碼GDB 可以打印出所調試程序的源代碼,當然,在程序編譯時一定要加上-g 參數,把源程序信息編譯到執行文件中。不然就看不到源程序了。當程序停下來以后,GDB 會報告程序停在了那個文件的第幾行上,你可以用 list 命令來打印程序的源代碼。還是來看一看查看源 代碼的 GDB 命令吧。list顯示程序第 linenum 行周圍的源程

44、序。list顯示函數名為 function 的函數的源程序。list 顯示當前行后面的源程序。list - 顯示當前行前面的源程序。一般是打印當前行的上 5 行和下 5 行,如果顯示函數則是上 2 行和下 8 行,默認是 10 行 , 當然,也可以定制顯示的范圍,使用下面的命令可以設置一次顯示源程序的行數。set listsize 設置一次顯示源代碼的行數。show listsize查看當前 listsize 的設置。list 命令還有下面的用法: list,顯示從 first 行道 last 行之間的源代碼。list.顯示從當前行道 last 行之間的源代碼。list +往后顯示源代碼。一般

45、來說在 list 后面可以跟以下這些的參數: 行號。 當前行號的正偏移量。 當前行號的負偏移量。 那個文件的那一行。 函數名 那個文件中的那個函數。 程序運行時的語句在內存中的地址。、 搜索源代碼不僅如此, GDB 還提供了源代碼搜索的命令:forward-searchsearch向前面搜索。reverse-search全部搜索。其中 就是正則表達式,也可以是一個字符串的匹配模式,關于正則表達式,我 就不在這里說了,還請各位查看相關資料。三、 指定源文件的路徑某些時候,用 -g 編譯過后的執行程序中只是包括了源文件的名字,沒有路徑。 GDB 提供 了可以讓你指定源文件的路徑的命令,以便 GDB

46、 進行搜索。directorydir namedirdir name 加一個源文件路徑到當前路徑的前面。 如果你要指定多個路徑, UNIX 下你可以使用 “:”windows 下你可以使用“;”directory清除所有的自定義的源文件搜索路徑信息。show directories顯示定義了的源文件搜索路徑。四、 源代碼的內存可以使用 info line 命令來查看源代碼在內存中的地址。 Info line 后面可以跟“行號”,“函 數名”,“文件名:行號”,“文件名:函數名”,這個命令會打印出所指定的源代碼在運行時 的內存地址,如:(gdb) info line tst.c:funcLine

47、 5 of tst.c starts at address 0x8048456 and ends at 0x804845d .還有一個命令( disassemble )你可以查看源程序測當前執行時的機器碼,這個命令會把 目前內存中的指令 dump 出來。如下面的示例表示查看函數 func 的匯編代碼。(gdb) disassemble funcDump of assembler code for function func:0x8048450:push%ebp0x8048451:mov%esp,%ebp0x8048453:sub$0x18,%esp0x8048456:movl$0x0,0xff

48、fffffc(%ebp)0x804845d:movl$0x1,0xfffffff8(%ebp)0x8048464:mov0xfffffff8(%ebp),%eax0x8048467:cmp0x8(%ebp),%eax0x804846a:jle0x8048470 0x804846c:jmp0x8048480 0x804846e:mov%esi,%esi0x8048470:mov0xfffffff8(%ebp),%eax0x8048473:add%eax,0xfffffffc(%ebp)0x8048476:incl0xfffffff8(%ebp)0x8048479:jmp0x8048464 0x8

49、04847b:nop0x804847c:lea0x0(%esi,1),%esi0x8048480:mov0xfffffffc(%ebp),%edx0x8048483:mov%edx,%eax0x8048485:jmp0x8048487 0x8048487:mov%ebp,%esp0x8048489:pop%ebp0x804848a:retEnd of assembler dump.查看運行時數據在你調試程序時,當程序被停住時,可以使用 print 命令(簡寫命令為 p ),或是同義命令 inspect 來查看當前程序的運行數據。 print 命令的格式是:printprint/ 是表達式,是你

50、所調試的程序的語言的表達式( GDB 可以調試多種編程語言) 是輸出的格式,比如,如果要把表達式按16 進制的格式輸出,那么就是 /x。一、表達式print 和許多 GDB 的命令一樣,可以接受一個表達式, GDB 會根據當前的程序運行的數 據來計算這個表達式,既然是表達式,那么就可以是當前程序運行中的 const 常量、變量、 函數等內容??上У氖?GDB 不能使用你在程序中所定義的宏。表達式的語法應該是當前所調試的語言的語法,由于 C/C+ 是一種大眾型的語言,所以, 本文中的例子都是關于 C/C+ 的。(而關于用 GDB 調試其他語言的章節,將在后面介紹)在表達式中,有幾種 GDB 所支

51、持的操作符,他們可以用在任何一種語言中。是一個數組有關的操作符,在后面會有更詳細的說明。指定一個在文件中或是一個函數中的變量。 表示一個指向內存地址 的類型為 type 的一個對象。二、程序變量在 GDB 中,你可以隨時查看以下三種變量的值:1、 全局變量(所有文件可見的)2、 靜態全局變量(當前文件可見的)3 、 局部變量(當前 scope 可見的) 如果你的局部變量和全局變量發生沖突(也就是重命名) ,一般情況下是局部變量會隱藏 全局變量, 也就是說, 如果一個全局變量和一個函數重的局部變量同名時, 如果當前停止點 在函數中,用 print 顯示出的變量的值會是函數中局部變量的值。如果此時你想查看局部變 量的值,可以使用“:”操作符。file:variablefunction:variable可以通過這種形式指定你想查看的變量, 是哪個文件中的或是哪個函數中的。 例如, 查看 文件 f2.c 中的全局變量 x 的值:(gdb) p f2.c :x當然,“:”操作符會和C+中的發生沖突,GDB能自動識別“::”是否是C+的操作符, 所以不用擔心在調試 C+ 程序時會出現異常。另外,需要主要的是,如果你的程序編譯時開啟了優化選項,那么在GDB 調試貝優化過的程序時,可能會發生某些變量不能訪問,或是取值錯誤的情況。

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論