一、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命令