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

來源:互聯網
上載者:User

啟動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]命令查看當前觀察點資訊

捕捉點(CatchPoint):

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

捕捉點的命令格式是:catch <event>,event可以是下面的內容

  • 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:這些命令大部分可以簡寫為第一個字母,在日常使用過程中,往往只會輸入第一個字元即可執行該命令,我標紅的即是通常的使用方式。這幾條命令使用非常頻繁,並且可以帶一些附加參數以實現進階功能,需要熟練掌握。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.