1. 程式人生 > >常用 GDB 命令中文速覽

常用 GDB 命令中文速覽

ext mar 如果 記錄 flow struct return play 進行

轉自:https://linux.cn/article-8900-1.html?utm_source=index&utm_medium=moremore

目錄

  • 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> 在源碼文件 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

常用 GDB 命令中文速覽