功能
一般來說,GDB主要幫助你完成下面四個方面的功能:
1、啟動你的程序,可以按照你的自定義的要求随心所欲的運行程序。
2、可讓被調試的程序在你所指定的調置的斷點處停住。(斷點可以是條件表達式)
3、當程序被停住時,可以檢查此時你的程序中所發生的事。
4、你可以改變你的程序,将一個BUG産生的影響修正從而測試其他BUG。
版本發布
2009年12月29日,程序調試工具GDB7.0.1發布,新版本修正了7.0版本的一些嚴重的堆棧溢出bug,這些bug可能導緻GDB調試進程中斷,修正了在FreeBSD和IRⅨ系統下無法編譯的問題,增加了對Thumb2調試的支持,還有其他一些小bug的修複。針對存在調速器側隙非線性和汽輪機GRC的LFC系統,采用了LADRC方法,将GDB非線性轉化成傳遞函數形式,進而降低參數整定的難度。
2010年03月19日,GDB7.1發布。
詳細改進内容:多程序調試的支持;
位置獨立的可執行文件(派)調試的支持;
新的目标(包括一個模拟器):Xilinx MicroBlaze和瑞薩RX;
Python支持增強;
c++支持擴展;
新tracepoint功能;
過程記錄的改進;
遠程協議擴展。
2010年09月06日,GDB7.2發布,該版本改進記錄:
1、支持D語言
2、C++改進,支持參數依賴查找ADL,靜态常量類成員和改進了用戶自定義操作符的支持
3、Python調試的改進,包括斷點、符号、符号表、程序空間、線程等可通過命令行進行操作
4、Furthermore,enhancements were made for tracepoints and for GDBserver.在跟蹤點和GDB程序上有了改善。
5、支持ARM Symbian平台
6、其他方面的改進和bug修複。
2011年08月26日,GDB7.3a發布,
變化:
1、GDB可以理解線程的名字。
2、這個命令”線程名稱”(指定一個名稱)和“線程找到[REGexp]”(匹配名稱、目标ID,或者額外的信息)被添加。
3、Python腳本支持是大大增強。
4、在c++的支持,異常處理是提高,模闆參數放在範圍在一個實例化時調試。
5、線程調試的核心轉儲在GNU/Linux成為可能。
6、最初支持C語言版本的OpenCL。
7、許多其他改進。
文件清單
List(gdb) list line1,line2。
查看源代碼;
list lineNum在lineNum的前後源代碼顯示出來;
list+列出當前行的後面代碼行;
list function;
set listsize count;
設置顯示代碼的行數;
show listsize;
顯示打印代碼的行數;
list first,last;
顯示從first到last的源代碼行。
執行程序
要想運行準備調試的程序,可使用run命令,在它後面可以跟随發給該程序的任何參數,包括标準輸入和标準輸出說明符(<;和>;)和shell通配符(*、?、[、])在内。如果你使用不帶參數的run命令,gdb就再次使用你給予前一條run命令的參數,這是很有用的。利用set args命令就可以修改發送給程序的參數,而使用show args命令就可以查看其缺省參數的列表。
(gdb) file a.out//加載被調試的可執行程序文件。
backtrace命令為堆棧提供向後跟蹤功能。
Backtrace命令産生一張列表,包含着從最近的過程開始的所有有效過程和調用這些過程的參數。
利用print命令可以檢查各個變量的值。
print是gdb的一個功能很強的命令,利用它可以顯示被調試的語言中任何有效的表達式。表達式除了包含你程序中的變量外,還可以包含以下内容:
對程序中函數的調用;
(gdb) print find_entry(1,0);
數據結構和其他複雜對象;
(gdb)print *table_start;
={e=reference=’000’,location=0x0,next=0x0}。
人為數組提供了一種去顯示存儲器塊(數組節或動态分配的存儲區)内容的方法。早期的調試程序沒有很好的方法将任意的指針換成一個數組。就像對待參數一樣,讓我們查看内存中在變量h後面的10個整數,一個動态數組的語法如下所示:
base@length;
因此,要想顯示在h後面的10個元素,可以使用h@10:(gdb)printh@10=(-1,345,23,-234,0,0,0,98,345,10);
whatis命令可以顯示某個變量的類型;
(gdb)whatisp;
type=int*。
斷點
break命令(可以簡寫為b)可以用來在調試的程序中設置斷點,該命令有如下四種形式:
break line-number使程序恰好在執行給定行之前停止。
break function-name使程序恰好在進入指定的函數之前停止。
break line-or-function if condition如果condition(條件)是真,程序到達指定行或函數時停止。
如果該程序是由很多原文件構成的,你可以在各個原文件中設置斷點,而不是在當前的原文件中設置斷點,其方法如下:
(gdb) break filename:line-number;
(gdb) break filename:function-name;
要想設置一個條件斷點,可以利用break if命令,如下所示:
(gdb) break line-or-function if expr。
例:(gdb) break 46 if testsize==100;
從斷點繼續運行:continue命令。
變量檢查賦值
whatis:識别數組或變量的類型。
ptype:比whatis的功能更強,他可以提供一個結構的定義。
set variable=value:将值賦予變量。
print variable=value or p variable=value:除了顯示一個變量的值外,還可以用來賦值。
單步執行
next不進入的單步執行。
step進入的單步執行如果已經進入了某函數,而想退出該函數返回到它的調用函數中,可使用命令finish。
函數調用
call name調用和執行一個函數。
finish 結束執行當前函數,顯示其返回值(如果有的話)。
機器語言工具
有一組專用的gdb變量可以用來檢查和修改計算機的通用寄存器,gdb提供了目前每一台計算機中實際使用的4個寄存器的标準名字:
$pc:程序計數器;
$fp:幀指針(當前堆棧幀);
$sp:棧指針;
$ps:處理器狀态。
信号
gdb通常可以捕捉到發送給它的大多數信号,通過捕捉信号,它就可決定對于正在運行的進程要做些什麼工作。例如,按CTRL-C将中斷信号發送給gdb,通常就會終止gdb。但是你或許不想中斷gdb,真正的目的是要中斷gdb正在運行的程序,因此,gdb要抓住該信号并停止它正在運行的程序,這樣就可以執行某些調試操作。
Handle命令可控制信号的處理,他有兩個參數,一個是信号名,另一個是接受到信号時該作什麼。幾種可能的參數是:
nostop接收到信号時,不要将它發送給程序,也不要停止程序。
stop接受到信号時停止程序的執行,從而允許程序調試;顯示一條表示已接受到信号的消息(禁止使用消息除外);
print接受到信号時顯示一條消息;
noprint接受到信号時不要顯示消息(而且隐含着不停止程序運行);
pass将信号發送給程序,從而允許你的程序去處理它、停止運行或采取别的動作。
nopass停止程序運行,但不要将信号發送給程序。
例如,假定你截獲SIGPIPE信号,以防止正在調試的程序接受到該信号,而且隻要該信号一到達,就要求該程序停止,并通知你。要完成這一任務,可利用如下命令:
請注意,UNⅨ的信号名總是采用大寫字母!你可以用信号編号替代信号名如果你的程序要執行任何信号處理操作,就需要能夠測試其信号處理程序,為此,就需要一種能将信号發送給程序的簡便方法,這就是signal命令的任務。該命令的參數是一個數字或者一個名字,如SIGINT。
假定你的程序已将一個專用的SIGINT(鍵盤輸入,或CTRL-C;信号2)信号處理程序設置成采取某個清理動作,要想測試該信号處理程序,你可以設置一個斷點并使用如下命令:
(gdb) signal 2;
continuing with signal SIGINT⑵。
該程序繼續執行,但是立即傳輸該信号,而且處理程序開始運行。
GDB是一個強大的命令行調試工具。大家知道命令行的強大就是在于,其可以形成執行序列,形成腳本。UNⅨ下的軟件全是命令行的,這給程序開發提代供了極大的便利,命令行軟件的優勢在于,它們可以非常容易的集成在一起,使用幾個簡單的已有工具的命令,就可以做出一個非常強大的功能。
于是UNⅨ下的軟件比Windows下的軟件更能有機地結合,各自發揮各自的長處,組合成更為強勁的功能。而Windows下的圖形軟件基本上是各自為營,互相不能調用,很不利于各種軟件的相互集成。在這裡并不是要和Windows做個什麼比較,所謂“寸有所長,尺有所短”,圖形化工具還有時不如命令行的地方。