b
i b
dis
d
break
,但在程序第一次停住後會被自動刪除s
n
fin
u
c
p
h
r
bt
使用 break
命令(縮寫 b
)來設置斷點。html
用法:linux
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
值非零時暫停程序執行。詳見官方文檔。git
查看斷點,觀察點和捕獲點的列表。github
用法:express
info breakpoints [list...]
info break [list...]
list...
用來指定若干個斷點的編號(可省略),能夠是 2
, 1-3
, 2 5
等。禁用一些斷點。參數是用空格分隔的斷點編號。要禁用全部斷點,不加參數。函數
禁用的斷點不會被忘記,但直到從新啓用纔有效。ui
用法:spa
disable [breakpoints] [list...]
breakpoints
是 disable
的子命令(可省略),list...
同 info breakpoints
中的描述。詳見官方文檔。線程
啓用一些斷點。給出斷點編號(以空格分隔)做爲參數。沒有參數時,全部斷點被啓用。調試
用法:
enable [breakpoints] [list...]
啓用指定的斷點(或全部定義的斷點)。enable [breakpoints] once list...
臨時啓用指定的斷點。GDB 在中止您的程序後當即禁用這些斷點。enable [breakpoints] delete list...
使指定的斷點啓用一次,而後刪除。一旦您的程序中止,GDB 就會刪除這些斷點。等效於用 tbreak
設置的斷點。breakpoints
同 disable
中的描述。
詳見官方文檔。
在指定行或函數處清除斷點。參數能夠是行號,函數名稱或 *
跟一個地址。
用法:
clear
當不帶參數時,清除所選棧幀在執行的源碼行中的全部斷點。clear <function>
, clear <filename:function>
刪除在命名函數的入口處設置的任何斷點。clear <linenum>
, clear <filename:linenum>
刪除在指定的文件指定的行號的代碼中設置的任何斷點。clear <address>
清除指定程序指令的地址處的斷點。詳見官方文檔。
刪除一些斷點或自動顯示錶達式。參數是用空格分隔的斷點編號。要刪除全部斷點,不加參數。
用法: delete [breakpoints] [list...]
詳見官方文檔。
設置臨時斷點。參數形式同 break
同樣。
除了斷點是臨時的以外,其餘同 break
同樣,因此在命中時會被刪除。
詳見官方文檔。
爲表達式設置觀察點。
用法: watch [-l|-location] <expr>
每當一個表達式的值改變時,觀察點就會暫停程序執行。
若是給出了 -l
或者 -location
,則它會對 expr
求值並觀察它所指向的內存。例如,watch *(int *)0x12345678
將在指定的地址處觀察一個 4 字節的區域(假設 int 佔用 4 個字節)。
詳見官方文檔。
單步執行程序,直到到達不一樣的源碼行。
用法: step [N]
參數 N
表示執行 N 次(或因爲另外一個緣由直到程序中止)。
警告:若是當控制在沒有調試信息的狀況下編譯的函數中使用 step
命令,則執行將繼續進行,直到控制到達具備調試信息的函數。 一樣,它不會進入沒有調試信息編譯的函數。
要執行沒有調試信息的函數,請使用 stepi
命令,詳見後文。
詳見官方文檔。
反向單步執行程序,直到到達另外一個源碼行的開頭。
用法: reverse-step [N]
參數 N
表示執行 N 次(或因爲另外一個緣由直到程序中止)。
詳見官方文檔。
單步執行程序,執行完子程序調用。
用法: next [N]
與 step
不一樣,若是當前的源代碼行調用子程序,則此命令不會進入子程序,而是將其視爲單個源代碼行,繼續執行。
詳見官方文檔。
反向步進程序,執行完子程序調用。
用法: reverse-next [N]
若是要執行的源代碼行調用子程序,則此命令不會進入子程序,調用被視爲一個指令。
參數 N
表示執行 N 次(或因爲另外一個緣由直到程序中止)。
詳見官方文檔。
您可使用 return
命令取消函數調用的執行。若是你給出一個表達式參數,它的值被用做函數的返回值。
用法: return <expression>
將 expression
的值做爲函數的返回值並使函數直接返回。
詳見官方文檔。
執行直到選定的棧幀返回。
用法: finish
返回後,返回的值將被打印並放入到值歷史記錄中。
詳見官方文檔。
執行直到程序到達當前棧幀中當前行以後(與 break 命令相同的參數)的源碼行。此命令用於經過一個屢次的循環,以免單步執行。
用法:until <location>
或 u <location>
繼續運行程序,直到達到指定的位置,或者當前棧幀返回。
詳見官方文檔。
在信號或斷點以後,繼續運行被調試的程序。
用法: continue [N]
若是從斷點開始,可使用數字 N
做爲參數,這意味着將該斷點的忽略計數設置爲 N - 1
(以便斷點在第 N 次到達以前不會中斷)。若是啓用了非中止模式(使用 show non-stop
查看),則僅繼續當前線程,不然程序中的全部線程都將繼續。
詳見官方文檔。
求值並打印表達式 EXP 的值。可訪問的變量是所選棧幀的詞法環境,以及範圍爲全局或整個文件的全部變量。
用法:
print [expr]
或 print /f [expr]
expr
是一個(在源代碼語言中的)表達式。默認狀況下,expr
的值以適合其數據類型的格式打印;您能夠經過指定 /f
來選擇不一樣的格式,其中 f
是一個指定格式的字母;詳見輸出格式。
若是省略 expr
,GDB 再次顯示最後一個值。
要以每行一個成員帶縮進的格式打印結構體變量請使用命令 set print pretty on
,取消則使用命令 set print pretty off
。
可以使用命令 show print
查看全部打印的設置。
詳見官方文檔。
檢查內存。
用法: 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 個內存值。
詳見官方文檔。
每次程序暫停時,打印表達式 EXP 的值。
用法: display <expr>
, display/fmt <expr>
或 display/fmt <addr>
fmt
用於指定顯示格式。像 print 命令裏的 /f
同樣。
對於格式 i
或 s
,或者包括單位大小或單位數量,將表達式 addr
添加爲每次程序中止時要檢查的內存地址。
詳見官方文檔。
打印自動顯示的表達式列表,每一個表達式都帶有項目編號,但不顯示其值。
包括被禁用的表達式和不能當即顯示的表達式(當前不可用的自動變量)。
取消某些表達式在程序暫停時的自動顯示。參數是表達式的編號(使用 info display
查詢編號)。不帶參數表示取消全部自動顯示錶達式。
delete display
具備與此命令相同的效果。
禁用某些表達式在程序暫停時的自動顯示。禁用的顯示項目不會被自動打印,但不會被忘記。 它可能稍後再次被啓用。
參數是表達式的編號(使用 info display
查詢編號)。不帶參數表示禁用全部自動顯示錶達式。
啓用某些表達式在程序暫停時的自動顯示。
參數是從新顯示的表達式的編號(使用 info display
查詢編號)。不帶參數表示啓用全部自動顯示錶達式。
打印命令列表。
您可使用不帶參數的 help
(縮寫爲 h
)來顯示命令的類別名的簡短列表。
使用 help <class>
您能夠獲取該類中的各個命令的列表。使用 help <command>
顯示如何使用該命令。
詳見官方文檔。
掛接到 GDB 以外的進程或文件。該命令能夠將進程 ID 或設備文件做爲參數。
對於進程 ID,您必須具備向進程發送信號的權限,而且必須具備與調試器相同的有效的 uid。
用法: attach <process-id>
GDB 在安排調試指定的進程以後作的第一件事是暫停該進程。
不管是經過 attach
命令掛接的進程仍是經過 run
命令啓動的進程,您均可以使用的 GDB 命令來檢查和修改掛接的進程。
詳見官方文檔。
啓動被調試的程序。
能夠直接指定參數,也能夠用 set args 設置(啓動所需的)參數。
例如: run arg1 arg2 ...
等效於
set args arg1 arg2 ...
run
還容許使用 >
、 <
或 >>
進行輸入和輸出重定向。
詳見官方文檔。
打印總體棧幀信息。
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
詳見官方文檔。
打印類型 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 *
詳見官方文檔。
譯者:robot527 校對:mudongliang, wxy
編譯自:https://sourceware.org/gdb/current/onlinedocs/gdb/做者: Fsf
原創:LCTT https://linux.cn/article-8900-1.html譯者: robot527