gdb命令手冊
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
5.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
cond是乙個布林條件表示式,語法與c語言中的一樣。條件斷點與一般的斷點不同之處是每當程式執行到斷點處,都要計算條件表示式,如果為真,程式才會斷下,否則程式會一直執行下去。
7.其它斷點操作
有效(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
那麼你可以放心了,你的機器支援硬體方式。
9.檢查資料
最常用的檢查資料的方法是使用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),u代表每個資料單位的大小。u可以去如下值:
b :位元組(byte)
h :雙位元組數值
w :四位元組數值
g :八字節數值
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命令手冊
gdb的命令很多,本文不會全部介紹,僅會介紹一些最常用的。在介紹之前,先介紹gdb中的乙個非常有用的功能 補齊功能。它就如同linux下 shell中的命令補齊一樣。當你輸入乙個命令的前幾個字元,然後輸入tab鍵,如果沒有其它命令的前幾個字元與此相同,shell將補齊此命令。如果有 其它命令的前幾個...
gdb命令手冊
關於斷點的命令 awatch awatch用來為乙個表示式設定觀察點,在表示式的值發生改變時,或者當表示式的值被讀取的時候,程式停止執行。break 用於在程式中設定斷點 break 要設定斷點的行號 clear 用於清除斷點 clear 要清除斷點的行號 commands 用於為遇到斷點之後執行特...
GDB 查詢手冊
backtrace 或bt 檢視各級函式呼叫及引數 finish 執行到當前函式返回,然後停下來等待命令 frame 或f 幀編號 選擇棧幀 info 或i locals 檢視當前棧幀區域性變數的值 list 或l 列出源 接著上次的位置往下列,每次列10行 list 行號 列出從第幾行開始的源 l...