常用 GDB 命令中文速覽

Fsf發表於2017-09-24

目錄

  • break -- 在指定的行或函式處設定斷點,縮寫為 b
  • info breakpoints -- 列印未刪除的所有斷點,觀察點和捕獲點的列表,縮寫為 i b
  • disable -- 禁用斷點,縮寫為 dis
  • enable -- 啟用斷點
  • clear -- 清除指定行或函式處的斷點
  • delete -- 刪除斷點,縮寫為 d
  • tbreak -- 設定臨時斷點,引數同 break,但在程式第一次停住後會被自動刪除
  • watch -- 為表示式(或變數)設定觀察點,當表示式(或變數)的值有變化時,暫停程式執行
  • step -- 單步跟蹤,如果有函式呼叫,會進入該函式,縮寫為 s
  • reverse-step -- 反向單步跟蹤,如果有函式呼叫,會進入該函式
  • next -- 單步跟蹤,如果有函式呼叫,不會進入該函式,縮寫為 n
  • reverse-next -- 反向單步跟蹤,如果有函式呼叫,不會進入該函式
  • return -- 使選定的棧幀返回到其呼叫者
  • finish -- 執行直到選擇的棧幀返回,縮寫為 fin
  • until -- 執行直到達到當前棧幀中當前行後的某一行(用於跳過迴圈、遞迴函式呼叫),縮寫為 u
  • continue -- 恢復程式執行,縮寫為 c
  • print -- 列印表示式 EXP 的值,縮寫為 p
  • x -- 檢視記憶體
  • display -- 每次程式停止時列印表示式 EXP 的值(自動顯示)
  • info display -- 列印早先設定為自動顯示的表示式列表
  • disable display -- 禁用自動顯示
  • enable display -- 啟用自動顯示
  • undisplay -- 刪除自動顯示項
  • help -- 列印命令列表(帶引數時查詢命令的幫助),縮寫為 h
  • attach -- 掛接到已在執行的程序來除錯
  • run -- 啟動被除錯的程式,縮寫為 r
  • backtrace -- 檢視程式呼叫棧的資訊,縮寫為 bt
  • ptype -- 列印型別 TYPE 的定義

break

使用 break 命令(縮寫 b)來設定斷點。

用法:

  • break 當不帶引數時,在所選棧幀中執行的下一條指令處設定斷點。
  • break <function-name> 在函式體入口處打斷點,在 C++ 中可以使用 class::functionfunction(type, ...) 格式來指定函式名。
  • break <line-number> 在當前原始碼檔案指定行的開始處打斷點。
  • break -N break +N 在當前原始碼行前面或後面的 N 行開始處打斷點,N 為正整數。
  • break <filename:linenum> 在原始碼檔案 filenamelinenum 行處打斷點。
  • break <filename:function> 在原始碼檔案 filenamefunction 函式入口處打斷點。
  • break <address> 在程式指令的地址處打斷點。
  • break ... if <cond> 設定條件斷點,... 代表上述引數之一(或無引數),cond 為條件表示式,僅在 cond 值非零時暫停程式執行。

詳見官方文件

info breakpoints

檢視斷點,觀察點和捕獲點的列表。

用法:

  • info breakpoints [list...]
  • info break [list...]
  • list... 用來指定若干個斷點的編號(可省略),可以是 21-32 5 等。

disable

禁用一些斷點。引數是用空格分隔的斷點編號。要禁用所有斷點,不加引數。

禁用的斷點不會被忘記,但直到重新啟用才有效。

用法:

  • disable [breakpoints] [list...]
  • breakpointsdisable 的子命令(可省略),list...info breakpoints 中的描述。

詳見官方文件

enable

啟用一些斷點。給出斷點編號(以空格分隔)作為引數。沒有引數時,所有斷點被啟用。

用法:

  • enable [breakpoints] [list...] 啟用指定的斷點(或所有定義的斷點)。
  • enable [breakpoints] once list... 臨時啟用指定的斷點。GDB 在停止您的程式後立即禁用這些斷點。
  • enable [breakpoints] delete list... 使指定的斷點啟用一次,然後刪除。一旦您的程式停止,GDB 就會刪除這些斷點。等效於用 tbreak 設定的斷點。

breakpointsdisable 中的描述。

詳見官方文件

clear

在指定行或函式處清除斷點。引數可以是行號,函式名稱或 * 跟一個地址。

用法:

  • clear 當不帶引數時,清除所選棧幀在執行的原始碼行中的所有斷點。
  • clear <function>, clear <filename:function> 刪除在命名函式的入口處設定的任何斷點。
  • clear <linenum>, clear <filename:linenum> 刪除在指定的檔案指定的行號的程式碼中設定的任何斷點。
  • clear <address> 清除指定程式指令的地址處的斷點。

詳見官方文件

delete

刪除一些斷點或自動顯示錶達式。引數是用空格分隔的斷點編號。要刪除所有斷點,不加引數。

用法: delete [breakpoints] [list...]

詳見官方文件

tbreak

設定臨時斷點。引數形式同 break 一樣。

除了斷點是臨時的之外,其他同 break 一樣,所以在命中時會被刪除。

詳見官方文件

watch

為表示式設定觀察點。

用法: watch [-l|-location] <expr> 每當一個表示式的值改變時,觀察點就會暫停程式執行。

如果給出了 -l 或者 -location,則它會對 expr 求值並觀察它所指向的記憶體。例如,watch *(int *)0x12345678 將在指定的地址處觀察一個 4 位元組的區域(假設 int 佔用 4 個位元組)。

詳見官方文件

step

單步執行程式,直到到達不同的原始碼行。

用法: step [N] 引數 N 表示執行 N 次(或由於另一個原因直到程式停止)。

警告:如果當控制在沒有除錯資訊的情況下編譯的函式中使用 step 命令,則執行將繼續進行,直到控制到達具有除錯資訊的函式。 同樣,它不會進入沒有除錯資訊編譯的函式。

要執行沒有除錯資訊的函式,請使用 stepi 命令,詳見後文。

詳見官方文件

reverse-step

反向單步執行程式,直到到達另一個原始碼行的開頭。

用法: reverse-step [N] 引數 N 表示執行 N 次(或由於另一個原因直到程式停止)。

詳見官方文件

next

單步執行程式,執行完子程式呼叫。

用法: next [N]

step 不同,如果當前的原始碼行呼叫子程式,則此命令不會進入子程式,而是將其視為單個原始碼行,繼續執行。

詳見官方文件

reverse-next

反向步程序序,執行完子程式呼叫。

用法: reverse-next [N]

如果要執行的原始碼行呼叫子程式,則此命令不會進入子程式,呼叫被視為一個指令。

引數 N 表示執行 N 次(或由於另一個原因直到程式停止)。

詳見官方文件

return

您可以使用 return 命令取消函式呼叫的執行。如果你給出一個表示式引數,它的值被用作函式的返回值。

用法: return <expression>expression 的值作為函式的返回值並使函式直接返回。

詳見官方文件

finish

執行直到選定的棧幀返回。

用法: finish 返回後,返回的值將被列印並放入到值歷史記錄中。

詳見官方文件

until

執行直到程式到達當前棧幀中當前行之後(與 break 命令相同的引數)的原始碼行。此命令用於透過一個多次的迴圈,以避免單步執行。

用法:until <location>u <location> 繼續執行程式,直到達到指定的位置,或者當前棧幀返回。

詳見官方文件

continue

在訊號或斷點之後,繼續執行被除錯的程式。

用法: continue [N] 如果從斷點開始,可以使用數字 N 作為引數,這意味著將該斷點的忽略計數設定為 N - 1(以便斷點在第 N 次到達之前不會中斷)。如果啟用了非停止模式(使用 show non-stop 檢視),則僅繼續當前執行緒,否則程式中的所有執行緒都將繼續。

詳見官方文件

print

求值並列印表示式 EXP 的值。可訪問的變數是所選棧幀的詞法環境,以及範圍為全域性或整個檔案的所有變數。

用法:

  • print [expr]print /f [expr] expr 是一個(在原始碼語言中的)表示式。

預設情況下,expr 的值以適合其資料型別的格式列印;您可以透過指定 /f 來選擇不同的格式,其中 f 是一個指定格式的字母;詳見輸出格式

如果省略 expr,GDB 再次顯示最後一個值。

要以每行一個成員帶縮排的格式列印結構體變數請使用命令 set print pretty on,取消則使用命令 set print pretty off

可使用命令 show print 檢視所有列印的設定。

詳見官方文件

x

檢查記憶體。

用法: x/nfu <addr>x <addr> nfu 都是可選引數,用於指定要顯示的記憶體以及如何格式化。addr 是要開始顯示記憶體的地址的表示式。

n 重複次數(預設值是 1),指定要顯示多少個單位(由 u 指定)的記憶體值。

f 顯示格式(初始預設值是 x),顯示格式是 print('x','d','u','o','t','a','c','f','s') 使用的格式之一,再加 i(機器指令)。

u 單位大小,b 表示單位元組,h 表示雙位元組,w 表示四位元組,g 表示八位元組。

例如:

x/3uh 0x54320 表示從地址 0x54320 開始以無符號十進位制整數的格式,雙位元組為單位來顯示 3 個記憶體值。

x/16xb 0x7f95b7d18870 表示從地址 0x7f95b7d18870 開始以十六進位制整數的格式,單位元組為單位顯示 16 個記憶體值。

詳見官方文件

display

每次程式暫停時,列印表示式 EXP 的值。

用法: display <expr>, display/fmt <expr>display/fmt <addr> fmt 用於指定顯示格式。像 print 命令裡的 /f 一樣。

對於格式 is,或者包括單位大小或單位數量,將表示式 addr 新增為每次程式停止時要檢查的記憶體地址。

詳見官方文件

info display

列印自動顯示的表示式列表,每個表示式都帶有專案編號,但不顯示其值。

包括被禁用的表示式和不能立即顯示的表示式(當前不可用的自動變數)。

undisplay

取消某些表示式在程式暫停時的自動顯示。引數是表示式的編號(使用 info display 查詢編號)。不帶參數列示取消所有自動顯示錶達式。

delete display 具有與此命令相同的效果。

disable display

禁用某些表示式在程式暫停時的自動顯示。禁用的顯示專案不會被自動列印,但不會被忘記。 它可能稍後再次被啟用。

引數是表示式的編號(使用 info display 查詢編號)。不帶參數列示禁用所有自動顯示錶達式。

enable display

啟用某些表示式在程式暫停時的自動顯示。

引數是重新顯示的表示式的編號(使用 info display 查詢編號)。不帶參數列示啟用所有自動顯示錶達式。

help

列印命令列表。

您可以使用不帶引數的 help(縮寫為 h)來顯示命令的類別名的簡短列表。

使用 help <class> 您可以獲取該類中的各個命令的列表。使用 help <command> 顯示如何使用該命令。

詳見官方文件

attach

掛接到 GDB 之外的程序或檔案。該命令可以將程序 ID 或裝置檔案作為引數。

對於程序 ID,您必須具有向程序傳送訊號的許可權,並且必須具有與偵錯程式相同的有效的 uid。

用法: attach <process-id> GDB 在安排除錯指定的程序之後做的第一件事是暫停該程序。

無論是透過 attach 命令掛接的程序還是透過 run 命令啟動的程序,您都可以使用的 GDB 命令來檢查和修改掛接的程序。

詳見官方文件

run

啟動被除錯的程式。

可以直接指定引數,也可以用 set args 設定(啟動所需的)引數。

例如: run arg1 arg2 ... 等效於

set args arg1 arg2 ...
run

還允許使用 ><>> 進行輸入和輸出重定向。

詳見官方文件

backtrace

列印整體棧幀資訊。

  • bt 列印整體棧幀資訊,每個棧幀一行。
  • bt n 類似於上,但只列印最內層的 n 個棧幀。
  • bt -n 類似於上,但只列印最外層的 n 個棧幀。
  • bt full n 類似於 bt n,還列印區域性變數的值。

whereinfo stack(縮寫 info s) 是 backtrace 的別名。呼叫棧資訊類似如下:

(gdb) where
#0  vconn_stream_run (vconn=0x99e5e38) at lib/vconn-stream.c:232
#1  0x080ed68a in vconn_run (vconn=0x99e5e38) at lib/vconn.c:276
#2  0x080dc6c8 in rconn_run (rc=0x99dbbe0) at lib/rconn.c:513
#3  0x08077b83 in ofconn_run (ofconn=0x99e8070, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:1234
#4  0x08075f92 in connmgr_run (mgr=0x99dc878, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:286
#5  0x08057d58 in ofproto_run (p=0x99d9ba0) at ofproto/ofproto.c:1159
#6  0x0804f96b in bridge_run () at vswitchd/bridge.c:2248
#7  0x08054168 in main (argc=4, argv=0xbf8333e4) at vswitchd/ovs-vswitchd.c:125

詳見官方文件

ptype

列印型別 TYPE 的定義。

用法: ptype[/FLAGS] TYPE-NAME | EXPRESSION

引數可以是由 typedef 定義的型別名, 或者 struct STRUCT-TAG 或者 class CLASS-NAME 或者 union UNION-TAG 或者 enum ENUM-TAG

根據所選的棧幀的詞法上下文來查詢該名字。

類似的命令是 whatis,區別在於 whatis 不展開由 typedef 定義的資料型別,而 ptype 會展開,舉例如下:

/* 型別宣告與變數定義 */
typedef double real_t;
struct complex {
    real_t real;
    double imag;
};
typedef struct complex complex_t;

complex_t var;
real_t *real_pointer_var;

這兩個命令給出瞭如下輸出:

(gdb) whatis var
type = complex_t
(gdb) ptype var
type = struct complex {
    real_t real;
    double imag;
}
(gdb) whatis complex_t
type = struct complex
(gdb) whatis struct complex
type = struct complex
(gdb) ptype struct complex
type = struct complex {
    real_t real;
    double imag;
}
(gdb) whatis real_pointer_var
type = real_t *
(gdb) ptype real_pointer_var
type = double *

詳見官方文件


參考資料

  • Debugging with GDB

譯者:robot527 校對:mudongliangwxy

常用 GDB 命令中文速覽

相關文章