1. 程式人生 > >gdb單步除錯

gdb單步除錯

1 簡介

 GDB(GNU Debugger)是GCC的除錯工具。其功能強大,現描述如下:

 GDB主要幫忙你完成下面四個方面的功能:

 1.啟動你的程式,可以按照你的自定義的要求隨心所欲的執行程式。

 2.可讓被除錯的程式在你所指定的調置的斷點處停住。(斷點可以是條件表示式)

 3.當程式被停住時,可以檢查此時你的程式中所發生的事。

 4.動態的改變你程式的執行環境。

2 生成除錯資訊

 一般來說GDB主要除錯的是C/C++的程式。要除錯C/C++的程式,首先在編譯時,我們必須要把除錯資訊加到可執行檔案中。使用編譯器(cc/gcc/g++)的 -g 引數可以做到這一點。如:


 gcc -g hello.c -o hello


 g++ -g hello.cpp -o hello


 如果沒有-g,你將看不見程式的函式名、變數名,所代替的全是執行時的記憶體地址。當你用-g把除錯資訊加入之後,併成功編譯目的碼以後,讓我們來看看如何用gdb來除錯他。

3 啟動GDB 的方法

 gdb program


 program 也就是你的執行檔案,一般在當前目錄下。

4 程式執行上下文

4.1 程式執行引數

 set args 可指定執行時引數。(如:set args 10 20 30 40 50 )


 show args 命令可以檢視設定好的執行引數。


 run  啟動程式

4.2 工作目錄

 cd 相當於shell的cd命令。


 pwd 顯示當前的所在目錄。

5 設定斷點

5.1 簡單斷點

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


 b 10 設定斷點,在源程式第10行


 b func 設定斷點,在func函式入口處

5.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函式的入口處停住

5.3 查詢所有斷點

 info b

6條件斷點

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


 設定一個條件斷點


 b test.c:8 if intValue = 5

7 維護停止點

 delete [range...] 刪除指定的斷點,如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的範圍(如:3-7)。其簡寫命令為d。


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


 disable  [range...]


      disable所指定的停止點,如果什麼都不指定,表示disable所有的停止點。簡寫命令是dis.


 enable [range...]


      enable所指定的停止點,如果什麼都不指定,表示enable所有的停止點。簡寫命令是ena.

8 除錯程式碼

 run 執行程式,可簡寫為r


 next 單步跟蹤,函式呼叫當作一條簡單語句執行,可簡寫為n


 step 單步跟蹤,函式調進入被呼叫函式體內,可簡寫為s


 finish 退出進入的函式


 until 在一個迴圈體內單步跟蹤時,這個命令可以執行程式直到退出迴圈體,可簡寫為u。


 continue 繼續執行程式,可簡寫為c

9 檢視執行時資料

 print 列印變數、字串、表示式等的值,可簡寫為p

 p count 列印count的值

10 自動顯示

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


 display 變數名


 info display -- 檢視display設定的自動顯示的資訊。


 undisplay num(info display時顯示的編號)


 delete display dnums… -- 刪除自動顯示,dnums意為所設定好了的自動顯式的編號。如果要同時刪除幾個,編號可以用空格分隔,如果要刪除一個範圍內的編號,可以用減號表示(如:2-5)


 disable display dnums…


 enable display dnums…


 disable和enalbe不刪除自動顯示的設定,而只是讓其失效和恢復。
  1. 檢視修改變數的值

    (gdb) ptype width – 檢視變數width的型別

      type = double
    

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

      $4 = 13
    

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

      (gdb) set var width=47
    

    在你改變程式變數取值時,最好都使用set var格式的GDB命令。

12 顯示原始碼

 GDB 可以打印出所除錯程式的原始碼,當然,在程式編譯時一定要加上 –g 的引數,把源程式資訊編譯到執行檔案中。不然就看不到源程式了。當程式停下來以後,

 GDB會報告程式停在了那個檔案的第幾行上。你可以用list命令來列印程式的原始碼。預設列印10行,還是來看一看檢視原始碼的GDB命令吧。


 list linenum


      Print lines centered around line number linenum in the current source file.


 list function


      顯示函式名為function的函式的源程式。


 list


      顯示當前行後面的源程式。


 list -


      顯示當前行前面的源程式。


 一般是列印當前行的上5行和下5行,如果顯示函式是是上2行下8行,預設是10行,當然,你也可以定製顯示的範圍,使用下面命令可以設定一次顯示源程式的行數。


      set listsize count


 設定一次顯示原始碼的行數。(unless the list argument explicitly specifies some other number)


      show listsize


 檢視當前listsize的設定。

比如:下述例子,gdb +專案名: 啟動gdb;b +cpp檔案:+行號:打斷點;r:執行;n:執行下一行;p+變數名:顯示變數值
gdb combox

(gdb) b mainview.cpp:132

(gdb) r

(gdb) n

(gdb) p m_LogFileName