linux中gdb的使用

斷點

  在代碼的指定位置中斷,使程序在此中斷。javascript

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

  案例:html

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

  對斷點的相關操做java

  • 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]命令查看當前觀察點信息函數

查看變量

 最經常使用的查看變量的方法是post

  (gdb) print {變量名}ui

(gdb) print argc
$1 = 1

 若是打印數組,因爲默認的設置,可能打印的數組尾部部分沒有顯示,能夠經過以下的命令設置打印數組的最大長度url

  (gdb) set print elements 300spa

調試中查看代碼

  • 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)
  • step        逐語句步進,會進入子函數(相似VS裏的F11)
  • until        運行至當前語句塊結束
  • finish    運行至函數結束並跳出,並打印函數的返回值(相似VS的Shift+F11)

GDB backtrace bt 查看程序crash堆棧信息

  當程序被停住了,你須要作的第一件事就是查看程序是在哪裏停住的。當你的程序調用了一個函數,函數的地址,函數參數,函數內的局部變量都會被壓入「棧」(Stack)中。你能夠用bt命令來查看當前的棧中的信息。

在特定線程中中斷

你能夠定義你的斷點是否在全部的線程上,或是在某個特定的線程。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停住時,全部的運行線程都會被停住。這方便你你查看運行程序的整體狀況。而在你恢復程序運行時,全部的線程也會被恢復運行。那怕是主進程在被單步調試時。

其餘

查看當前程序棧的內容: x/10x $sp-->打印stack的前10個元素
查看當前程序棧的信息: info frame----list general info about the frame
查看當前程序棧的參數: info args---lists arguments to the function
查看當前程序棧的局部變量: info locals---list variables stored in the frame
查看當前寄存器的值:info registers(不包括浮點寄存器) info all-registers(包括浮點寄存器)
查看當前棧幀中的異常處理器:info catch(exception handlers)

 

參考博客

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

相關文章
相關標籤/搜索