GDB的基本用法

2021-06-13 16:17:10 字數 2227 閱讀 7978

本文參考《debug hacks》一書所作 —— 每天進步一點點。

一. 準備

通過 gcc 的 -g 選項生成除錯資訊。

$ gcc -wall -o2 -g 原始檔

-g選項可以使用僅可gdb使用的一些附加除錯資訊;這些附加資訊可以使gdb工作的更好,但是也可能令其他偵錯程式崩潰或者不能讀該檔案。

二. gdb基本用法

啟動:$ gdb 可執行檔名

設定斷點:

(gdb) break 斷點 

程式執行後,到達斷點就會自動暫停執行。此時就可以檢視該時刻的變數值,顯示棧針,重新設定斷點或者重新執行等。

斷點可以通過函式名,檔案內的行號來設定,也可以先指定檔名再指定行號,還可以指定與暫停位置的偏移量,或者用位址來設定。

(gdb) break 函式名

(gdb) break 行號

(gdb) break 檔名:行號

(gdb) break 檔名:函式名

(gdb) break +偏移量

(gdb) break -偏移量

(gdb) break *位址

在設定斷點的時候,如果不指定斷點位置,就在下一行**上設定斷點。     

條件斷點

(gdb) break 斷點 if 條件

僅在特定條件下中斷。對於已存在的斷點,可使用condition為其新增條件。

(gdb) break 斷點編號 條件

而刪除指定編號斷點的觸發條件同樣使用condition。

(gdb) condition 斷點編號

查詢斷點

(gdb) info break

監視點要想找到變數在何處被改變,可以使用 watch 命令(監視點, watchpoint)。

(gdb) watch 《表示式》

《表示式》發生變化時暫停執行。《表示式》的意思是常量或變數等。

(gdb) awatch 《表示式》

《表示式》被訪問、改變時暫停執行。

(gdb) rwatch 《表示式》

《表示式》被訪問時暫停執行。

刪除斷點和監視點

用 delete 命令刪除斷點和監視點。

(gdb) delete 《編號》

執行(gdb) run 引數

用 run 命令開始執行。執行run,就會執行到設定了斷點的位置後暫停執行。

經常用到的乙個操作是在main()上設定斷點,然後執行到main()函式暫停。按照上面的內容,操作命令有:

(gdb) break main

(gdb) run

對於執行到 main() 函式暫停的操作,我們可以使用 start 命令達到同樣的效果。

(gdb) start

顯示棧幀

backtrace 命令可以在遇到斷點而暫停執行時顯示棧幀。此外,backtrace 的別名還有 where 和 info stack。

(gdb) backtrace

顯示所有棧幀。

(gdb) backtrace n

只顯示開頭 n 個棧幀。

(gdb) backtrace -n

只顯示最後 n 個棧幀。

(gdb) backtrace full

(gdb) backtrace full n

(gdb) backtrace full -n

不僅顯示backtrace,還有顯示區域性變數。

顯示棧幀之後,就可以看出程式在何處停止(即斷點的位置),以及程式的呼叫路徑。

顯示變數

print 命令可以顯示變數。

(gdb) print 變數

顯示暫存器

info registers可以顯示暫存器。

(gdb) info registers

單步執行

單步執行的意思是根據源**一行一行地執行。

執行源**中一行的命令為 next 。執行時如果遇到函式呼叫,可能想執行到函式內部,此時可以使用 step 命令。

next 命令和 step 命令都是執行源**中的一行。如果要逐條執行彙編指令,可以分別使用 nexti 和 stepi 命令。

繼續執行

除錯時,可以使用 continue 命令繼續執行程式。程式會在遇到斷點後再次暫停執行。如果沒有遇到斷點,就會一直執行到結束。

(gdb) continue

(gdb) continue 次數

指定次數可以忽略斷點。例如, continue 5 則 5 次遇到斷點不停止,第 6 次遇到斷點時才暫停執行。

GDB 基本用法

在原來的的選項上再加上 g 選項,如 gcc g wall o2 o test test.c 或者 gcc g o test test.c。有一點需要注意的是除錯時最好去掉優化選項,比如內聯 inline 函式 優化 去掉函式呼叫,而將函式 在呼叫的位置展開 該函式名上就無法設定斷點。這是因為內聯函...

GDB基本用法

相關 gdb的使用 當程式出錯並產生core 時 快速定位出錯函式的辦法 gdb 程式名 core檔名 一般是core,也可能是core.x 除錯程式使用的鍵 r run 執行.程式還沒有執行前使用 c cuntinue 繼續執行。執行中斷後繼續執行 q 退出 kill 終止除錯的程式 h help...

gdb 基本用法小結

1.當程式出錯並產生core 時快速定位出錯函式的辦法 gdb 程式名 core檔名 一般是core,也可能是core.x 2.除錯程式使用的鍵 rrun 執行.程式還沒有執行前使用 c cuntinue 執行到下一斷點處 qquit 退出tab tab命令補全功能 h help幫助s step 跟...