Linux下gdb調(diào)試工具的使用,學(xué)到牛牛
大多數(shù)程序員所使用的IDE(集成開發(fā)環(huán)境)都是自帶調(diào)試功能的,調(diào)試功能有什么用呢?大家編譯程序時發(fā)現(xiàn)的問題是語法或鏈接問題,能編譯通過只能說明我們的程序在語法和鏈接時未產(chǎn)生錯誤,但不能說明我們程序就是完全正確的,因為程序的業(yè)務(wù)邏輯問題是在執(zhí)行時才會發(fā)現(xiàn)的,所以我們會發(fā)現(xiàn)有很多初學(xué)編程的朋友就總會說明明我程序編譯通過啦,為什么執(zhí)行不出來結(jié)果或在執(zhí)行時發(fā)生了錯誤呢,這就是為什么要有調(diào)試這一環(huán)節(jié),調(diào)試的目的就在于發(fā)現(xiàn)程序中的業(yè)務(wù)邏輯問題,一般使用IDE的可以直接使用自帶的調(diào)試工具進(jìn)行程序運行調(diào)試,那如果我們是在沒有IDE的linux環(huán)境下又該如何對程序進(jìn)行調(diào)試呢?最簡單的方式就是調(diào)用打印函數(shù)(C語言中就是printf函數(shù))進(jìn)行程序語句運行的跟蹤,找出問題所在,這種方式的缺點就是需要不停添加printf修改源碼,重新編譯運行,最后還得刪除這些調(diào)試信息;而接下來給大家介紹的這個功能強(qiáng)大的調(diào)試工具gdb就可以很好的解決這些問題。
首先在linux下我們需要先安裝gdb調(diào)試工具;大多數(shù)情況下Centos和Ubuntu下是默認(rèn)安裝了gdb的,大家可以直接使用命令gdb? --version查看;
若沒有安裝可連網(wǎng)后執(zhí)行下列指令進(jìn)行安裝;
Centos下:yum? -y? install? gdb?
Ubuntu下:sudo? apt-get? -y? install? gdb
若要調(diào)試程序,編譯時還需要加上-g選項讓編譯生成的可執(zhí)行文件中包含足夠的調(diào)試信息,包含代碼、棧、局部變量等,若還需查看更多信息如宏定義則需添加-g3選項,這樣就可以通過print命令打印宏定義信息;如:
gcc? -g? test.c? -o? test、? ?gcc? -g3? test.c? -o? test
gdb常見使用命令說明:
命令 命令縮寫 命令說明
help \ help ? cmd查看gdb命令幫助手冊,cmd表示需查看的命令
file ?\ file test裝入需調(diào)試的可執(zhí)行文件test
list l 列出產(chǎn)生執(zhí)行文件的部分源碼
run r 開始運行程序直到設(shè)置的斷點
next n 單步執(zhí)行,如遇到自定義的函數(shù)中沒有斷點,則不會進(jìn)入函數(shù)內(nèi)部執(zhí)行
step s 單步執(zhí)行,如遇到自定義的函數(shù),則進(jìn)入函數(shù)內(nèi)部按順序逐步執(zhí)行
break b 設(shè)置斷點,可設(shè)置多個斷點,如:
b? 6表示在第6行設(shè)置斷點
b? funcname表示在函數(shù)funcname處設(shè)置斷點
執(zhí)行非當(dāng)前源文件的某行或某函數(shù)時停止執(zhí)行:?
b? filename:linenum 如: b? test.c:20
b? filename:funcname
根據(jù)條件停止程序執(zhí)行:
b? linenum? if? expr 如:b? 16? if? i != 0
b? funcname? if? expr
continue c 繼續(xù)運行程序直到下一個斷點的位置
info i 調(diào)試相關(guān)信息顯示,info 命令后必須加如下選項操作
info? break? 顯示當(dāng)前斷點清單,包括到達(dá)斷點處的次數(shù)等詳細(xì)信息,可簡寫成i? b
info? files? 顯示被調(diào)試文件的詳細(xì)信息
info? func? 顯示所有的函數(shù)名稱
info? local? 顯示當(dāng)前函數(shù)中的局部變量信息
info? prog? ?顯示被調(diào)試程序的執(zhí)行狀態(tài)
whatis \ 顯示變量或函數(shù)的類型
whatis? var? 如:whatis? tmp (tmp是程序中的變量)
whatis? funcname
disable \ disable? n 關(guān)閉第n個斷點,若不加n則表示對所有斷點執(zhí)行該操作,n為i? b查看的斷點信息中的num值
enable \ 開啟第n個斷點
delete d 刪除第n個斷點
set args \ 設(shè)置需傳遞的主函數(shù)參數(shù)值,需傳遞主函數(shù)參數(shù)時使用
set? args? arg1? arg2? ...
set var name=value \ 設(shè)置變量name的值;如程序中有變量int i和char name[10];
set var i=10 把變量i的設(shè)置為10
set var name="rjc" 把變量name的值設(shè)為"rjc"
注意這并不會改變原程序中已賦值變量的值,如程序中i已賦值(i=6),調(diào)試時設(shè)置變量值則無效
print p 顯示變量的值,p? variate就表示顯示變量variate的值
dprintf dp 在調(diào)試程序中指定位置動態(tài)添加打印信息
dprintf? location, format string,? arg1,? arg2,? ...
localtion表示行號
format string表示格式化打印的字符串和C語言中的printf函數(shù)中的格式化字符串的使用一樣
argn表示格式化輸出時需替換的程序中的變量
quit q 退出gdb
以上這些常見命令大家可以參考上述表格及help命令多多嘗試使用測試。
? ? 最后給大家兩個gdb實用小技巧,大家可以動手試試,學(xué)習(xí)一定是需要動腦思考、動手實踐的,實踐方能檢測學(xué)習(xí)內(nèi)容的真實性
1. 給當(dāng)前用戶添加編輯gdb的初始化配置文件.gbdinit
vim? ~/.gdbinit
添加如下內(nèi)容:
set? print? pretty? on? ? ? ? ?#打開結(jié)構(gòu)體信息調(diào)試打印,方便查看結(jié)構(gòu)體信息
set? print? array-indexes? on? ? ? ? ? #打開打印數(shù)組下標(biāo)索引
更多配置技巧可參考https://blog.csdn.net/wsx199397/article/details/53781641
2. vim? ~/.bashrc在當(dāng)前用戶的環(huán)境變量配置文件.bashrc中的最后添加如下信息:
alias? gdb="gdb? -q"
保存退出后,執(zhí)行source? ~/.bashrc生效該環(huán)境變量配置
這用于啟動gdb時去除版本信息等打印
文章來源:學(xué)到牛牛 www.xuedaon.com