gdb單步除錯
阿新 • • 發佈:2018-11-22
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不刪除自動顯示的設定,而只是讓其失效和恢復。
-
檢視修改變數的值
(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