This page looks best with JavaScript enabled

[Note] 寫C時,好用的debug tool - GDB

 ·  ☕ 2 min read  ·  ✍️ Peter

寫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,一步步檢查程式碼。

![gdb](/content/images/2016/11/Screenshot-from-2016-11-17-22-49-53.png)