天天看點

GDB調試工具指令速查

1.生成調試資訊

一般來說GDB主要調試的是C/C++的程式。要調試C/C++的程式,首先在編譯時,我們必須要把調試資訊加到可執行檔案中。

使用編譯(gcc/g++)的 -g 參數可以做到這一點

$ gcc -g test.c

$ g++ -g test.cpp

如果沒有-g,你将看不見程式的函數名、變量名,所代替的全是運作時的記憶體位址。

2.啟動GDB

  • 啟動gdb
    $ gdb program
    (program 也就是你的執行檔案,一般在目前目錄下)
  • 設定運作參數

    (gdb) set args

    (gdb) set args 10 20 30 “hello world” 6.66

可指定運作時參數。(如:set args 10 20 30 40 50 )

(gdb) show args

(指令可以檢視設定好的運作參數)

  • 啟動程式
    (gdb) run

(程式開始執行,如果有斷點,停在第一個斷點處)

(gdb) start

(程式向下執行一行)

3.顯示源代碼

用list指令來列印程式的源代碼。預設列印10行。

  • 列印第linenm行的上下文内容
    (gdb) list linenum
  • 顯示函數名為function的函數的源程式
    (gdb) list function
  • 顯示目前行後面的源程式
    (gdb) list
  • 顯示目前行前面的源程式
    (gdb) list -
  • 設定一次顯示源代碼的行數
    (gdb) set listsize count
  • 檢視目前listsize的設定
    (gdb) show listsize

4.斷點操作

  1. 簡單斷點

    break 設定斷點,可以簡寫為b

    (gdb) b 6

    (gdb) break 6

    (設定斷點,在源程式第10行)
    (gdb) b func
    (設定斷點,在func函數入口處)

2.多檔案設定斷點

C++中可以使用class::function或function(type,type)格式來指定函數名。

如果有名稱空間,可以使用namespace::class::function或者function(type,type)格式來指定函數名。

Ø break filename:linenum – 在源檔案filename的linenum行處停住

Ø break filename:function – 在源檔案filename的function函數的入口處停住

Ø break class::function或function(type,type) – 在類class的function函數的入口處停住

Ø break namespace::class::function – 在名稱空間為namespace的類class的function函數的入口處停住

3.查詢所有斷點

info break

info b

i break

i b

(上面所有都等同)

5.條件判斷

一般來說,為斷點設定一個條件,我們使用if關鍵詞,後面跟其斷點條件。

設定一個條件斷點:

b test.c:8 if Value == 5

6.維護斷點

1)delete [range…] 删除指定的斷點,其簡寫指令為d。

如果不指定斷點号,則表示删除所有的斷點。range表示斷點号的範圍(如:3-7)。

比删除更好的一種方法是disable停止點,disable了的停止點,GDB不會删除,當你還需要時,enable即可,就好像資源回收筒一樣。

2) disable [range…] 使指定斷點無效,簡寫指令是dis。

如果什麼都不指定,表示disable所有的停止點。

3) enable [range…] 使無效斷點生效,簡寫指令是ena。

如果什麼都不指定,表示enable所有的停止點。

7.調試代碼

  • run 運作程式,可簡寫為r
  • next 單步跟蹤,函數調用當作一條簡單語句執行,可簡寫為n
  • step 單步跟蹤,函數調進入被調用函數體内,可簡寫為s
  • finish 退出進入的函數
  • until 在一個循環體内單步跟蹤時,這個指令可以運作程式直到退出循環體,可簡寫為u。
  • continue 繼續運作程式,停在下一個斷點的位置,可簡寫為c
  • quit 退出gdb,可簡寫為q

8.資料檢視

檢視運作時資料

print 列印變量、字元串、表達式等的值,可簡寫為p

(gdb) p count

(列印count的值)

9.自動顯示

你可以設定一些自動顯示的變量,當程式停住時,或是在你單步跟蹤時,這些變量會自動顯示。相關的GDB指令是display。

  • display 變量名
  • info display – 檢視display設定的自動顯示的資訊。
  • undisplay num(info display時顯示的編号)
  • delete display dnums… – 删除自動顯示,dnums意為所設定好了的自動顯式的編号。如果要同時删除幾個,編号可以用空格分隔,如果要删除一個範圍内的編号,可以用減号表示(如:2-5)
  • disable display dnums…
  • enable display dnums…
  • disable和enalbe不删除自動顯示的設定,而隻是讓其失效和恢複。

10.檢視修改變量的值

(gdb) ptype width – 檢視變量width的類型

type = double

(gdb) p width – 列印變量width 的值

$4 = 13

你可以使用set var指令來告訴GDB,width不是你GDB的參數,而是程式的變量名,如:

set var width=47

(将變量var值設定為47)

繼續閱讀