常用的GDB命令

目錄


  • 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::function 或 function(type, ...) 格式來指定函數名。

  • break <line-number> 在當前源碼文件指定行的開始處打斷點。

  • break -N break +N 在當前源碼行前面或後面的 N 行開始處打斷點,N 爲正整數。

  • break <filename:linenum>  在源碼文件 filename 的 linenum 行處打斷點。

  • break <filename:function>  在源碼文件 filename 的 function 函數入口處打斷點。

  • break <address> 在程序指令的地址處打斷點。

  • break ... if <cond>  設置條件斷點,... 代表上述參數之一(或無參數),cond爲條件表達式,僅在 cond 值非零時暫停程序執行。


info breakpoints


查看斷點,觀察點和捕獲點的列表。


用法:


  • info breakpoints [list...]

  • info break [list...]

  • list... 用來指定若干個斷點的編號(可省略),可以是 2, 1-3, 2 5 等。


disable


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

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


用法:


  • disable [breakpoints] [list...]

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


enable


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


用法:


  • enable [breakpoints] [list...] 啓用指定的斷點(或所有定義的斷點)。

  • enable [breakpoints] once list... 臨時啓用指定的斷點。GDB 在停止您的程序後立即禁用這些斷點。

  • enable [breakpoints] delete list... 使指定的斷點啓用一次,然後刪除。一旦您的程序停止,GDB 就會刪除這些斷點。等效於用 tbreak 設置的斷點。


breakpoints 同 disable 中的描述。


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> n、f 和 u 都是可選參數,用於指定要顯示的內存以及如何格式化。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 一樣。


對於格式 i 或 s,或者包括單位大小或單位數量,將表達式 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,還打印局部變量的值。


where 和 info 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 *

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章