GDB除錯命令

2021-05-11 11:41:31 字數 4238 閱讀 1097

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常用命令簡介 rrun 執行.程式還沒有執行前使用 c cuntinue 執行到下一斷點處 qquit 退出tab tab命令補全功能 h help幫助s step 跟入函式 nnext 執行下一行的 如果是函式呼叫,也當作一行 執行到此函式返回 b breakpoint 設定斷點,用法 ...

GDB除錯命令

用gdb除錯程式 gdb概述 gdb是gnu開源組織發布的乙個強大的unix下的程式除錯工具。或許,各位比較喜歡那種圖形介面方式的,像vc bcb等ide的除錯,但如果你是在unix平台下做軟體,你會發現gdb這個除錯工具有比vc bcb的圖形化偵錯程式更強大的功能。所謂 寸有所長,尺有所短 就是這...

GDB除錯命令

run 執行程式 list 檢視 break n 行號 在 n行設定斷點 break n if i x 在 n行設定斷點,當變數 以 i代表變數 為某值時 info break 檢視斷點資訊 delete 斷點編號 刪除斷點 break 函式名 在呼叫該函式的時候停止 next 單步執行 不進入子函...