寫C的時候,發生錯誤或結果不如預期,最常用的debug方式是在程式碼的不同區塊安插print,檢查執行時,各階段的程式狀態正確與否。但是當遇到segmentation fault導致程式結束,或是bug需要反覆執行才會出現時,這種方法就不可行。
GDB是一種debugger tool,能夠測試程式執行到某個階段時的狀態,甚至檢查程式碼一行一行的執行。gcc編譯程式碼前要加==-g== flag,開啟debug選項。首先用gdb執行檔案 $ gdb ./exec
,這時會進到gdb的interface,目前用過的指令有 ($
代表command line prompt)
-
$ b file:line
:設置breakpoints(中斷點),可以指定檔案及行號,當程式執行到此處會暫停。如果沒有設,那程式就會一路執行到結束。 -
$ d breaknum
:移除某個breakpoint,可以用info b
看到中斷點資訊 -
$ run [params]
:執行程式,如果有參數直接接在後面 -
$ c
:continue,繼續執行,直到下一個中斷點 -
$ bt [full]
:back-trace,印出目前program stack狀態,會是一層一層的function call,加full能印出local變數 -
print var
: 查看暫停當下某變數的value,可以是global的變數 -
$ step
:處於中斷時,執行下一行程式碼,如果遇到function(一個frame),則會進去一行一行執行 -
$ next
:處於中斷時,執行下一行程式碼,如果遇到function,則跳過,直接執行完 -
$ up
:返回stack的上一層
由於breakpoint能在程式還沒run以前或是處於暫停狀態的時候設置,所以當我們猜測下一個中斷點前錯誤會發生,可以再此次中斷另外設置其他breakpoints。再step或next,一步步檢查程式碼。