Linux 下的程序調試技術--GDB方式

對於真正意義的調試器來說,gdblinux下是獨一無二的。它有多種包裝,有字符界面的,也有圖形界面的,有單獨運行的,也有集成到IDE中的。gdb功能強大,圖形界面的gdb容易上手一點,但功能無疑受到了一些限制,相信大部分高手還是願意使用字符界面的。

在編譯階段:

在對程序進行編譯時,需要在gcc(g++)下使用’-g’選項,這樣gdb才能夠調試所使用的變量、代碼行和函數。

通過兩種方式運行gdb:

shell中,可以使用’gdb 程序名’file 程序名這兩種方式來裝入程序,之後可以用gdb命令’run’來啓動程序。

關於斷點的使用:

1. 對於單個文件而言可以直接使用 break linenumber b linenumber直接設置斷點。

2. 對於比較龐雜的大型軟件而言,有時候程序員所關注的代碼發生在一系列操作(比如點擊菜單)或事件之後,這時候設置斷點可以採用如下兩種方法:

dir …/example       //進入被關注的代碼所在的文件夾

break example.cpp:linenumber或者 b example.cpp:linenumber

如果是面嚮對象語言開發的軟件項目,可以用類名+函數名來設置斷點

Break classname:functionname

3. 條件斷點:

在一些循環語句中,異常情況往往在循環執行若干次後纔出現,因此可以用添加條件的方法來讓定位異常,以便觀察異常發生時各個變量的值。

例如:(gdb) break 21 if value1==value2

Breakpoint 1 at 0x8048428: file eg1.c, line 21.

如果已經在第 21 行中設置了斷點,如 1 號斷點,則可以使用 'condition' 命令來代替在斷點上設置條件:

(gdb) condition 1 value== value2

查看斷點信息:info break

 取消、刪除斷點:disable b-numberdelete b-number

監視點:

當指定表達式的值改變時,監視點將中斷程序執行,但必須在表達式中所使用的變量在作用域中時設置監視點。可以在變量所在作用域的函數上設置斷點,然後運行程序,當遇到該函數斷點時設置監視點。

堆棧跟蹤:

程序調用堆棧是當前函數之前的所有已調用函數的列表(包括當前函數)。每個

函數及其變量都被分配了一個,最近調用的函數在 0 號幀中(底部幀)。要打印堆棧,發出命令 'bt''backtrace' [回溯] 的縮寫):

    (gdb) bt

#0  0x80483ea in wib (no1=8, no2=8) at eg1.c:7

#1  0x8048435 in main (argc=1, argv=0xbffff9c4) at eg1.c:21

實際上,發出 'info locals' 命令時,gdb 會打印出當前幀中的局部變量,缺省情況下,這個幀中的函數就是被中斷的函數(0 號幀)。可以使用命令 'frame' 打印當前幀。要查看 main 函數(在 1 號幀中)中的變量,可以發出 'frame 1' 切換到 1 號幀,然後發出 'info locals' 命令。

程序的前行:

 單步執行:

 Next n 單步執行,不進入函數內部,相當於vc中的F10;

 Step s 但不執行,進入函數內部,相當於vc中的F11;

 Contuinue 程序從當前位置開始順次執行。

 Finish 跳出當前函數的執行

 

 

參考:Debugging with GDB------The GNU Source-Level Debugger 4.12

             http://www.ibm.com/developerworks/cn/linux/sdk/gdb/

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章