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的設置。