Linux編程基礎——GDB(設置斷點)

啓動GDB後,首先就是要設置斷點,程序中斷後才能調試。在gdb中,斷點一般有三種形式:函數

斷點(BreakPoint):操作系統

在代碼的指定位置中斷,這個是咱們用得最多的一種。設置斷點的命令是break,它一般有以下方式:線程

  • break <function>    在進入指定函數時停住
  • break <linenum>    在指定行號停住。
  • break +/-offset    在當前行號的前面或後面的offset行停住。offiset爲天然數。
  • break filename:linenum    在源文件filename的linenum行處停住。
  • break ... if <condition>    ...能夠是上述的參數,condition表示條件,在條件成立時停住。好比在循環境體中,能夠設置break if i=100,表示當i爲100時停住程序。

能夠經過info breakpoints [n]命令查看當前斷點信息。此外,還有以下幾個配套的經常使用命令:調試

  • delete    刪除全部斷點
  • delete breakpoint [n]    刪除某個斷點
  • disable breakpoint [n]    禁用某個斷點
  • enable breakpoint [n]    使能某個斷點

觀察點(WatchPoint):進程

在變量讀、寫或變化時中斷,這類方式經常使用來定位bug。事件

  • watch <expr>    變量發生變化時中斷
  • rwatch <expr>    變量被讀時中斷
  • awatch <expr>     變量值被讀或被寫時中斷

能夠經過info watchpoints [n]命令查看當前觀察點信息it

捕捉點(CatchPoint):io

捕捉點用來補捉程序運行時的一些事件。如:載入共享庫(動態連接庫)、C++的異常等。一般也是用來定位bug。event

捕捉點的命令格式是:catch <event>,event能夠是下面的內容function

  • throw     C++拋出的異常時中斷
  • catch     C++捕捉到的異常時中斷
  • exec    調用系統調用exec時(只在某些操做系統下有用)
  • fork    調用系統調用fork時(只在某些操做系統下有用)
  • vfork    調用系統調用vfork時(只在某些操做系統下有用)
  • load 或 load <libname>     載入共享庫時(只在某些操做系統下有用)
  • unload 或 unload <libname>    卸載共享庫時(只在某些操做系統下有用)

另外,還有一個tcatch <event>,功能相似,不過他只設置一次捕捉點,當程序停住之後,應點被自動刪除。

捕捉點信息的查看方式和代碼斷點的命令是同樣的,這裏就很少介紹了。

在特定線程中中斷

你能夠定義你的斷點是否在全部的線程上,或是在某個特定的線程。GDB很容易幫你完成這一工做。

  • break <linespec> thread <threadno>
  • break <linespec> thread <threadno> if ...

linespec指定了斷點設置在的源程序的行號。threadno指定了線程的ID,注意,這個ID是GDB分配的,你能夠經過"info threads"命令來查看正在運行程序中的線程信息。若是你不指定thread <threadno>則表示你的斷點設在全部線程上面。你還能夠爲某線程指定斷點條件。如:

     (gdb) break frik.c:13 thread 28 if bartab > lim

當你的程序被GDB停住時,全部的運行線程都會被停住。這方便你你查看運行程序的整體狀況。而在你恢復程序運行時,全部的線程也會被恢復運行。那怕是主進程在被單步調試時。

恢復程序運行和單步調試

在gdb中,和調試步進相關的命令主要有以下幾條:

  • continue    繼續運行程序直到下一個斷點(相似於VS裏的F5)
  • next        逐過程步進,不會進入子函數(相似VS裏的F10)
  • setp        逐語句步進,會進入子函數(相似VS裏的F11)
  • until        運行至當前語句塊結束
  • finish    運行至函數結束並跳出,並打印函數的返回值(相似VS的Shift+F11)

PS:這些命令大部分能夠簡寫爲第一個字母,在平常使用過程當中,每每只會輸入第一個字符便可執行該命令,我標紅的便是一般的使用方式。這幾條命令使用很是頻繁,而且能夠帶一些附加參數以實現高級功能,須要熟練掌握。

相關文章
相關標籤/搜索