GDB除錯技巧

2021-06-12 22:34:35 字數 4291 閱讀 8389

談到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

執行下一行的源**中的一條彙編指令

print

顯示變數的值

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...