gdb偵錯程式命令學習總結筆記

2021-04-16 07:02:06 字數 4063 閱讀 4812

linux中包含有乙個很有用的除錯工具--gdb(gnu debuger),它可以用來除錯c和c++程式,功能不亞於windows下的許多圖形介面的除錯工具。

和所有常用的除錯工具一樣,gdb提供了以下功能:

# 監視程式中變數的值

# 在程式中設定斷點

# 程式的單步執行

在使用gdb前,必須先載入可執行檔案,因為要進行除錯,檔案中就必須包含除錯資訊,所以在用gcc或cc編譯時就需要用-g引數來開啟程式的除錯選項。

除錯開始時,必須先載入要進行除錯的程式,可以用以下兩種方式:

* 在啟動gdb後執行以下命令:

file 可執行檔案路徑

* 在gdb啟動時就引導程式:

gdb 可執行檔案路徑

引導程式後,接下來就是要進行斷點的設定,要監視的變數的新增等工作,下面對在這個過程中常會用到的命令逐一進行介紹:

*list:顯示程式中的**,常用使用格式有:

list

輸出從上次呼叫list命令開始往後的10行程式**。

list -

輸出從上次呼叫list命令開始往前的10行程式**。

list n

輸出第n行附近的10行程式**。

list function

輸出函式function前後的10行程式**。

*forward/search:從當前行向後查詢匹配某個字串的程式行。使用格式:

forward/search 字串

查詢到的行號將儲存在$_變數中,可以用print $_命令來檢視。

*reverse-search:和forward/search相反,向前查詢字串。使用格式同上。

*break:在程式中設定斷點,當程式執行到指定行上時,會暫停執行。使用格式:

break 要設定斷點的行號

*tbreak:設定臨時斷點,在設定之後只起作用一次。使用格式:

tbreak 要設定臨時斷點的行號

*clear:和break相反,clear用於清除斷點。使用格式:

clear 要清除的斷點所在的行號

*run:啟動程式,在run後面帶上引數可以傳遞給正在除錯的程式。

*awatch:用來增加乙個觀察點(add watch),使用格式:

awatch 變數或表示式

當表示式的值發生改變或表示式的值被讀取時,程式就會停止執行。

*watch:與awatch類似用來設定觀察點,但程式只有當表示式的值發生改變時才會停止執行。使用格 式:

watch 變數或表示式

需要注意的是,awatch和watch都必須在程式執行的過程中設定觀察點,即可執行run之後才能設定。

*commands:設定在遇到斷點後執行特定的指令。使用格式有:

commands

設定遇到最後乙個遇到的斷點時要執行的命令

commands n

設定遇到斷點號n時要執行的命令

注意,commands後面跟的是斷點號,而不是斷點所在的行號。

在輸入命令後,就可以輸入遇到斷點後要執行的命令,每行一條命令,在輸入最後一條命令後輸入end就可以結束輸入。

*delete:清除斷點或自動顯示的表示式。使用格式:

delete 斷點號

*disable:讓指定斷點失效。使用格式:

disable 斷點號列表

斷點號之間用空格間隔開。

*enable:和disable相反,恢復失效的斷點。使用格式:

enable 斷點編號列表

*ignore:忽略斷點。使用格式:

ignore 斷點號 忽略次數

*condition:設定斷點在一定條件下才能生效。使用格式:

condition 斷點號 條件表示式

*cont/continue:使程式在暫停在斷點之後繼續執行。使用格式:

cont

跳過當前斷點繼續執行。

cont n

跳過n次斷點,繼續執行。

當n為1時,cont 1即為cont。

*jump:讓程式跳到指定行開始除錯。使用格式:

jump 行號

*next:繼續執行語句,但是跳過子程式的呼叫。使用格式:

next

執行一條語句

next n

執行n條語句

*nexti:單步執行語句,但和next不同的是,它會跟蹤到子程式的內部,但不列印出子程式內部的語句。使用格式同上。

*step:與next類似,但是它會跟蹤到子程式的內部,而且會顯示子程式內部的執**況。使用格式同上。

*stepi:與step類似,但是比step更詳細,是nexti和step的結合。使用格式同上。

*whatis:顯示某個變數或表示式的資料型別。使用格式:

whatis 變數或表示式

*ptype:和whatis類似,用於顯示資料型別,但是它還可以顯示typedef定義的型別等。使用格式:

ptype 變數或表示式

*set:設定程式中變數的值。使用格式:

set 變數=表示式

set 變數:=表示式

*display:增加要顯示值的表示式。使用格式:

display 表示式

*info display:顯示當前所有的要顯示值的表示式。

*delete display/undisplay:刪除要顯示值的表示式。使用格式:

delete display/undisplay 表示式編號

*disable display:暫時不顯示乙個要表示式的值。使用格式:

disable display 表示式編號

*enable display:與disable display相反,使用表示式恢復顯示。使用格式:

enable display 表示式編號

*print:列印變數或表示式的值。使用格式:

print 變數或表示式

表示式中有兩個符號有特殊含義:$和$$。

$表示給定序號的前乙個序號,$$表示給定序號的前兩個序號。

如果$和$$後面不帶數字,則給定序號為當前序號。

*backtrace:列印指定個數的棧幀(stack frame)。使用格式:

backtrace 棧幀個數

*frame:列印棧幀。使用格式:

frame 棧幀號

*info frame:顯示當前棧幀的詳細資訊。

*select-frame:選擇棧幀,選擇後可以用info frame來顯示棧幀資訊。使用格式:

select-frame 棧幀號

*kill:結束當前程式的除錯。

*quit:退出gdb。

如要檢視所有的gdb命令,可以在gdb下鍵入兩次tab(製表符),執行「help command」可以檢視命令command的詳細使用格式。

本文僅對使用gdb除錯過程中的一些常用指令的用法進行簡單地總結,如要獲取關於gdb的更詳細的資料,請參閱gdb的官方文件:

GDB偵錯程式(學習筆記)

gdb除錯流程 首先使用gcc對test.c進行編譯,注意一定要加上選項 g 例 gcc g test.c o test gdb test 1 啟動gdb start 只執行一步 n next 單步執行 s step 單步執行,可以進入函式體內部 c continue 直線停在斷點位置 2 檢視 l...

GDB偵錯程式

偵錯程式gdb 一 啟動和退出gdb gdb除錯的物件是可執行檔案,而不是程式的源 如果要使乙個可執行檔案可以被gdb除錯,那麼在使用編譯器gcc編譯程式時需要加入 g選項。gdb除錯乙個程式的命令格式是 gdb 程式檔名 也可以在linux提示符下,直接輸入gdb,然後使用file命令裝入要除錯的...

gdb偵錯程式

在使用gdb偵錯程式之前,必須在編譯程式時加上 g選項 功能 顯示上次內容之前或之後的10行內容,首次使用顯示main 函式之前或之後的10行內容 命令 list 簡稱 l 功能 顯示引數行之前和之後的10行內容.命令 list line number 簡稱 l 10 功能 顯示原始檔從一行到另一行...