談到gdb,不能不對他的強大功能所折服,在我所用過的所有偵錯程式中,這實在是乙個強大的除錯工具,今天就說說gdb的簡單用法。gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc、bcb等ide的除錯,但如果你是在 unix平台下做軟體,你會發現gdb這個除錯工具有比vc、bcb的圖形化偵錯程式更強大的功能。
gdb常用命令:
awatch
rwatch
和watch
命令。
backtrace
顯示函式呼叫得所有棧框架(
stack frames
)的蹤跡和當前函式的引數的值,
bt是這個命令的簡寫。
break
設定乙個斷點,這個命令需要指定**行或者函式名作為引數
clear
刪除乙個斷點,這個命令需要制定**行或者函式名作為引數
continue
偵錯程式停止的地方繼續執行
ctrl-c
在當前位置停止執行正在執行的程式,斷點在當前行
disable
禁止斷點功能,這個命令需要禁止的斷點在斷點列表索引值作為引數
display
在斷點的停止的地方,顯示指定的表示式的值。(顯示變數)
enable
允許斷點功能,這個命令需要允許的斷點在斷點列表索引值作為引數
finish
繼續執行,知道當前函式返回
ignore
忽略某個斷點制定的次數。例:
ignore 4 23
忽略斷點4的
23次執行,在第
24次的時候中斷
info breakpoints
檢視斷點資訊
info display
檢視設定的需要顯示的表示式的資訊
kill
終止當前
debug
的程序
list 顯示
10行**。如果沒有提供引數給這個命令,則從當前行開始顯示
10行**。如果提供了函式名作為引數,則從函式開頭顯示。如果提供**行的編號作為引數,這一行作為開頭顯示。
load
動態載入乙個可執行檔案到偵錯程式。
next
執行下一行的源**的所有指令。如果是函式呼叫,則也當作一行源**,執行到此函式返回
nexti
執行下一行的源**中的一條彙編指令
顯示變數的值
ptype
顯示變數的型別
return
強制從當前函式返回
run從程式開始的地方執行
rwatch
rwatch
和watch
命令。
set
設定變數的值。例如:
set nval=54
將把54
儲存到nval
變數中
step
繼續執行程式下一行源**的所有指令。如果是呼叫函式,這個命令將進入函式的內部,單步執行函式中**。
stepi
繼續執行程式下一行源**中的彙編指令。如果是函式呼叫,這個命令將進入函式的內部,單步執行函式中的彙編**。
txbreak
在當前函式的退出的點上設定乙個臨時的斷點(只可使用一次)。
undisplay
刪除乙個
display
設定的變數顯示。這個命令需要將
display list
中的索引做引數。
watch
rwatch
和watch
命令。
whatis
顯示變數的值和型別。
xbreak
在當前函式的退出的點上設定乙個斷點。
還有其他的一些命令可以用「info gdb」和「gdb -help」檢視
除錯方式:
參考ibm的一段異常**進行了測試,具體如下
#include int wib(int no1, int no2)
int main(int argc, char *argv)
printf("%d wibed by %d equals %d\n", value, div, total);
return 0;
}
第一步:編譯
編譯的時候注意加-g選項,指定編譯器有除錯資訊
執行命令:gcc gdb_test.c -o gdb_test -g -wall
第二部:載入
用gdb把可執行檔案載入
執行命令:gdb gdb_test
第三步:設定斷點
檢視原始碼編號,猜測出錯位置或者全速執行報錯位置設定斷點
執行命令:break
第四步:執行
執行命令:run
第五步:單步除錯
單步執行step/next進行除錯並列印print
執行命令:run/print
下面是除錯過程:
[root@localhost gdb]# gdb gdb_test2 //載入
gnu gdb fedora (6.8-27.el5)
license gplv3+: gnu gpl version 3 or later this is free software: you are free to change and redistribute it.
there is no warranty, to the extent permitted by law. type "show copying"
and "show warranty" for details.
this gdb was configured as "i386-redhat-linux-gnu"...
(gdb)
(gdb) list 5 //檢視
1 #include 2
3 int wib(int no1, int no2)
4
10 int main(int argc, char *argv)
(gdb)
(gdb)
(gdb) list
11
24 printf("%d wibed by %d equals %d\n", value, div, total);
25 return 0;
26 }
(gdb)
(gdb) break 19 //設定斷點
breakpoint 1 at 0x80483d7: file gdb_test2.c, line 19.
(gdb) run //執行
(gdb) print div //列印值
$5 = 6
(gdb) print value
$6 = 10
(gdb) print value
$15 = 9
(gdb) print div
$16 = 7
(gdb) next //單步除錯
20 total += result;
(gdb) next
21 div++;
(gdb) next
22 value--;
(gdb) next
17 for(i=0; i<10; i++)
(gdb) print div
$17 = 8
(gdb) print value
$18 = 8
根據結果可以得出此時div 和value值均為8傳入函式後diff=no1-no2=0,被除數為0,所以導致錯誤。
GDB除錯技巧
在公司工作了一段時間,發現 b s結構的 除錯很麻煩,經常用的手段是通過 printf 打一串訊息來進行跟蹤,然後估計問題出在 通過逐步新增 printf 語句,獲得越來越多的資訊最終確定問題的根源。我感覺這樣比較麻煩,如果能把 gdb的單步除錯功能用上就好了。工作之餘,做了一定的嘗試,希望對跟我一...
gdb除錯技巧
1 以結構體形式訪問某個記憶體 print type addr 其中type是結構體型別,addr是記憶體的位址 2 顯示符號表 info symbol info symbol symbol addr symbol addr為對應的位址 print 符號名 3 檢視型別的原型定義 有時候在除錯大型程...
gdb除錯技巧
1 按結構體格式列印 set print pretty on 2.檢測點 watch 為表示式 變數 expr設定乙個觀察點。一量表示式值有變化時,馬上停住程式。rwatch 當表示式 變數 expr被讀時,停住程式。awatch 當表示式 變數 的值被讀或被寫時,停住程式。info watchpo...