軟件調試工具——GDB

一、GDB調試器概述程序員

  GDB是GNU開源組織發佈的一個強大的程序調試工具,具備查看程序運行狀態、設置斷點、查看錶達式、顯示變量等衆多功能,是程序員進行Linux編程必需要掌握的一種調試技術。正則表達式

  GDB調試工具的優點主要包含如下5個方面:express

  (1)用戶能夠在程序運行過程當中查看運行的狀態;編程

  (2)用戶能夠在程序中任何須要的地方設置斷點,並暫停程序的執行;函數

  (3)當程序暫停時,用戶能夠隨時查看程序中各表達式、變量值以及內存值;工具

  (4)程序暫停時用戶能夠進行單步調試,依此檢查程序每步運行的結果是否跟預測值一致,而且能夠檢查每步出現的錯誤;優化

  (5)用戶能夠改變程序中的變量或者執行順序,來驗證程序是否正確。ui

  並非任何程序均可以使用GDB進行調試,要使用GDB進行調試必須知足兩個條件:spa

  (1)程序必須使用GCC進行編譯,而且在編譯過程當中添加「-g」調試信息選項。命令行

  (2)要調試的可執行文件必須存在源程序代碼,通常源程序代碼存放的目錄須要與可執行文件的目錄相同。

  以上兩個條件缺一不可,若是不添加-g選項,GDB將不能獲取調試信息;若是缺乏源程序代碼,GDB將不能加載源文件並顯示錯誤信息。

  在gcc編譯時,由於使用優化會改變程序的運行結果,因此建議讀者不要使用-O優化選項,這樣才能使生成的可執行文件和源代碼保持一一對應的關係;其次,用戶若是想生成更多的調試信息,可在GCC編譯時使用-ggdb選項。

二、GDB的啓動

  GDB的啓動方法很是簡單,只需在命令行輸入以下格式便可:

  #gdb  [options]  [file]

  此格式表示使用gdb調試工具對可執行文件file進行「options」調試。經常使用的選項以下:

  -b baudrate  設置遠程調試的串口波特率

  --cd=DIR    進入gdb調試時改變當前路徑到DIR目錄

  --quiet     啓動gdb後不打印許可信息

  --fullname   使用emacs-GDB交互顯示輸出信息

  -w        使用窗口交互

  -help      打印幫助信息

  --se=File    使用File做爲可執行文件和變量文件

  --version    打印當前版本信息並退出

  --command=File  進入gdb調試後執行File文件中的命令 

三、GDB調試命令

  啓動gdb後,在gdb環境中輸入help就會顯示全部的幫助種類。gdb把命令分紅不一樣的類別,其中主要的種類包括:

  (1)breakpoints:斷點設置類

  (2)data:    數據查看類

  (3)files:    指定並查看文件類

  (4)internals:  維護命令類

  (5)running:  程序執行類

  (6)stack:   調用棧查看類

  (7)status:   狀態查看類

  (8)tracepoints:跟蹤程序執行類

  help命令只是列出gdb的命令種類,若是要看種類中的子命令,可使用help <class>命令,如:help breakpoints,表示查看設置斷點的全部命令。

  GDB中比較重要的4類命令介紹:

  (1)斷點設置類相關命令主要用來在調試程序中設置斷點:

  break 行號:在指定的行號上設置斷點

  break 函數:在「函數」名所在的行設置斷點,使程序剛好在進入指定的函數前中止

  info break:顯示全部斷點信息

  delete 斷點號:表示將指定的斷點號刪除,若是不指定要刪除的斷點號,系統默認刪除全部斷點號,斷點號可經過info break的第一欄查詢

  disable 斷點號:禁止指定的斷點號,同delete同樣,若是不指定斷點號,則禁止當前文件下全部的斷點

  enable 斷點號:激活指定的斷點號,即激活被disable禁止的斷點

  ignore 斷點號 num:在程序執行中,忽略對應斷點num次

  tbreak 行號或函數:設置臨時斷點,程序執行一次後,斷點被自動刪除

  watch expression:設置一個表達式的觀測點

  clear [FILE:]NUM: 刪除設置在特定源文件或者特定行上的斷點

  clear與delete都是清除斷點,可是二者的區別在於,clear命令後面要給出清除的斷點所在的行的行號,而delete命令是給出清除斷點的編號;其次,使用clear命令清除斷點時,gdb會自動給出提示,delete命令則不會。

  (2)數據查看類相關命令能夠用來查看程序中變量及內存信息:

  display [expr]:在每次程序中止時自動顯示對應表達式expr的內容

  delete display [expr]:取消每次程序中止時顯示對應表達式expr的內容

  delete mem:刪除內存區域中的內容

  disable display [expr]:程序中止時禁止顯示指定表達式expr的內容

  undisplay [expr]:禁止顯示指定表達式expr的內容

  enable display [expr]:激活禁止顯示的表達式expr

  print [expr][name]:打印當前表達式或變量的內容

  whatis [name]:顯示變量的數據類型

  ptype [name]:顯示用戶結構體的定義內容

  print的顯示格式:

  /x  按十六進制格式顯示變量

  /d  按十進制格式顯示變量

  /u  按十六進制格式顯示無符號整型

  /o  按八進制格式顯示變量

  /t  按二進制格式顯示變量

  /a  按十六進制格式顯示變量

  /c  按字符格式顯示變量

  /f  按浮點數格式顯示變量

  dispaly能夠用來設置一些自動顯示的變量,當程序暫停時,或者用戶單步跟蹤時,這些變量的值將會自動顯示;print只能顯示當前用戶指定的變量或者表達式的值,當程序下一次單步執行或者暫停時,不會顯示上次設定變量的值。

  (3)文件查看類命令主要用於程序文件的查看以及程序的編輯:

  cd DIR:將工做目錄設置在DIR下

  directory DIR:在搜尋源文件時也搜索DIR目錄

  file File:表示加載指定文件File進gdb

  search 正則表達式及變量:向前搜索正則表達式及變量

  foward-search 正則表達式及變量:向前搜索正則表達式

  reverse-search 正則表達式及變量:向後搜說正則表達式

  pwd:打印當前工做目錄

  path DIR:在搜索文件路徑時也搜索DIR目錄

  load file:在運行程序時,動態加載file文件

  list [行號][函數名]:列出對應於正在執行的程序的源文件內容,後面不加任何參數表示顯示10行源文件內容。list也可以使用其縮寫形式l

  info line:顯示加載到內存中的代碼

  (4)程序控制相關命令

  在使用GDB調試過程當中大體分爲3中狀態:運行態、暫停態以及結束態,其中暫停態使程序暫停在某個斷點處,它在程序調試中用的最多;結束態是用戶調試完畢,要跳出gdb的狀態,在此狀態下沒法查看各類變量的值;運行態是除暫停態和結束態以外的全部狀態。

  run:表示執行程序

  continue:繼續執行正在調試的程序,該命令用在程序因爲處理信號或斷點致使中止運行時

  interrupt:中斷調試程序的執行

  next:單步調試程序,不進入子函數單步執行

  nexti:單步調試一條指令

  step:單步調試程序,進入子函數單步執行

  kill:終止正在調試的程序

  set args:當被調試程序開始運行時,設置程序的參數列表

  set environment:設置程序環境變量的值

  show args:顯示一開始調試程序的參數列表

  set step-mode:設置單步運行的模式

  show step-mode:顯示單步運行的模式

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

  until:結束當前循環

  make:在不退出gdb的前提下執行make命令

相關文章
相關標籤/搜索