[轉]經常使用 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)來設置斷點。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

info breakpoints

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

用法:express

  • info breakpoints [list...]
  • info break [list...]
  • list... 用來指定若干個斷點的編號(可省略),能夠是 2, 1-3, 2 5 等。

disable

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

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

用法:spa

  • 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> nf 和 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 ... 等效於

  1. set args arg1 arg2 ...
  2. run

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

詳見官方文檔

backtrace

打印總體棧幀信息。

  • bt 打印總體棧幀信息,每一個棧幀一行。
  • bt n 相似於上,但只打印最內層的 n 個棧幀。
  • bt -n 相似於上,但只打印最外層的 n 個棧幀。
  • bt full n 相似於 bt n,還打印局部變量的值。

where 和 info stack(縮寫 info s) 是 backtrace 的別名。調用棧信息相似以下:

  1. (gdb) where
  2. #0 vconn_stream_run (vconn=0x99e5e38) at lib/vconn-stream.c:232
  3. #1 0x080ed68a in vconn_run (vconn=0x99e5e38) at lib/vconn.c:276
  4. #2 0x080dc6c8 in rconn_run (rc=0x99dbbe0) at lib/rconn.c:513
  5. #3 0x08077b83 in ofconn_run (ofconn=0x99e8070, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:1234
  6. #4 0x08075f92 in connmgr_run (mgr=0x99dc878, handle_openflow=0x805e274 <handle_openflow>) at ofproto/connmgr.c:286
  7. #5 0x08057d58 in ofproto_run (p=0x99d9ba0) at ofproto/ofproto.c:1159
  8. #6 0x0804f96b in bridge_run () at vswitchd/bridge.c:2248
  9. #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 會展開,舉例以下:

  1. /* 類型聲明與變量定義 */
  2. typedef double real_t;
  3. struct complex {
  4. real_t real;
  5. double imag;
  6. };
  7. typedef struct complex complex_t;
  8. complex_t var;
  9. real_t *real_pointer_var;

這兩個命令給出了以下輸出:

  1. (gdb) whatis var
  2. type = complex_t
  3. (gdb) ptype var
  4. type = struct complex {
  5. real_t real;
  6. double imag;
  7. }
  8. (gdb) whatis complex_t
  9. type = struct complex
  10. (gdb) whatis struct complex
  11. type = struct complex
  12. (gdb) ptype struct complex
  13. type = struct complex {
  14. real_t real;
  15. double imag;
  16. }
  17. (gdb) whatis real_pointer_var
  18. type = real_t *
  19. (gdb) ptype real_pointer_var
  20. type = double *

詳見官方文檔


參考資料


譯者:robot527 校對:mudongliang, wxy

編譯自:https://sourceware.org/gdb/current/onlinedocs/gdb/做者: Fsf
原創:LCTT https://linux.cn/article-8900-1.html譯者: robot527

轉載自:https://linux.cn/article-8900-1.html

相關文章
相關標籤/搜索