gdb的命令很多,本文不會全部介紹,僅會介紹一些最常用的。在介紹之前,先介紹gdb中的乙個非常有用的功能:補齊功能。它就如同linux下 shell中的命令補齊一樣。當你輸入乙個命令的前幾個字元,然後輸入tab鍵,如果沒有其它命令的前幾個字元與此相同,shell將補齊此命令。如果有其它命令的前幾個字元與此相同,你會聽到一聲警告聲,再輸入tab鍵,shell將所有前幾個字元與此相同的命令全部列出。而gdb中的補齊功能不僅能補齊gdb命令,而且能補齊引數。
本文將先介紹常用的命令,然後結合乙個具體的例子來演示如何實際使用這些命令。下面的所有命令除了第一條啟動 gdb命令是在shell下輸入的,其餘都是gdb內的命令。大部分gdb內的命令都可以僅輸入前幾個字元,只要不與其它指令衝突。如quit可以簡寫為 q,因為以q打頭的命令只有quit。list可以簡寫為l,等等。
1.啟動gdb
你可以輸入gdb來啟動gdb
程式。 gdb程式有許多引數,在此沒有必要詳細介紹,但乙個最為常用的還是要介紹的:如果你已經編譯好乙個程式,我們假設檔名為hello,你想用gdb除錯它,可以輸入gdb hello來啟動gdb並載入你的程式。如果你僅僅啟動了gdb,你必須在啟動後,在gdb中再載入你的程式。
2.引導程式 === file
在gdb內,引導程式很簡單,使用file命令。如file hello。當然,
程式的路徑名要正確。
退出gdb === quit
在gdb的命令方式下,輸入quit,你就可以退出gdb。你也可以輸入'c-d'來退出gdb。
3.執行程式 === run
當你在gdb中已將要除錯的程式載入後,你可以用run命令來執行。如果你的
程式需要引數,你可以在run指令後接著輸入引數,就象你在shell下執行乙個需要引數的命令一樣。
4.檢視程式資訊 === info
info指令用來檢視程式的資訊,當你用help info檢視幫助的話,info指令的引數足足佔了兩個螢幕,它的引數非常多,但大部分不常用。我用info指令最多的是用它來檢視斷點資訊。
4.1 檢視斷點資訊
info br
br是斷點break的縮寫,記得gdb的補齊功能吧。用這條指令,你可以得到你所設定的所有斷點的詳細資訊。包括斷點號,型別,狀態,記憶體位址,斷點在源程式中的位置等。
4.2 檢視當前源程式
info source
4.3 檢視堆疊資訊
info stack
用這條指令你可以看清楚程式的呼叫層次關係。
4.4 檢視當前的引數
info args
5.列出源一段源
程式=== list
5.1 列出某個函式
list function
.2 以當前原始檔的某行為中間顯示一段源程式
list linenum
5.3 接著前一次繼續顯示
list
5.4 顯示前一次之前的源程式
list -
5.5 顯示另乙個檔案的一段程式
list filename:function 或 list filename:linenum
6.設定斷點 === break
現在我們將要介紹的也許是最常用和最重要的命令:設定斷點。無論何時,只要你的
程式已被載入,並且當前沒有正在執行,你就能設定,修改,刪除斷點。設定斷點的命令是break。有許多種設定斷點的方法。如下:
6.1 在函式入口設定斷點
break function
6.2 在當前原始檔的某一行上設定斷點
break linenum
6.3 在另乙個原始檔的某一行上設定斷點
break filename:linenum
6.4 在某個位址上設定斷點,當你除錯的
程式沒有源程式是,這很有用
break *address
除此之外,設定乙個斷點,讓它只有在某些特定的條件成立時程式才會停下,我們可以稱其為條件斷點。這個功能很有用,尤其是當你要在乙個程式會很多次執行到的地方設定斷點時。如果沒有這個功能,你必須有極大的耐心,加上大量的時間,一次一次讓程式斷下,檢查一些值,接著再讓程式繼續執行。事實上,大部分的斷下並不是我們所希望的,我們只希望在某些條件下讓程式斷下。這時,條件斷點就可以大大提高你的效率,節省你的時間。條件斷點的命令如下,在後面的例子中會有示例。
6.5 條件斷點
break ...if cond
7.其它斷點操作
gdb給每個斷點賦上乙個整數數字,這個數字在操作斷點時起到重要作用,它實際上就代表相應的斷點。gdb中的斷點有四種狀態:
有效(enabled)
禁止(disabled)
一次有效(enabled once)
有效後刪除(enabled for deletion)
在上面的四個狀態有效和禁止都很好理解,禁止就是讓斷點暫時失效。一次有效就是當程式在此斷點斷下後,斷點狀態自動變為禁止狀態。有效後刪除就是當程式在此斷點斷下後,斷點被刪除。實際上,後兩種狀態一般不會碰到。
當你設定乙個斷點後,它的確省狀態是有效。你可以用enable和disable指令來設定斷點的狀態為有效或禁止。例如,如果你想禁止2號斷點,可以用下面的指令:
disable 2
相應的,如果想刪除2號斷點,可以有下面的指令:
delete 2
8.設定監視點 === watch
當你除錯乙個很大的程式,並且在跟蹤乙個關鍵的變數時,發現這個變數不知在哪兒被改動過,如何才能找到改動它的地方。這時你可以使用watch命令。簡單地說,監視點可以讓你監視某個表示式或變數,當它被讀或被寫時讓
程式斷下。watch命令的用法如下:
watch expression
watch 指令是監視被寫的,當你想監視某個表示式或變數被讀的話,需要使用rwatch指令,具體用法是一樣的。要注意的是,監視點有硬體和軟體兩種方式,如果可能linux盡可能用硬體方式,因為硬體方式在速度上要大大快於軟體方式。軟體方式由於要在每次執行一條指令後都要檢查所要監視的值是否被改變,因此它的執行速度會大大降低。同時它也無法設定成被讀時讓
程式斷下,因為讀操作不會改變值,所以gdb無法檢測到讀操作。幸運的是,目前的pc機基本都支援硬體方式。如果你想確認一下你的機器是否支援硬體,你可以在除錯程式時用watch設定乙個監視點,如果gdb向你顯示:
hardware watchpoint num: expr
.檢查資料
最常用的檢查資料的方法是使用print命令。
print exp
print 指令列印exp表示式的值。卻省情況下,表示式的值的列印格式依賴於它的資料型別。但你可以用乙個引數/f來選擇輸出的列印格式。f是乙個代表某種格式的字母,詳細可參考輸出格式一節。表示式可以是常量,變數,函式呼叫,條件表示式等。但不能列印巨集定義的值。表示式exp中的變數必須是全域性變數或當前堆疊區可見的變數。否則gdb會顯示象下面的一條資訊:
no symbol "varible" in current context
10.修改變數值
在除錯程式
時,你可能想改變乙個變數的值,看看在這種情況下會發生什麼。用set指令可以修改變數的值:
set varible=value
例如你想將乙個變數tmp的值賦為10,
set tmp=10
11.檢查記憶體值
檢查記憶體值的指令是x,x是examine的意思。用法如下:
x /nfu addr
其中n代表重複數,
f代表輸出格式(見2.13),
f可以是以下的一些值:
'x' 16進製制整數格式
'd' 有符號十進位制整數格式
'u' 無符號十進位制整數格式
'f' 浮點數格式
u代表每個資料單位的大小。u可以去如下值:
b :位元組(byte)
h :雙位元組數值
w :四位元組數值
g :八字節數值
因此,上面的指令可以這樣解釋:從addr位址開始,以f格式顯示n個u數值。例如:
x/4ub 0x4000
會以無符號十進位制整數格式(u)顯示四個位元組(b),0x4000,0x4001,0x4002,0x4003。
12.輸出格式
預設情況下,輸出格式依賴於它的資料型別。但你可以改變輸出格式。當你使用print命令時,可以用乙個引數/f來選擇輸出的列印格式。f可以是以下的一些值:
'x' 16進製制整數格式
'd' 有符號十進位制整數格式
'u' 無符號十進位制整數格式
'f' 浮點數格式
13.單步執行指令
單步執行指令有兩個step和next。step可以讓你跟蹤進入乙個函式,而next指令則不會進入函式。
14.繼續執行指令
當程式被斷下後,你檢視了所需的資訊後,你會希望
程式執行下去,輸入 continue, 程式會繼續執行下去。
15.幫助指令help
在gdb中,如果想知道一條指令的用法,最方便的方法是使用help。使用方法很簡單,在help後跟上指令名。例如,想知道list指令用法,輸入
help list
gdb常用命令
gnu的偵錯程式稱為gdb,是乙個互動式的程式,工作在字元模式。其常用命令如下 break num 在指定的行上設定斷點 break 1 bt 顯示函式的呼叫順序 clear 刪除斷點 clear test.c 10 display expr 每次程式停止後顯示表示式的值 printf expr顯示...
GDB常用命令
1 執行 run2 單步執行 step next finish 一直執行到函式返回 until 執行到某一行 3 斷點 break args break 12 break 10 hbreak args 硬體輔助斷點 thbreak args rbreak args info breakpoints ...
gdb 常用命令
呼叫gdb編譯需要在cc後面加 g引數再加 o root redhat home gdb 除錯檔案 啟動gdb gdb l 字母l 從第一行開始列出原始碼 gdb break n 在第n行處設定斷點 gdb break func 在函式func 的入口處設定斷點 gdb info break 檢視斷...