1. 程式人生 > >linux中gdb的使用 Linux程式設計基礎——GDB(設定斷點)

linux中gdb的使用 Linux程式設計基礎——GDB(設定斷點)

斷點

  在程式碼的指定位置中斷,使程式在此中斷。

  • break <function>    在進入指定函式時停住
  • break <linenum>    在指定行號停住。
  • break +/-offset    在當前行號的前面或後面的offset行停住。offiset為自然數。
  • break filename:linenum    在原始檔filename的linenum行處停住。
  • break ... if <condition>    ...可以是上述的引數,condition表示條件,在條件成立時停住。比如在迴圈境體中,可以設定break if i=100,表示當i為100時停住程式。

  案例:

(gdb) break sc_smartcontract_handler.cpp:45
Breakpoint 4 at 0x424d42: file sc_smartcontract_handler.cpp, line 45.

  對斷點的相關操作

  • delete    刪除所有斷點
  • delete breakpoint [n]    刪除某個斷點
  • disable breakpoint [n]    禁用某個斷點
  • enable breakpoint [n]    使能某個斷點
  • info breakpoints  [n] 檢視當前斷點資訊

觀察點

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

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

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

 可以通過info watchpoints [n]命令檢視當前觀察點資訊

檢視變數

 最常用的檢視變數的方法是

  (gdb) print {變數名}

(gdb) print argc
$1 = 1

 如果列印陣列,由於預設的設定,可能列印的陣列尾部部分沒有顯示,可以通過如下的命令設定列印陣列的最大長度

  (gdb) set print elements 300

除錯中檢視程式碼

  • list function   如list main:顯示main函式附近的程式碼
  • list file:function   如list main.c:main:顯示main.c中的main函式附近的程式碼
  • list n1,n2   如list 10,20,顯示當前檔案的10到20行

雖然list已經很方便了, 但還是不盡人意. 如果能夠在執行的同時顯示程式碼就好了, 答案是肯定的.

使用如下命令啟動gdb: gdb -tui 專案名 或者在啟動gdb後, 輸入命令focus,如圖:

恢復程式執行和單步除錯

在gdb中,和除錯步進相關的命令主要有如下幾條:

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

在特定執行緒中中斷

你可以定義你的斷點是否在所有的執行緒上,或是在某個特定的執行緒。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停住時,所有的執行執行緒都會被停住。這方便你你檢視執行程式的總體情況。而在你恢復程式執行時,所有的執行緒也會被恢復執行。那怕是主程序在被單步除錯時。

 

參考部落格

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