對於真正意義的調試器來說,gdb在linux下是獨一無二的。它有多種包裝,有字符界面的,也有圖形界面的,有單獨運行的,也有集成到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-number、delete 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/