使用gdb進行調試中級篇


  閑話少敘,經過上篇文章的鋪墊后,咱們趁熱打鐵,繼續學習。

  設置斷點

  break <function> 在進入指定函數時停住。C++中可以使用class::function或function(type,type)格式來指定函數名。

  break <linenum> 在指定行號停住。

  break filename:linenum 在源文件filename的linenum行處停住

  break filename:function 在源文件filename的function函數的入口處停住

  break *address 在程序運行的內存地址處停住

  break if i=100 表示當i為100時停住程序

  info breakpoints(info break) 查看斷點

  設置觀察點(WatchPoint)

  觀察點一般來觀察某個表達式(變量也是一種表達式)的值是否有變化了,如果有變化,馬上停住程序。我們有下面的幾種方法來設置觀察點:

  watch <expr> 為表達式(變量)expr設置一個觀察點。一量表達式值有變化時,馬上停住程序

  rwatch <expr> 當表達式(變量)expr被讀時,停住程序

  awatch <expr> 當表達式(變量)的值被讀或被寫時,停住程序

  info watchpoints 列出當前所設置了的所有觀察點

  刪除觀察點或斷點

  clear 清除所有設置在函數上的停止點

  clear <function> 清除所有設置在函數上的停止點

  delete [breakpoints] [range...] 刪除指定的斷點,breakpoints為斷點號。如果不指定斷點號,則表示刪除所有的斷點。range 表示斷點號的范圍(如:3-7)。其簡寫命令為d

  disable [breakpoints] [range...] disable所指定的停止點,breakpoints為停止點號。如果什么都不指定,表示disable所有的停止點。簡寫命令是dis.

  enable [breakpoints] [range...] enable所指定的停止點,breakpoints為停止點號。

  恢復程序運行和單步調試

  當程序被停住了,你可以用continue命令恢復程序的運行直到程序結束,或下一個斷點到來。也可以使用step或next命令單步跟蹤程序。

  continue (c)恢復程序運行,直到程序結束,或是下一個斷點到來

  step <count> 單步跟蹤,如果有函數調用,他會進入該函數.后面可以加count也可以不加,不加表示一條條地執行,加表示執行后面的count條指令,然后再停住。

  next <count> 同樣單步跟蹤,如果有函數調用,他不會進入該函數

  set step-mode on/off  打開/關閉step-mode模式,於是,在進行單步跟蹤時,程序不會因為沒有debug信息而不停住。這個參數有很利於查看機器碼

  finish 運行程序,直到當前函數完成返回。並打印函數返回時的堆棧地址和返回值及參數值等信息

  until 或 u 當你厭倦了在一個循環體內單步跟蹤時,這個命令可以運行程序直到退出循環體.

  nexti 或 ni 單步跟蹤一條機器指令!一條程序代碼有可能由數條機器指令完成,stepi和nexti可以單步執行機器指令。與之一樣有相同功能的命令是“display/i $pc” ,當運行完這個命令后,單步跟蹤會在打出程序代碼的同時打出機器指令(也就是匯編代碼)

  查看棧信息

  當程序被停住了,你需要做的第一件事就是查看程序是在哪里停住的。當你的程序調用了一個函數,函數的地址,函數參數,函數內的局部變量都會被壓入“棧”(Stack)中。你可以用GDB命令來查看當前的棧中的信息。

  backtrace 打印當前的函數調用棧的所有信息

  frame <n> 查看某一層的信息

  frame 會打印出這些信息:棧的層編號,當前的函數名,函數參數值,函數所在文件及行號,函數執行到的語句。

  info f  這個命令會打印出更為詳細的當前棧層的信息,只不過,大多數都是運行時的內內地址。

  info args 打印出當前函數的參數名及其值

  info locals  打印出當前函數中所有局部變量及其值。

  info catch 打印出當前的函數中的異常處理信息。


  以上是關於gdb的一些使用說明,都很簡單。下一次打算介紹一下如何查看運行過程中變量的值和內存地址,也就算是最常用的部分了,我姑且稱之為高級篇,希望大家不要見笑。

  注:如果希望了解更多關於gdb的知識,請看http://blog.csdn.net/haoel/article/details/2879

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM