最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

Linux下gdb調(diào)試工具的使用,學(xué)到牛牛

2022-03-30 16:37 作者:四川學(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

Linux下gdb調(diào)試工具的使用,學(xué)到牛牛的評論 (共 條)

分享到微博請遵守國家法律
额尔古纳市| 牡丹江市| 荆门市| 耒阳市| 富川| 济阳县| 许昌市| 靖西县| 句容市| 莱芜市| 筠连县| 宁国市| 万源市| 香港 | 通海县| 中阳县| 揭西县| 景德镇市| 科技| 潼关县| 灵武市| 利辛县| 郎溪县| 分宜县| 鹿泉市| 霍山县| 合作市| 建德市| 九龙县| 平遥县| 兴业县| 沂水县| 闵行区| 祁连县| 贵溪市| 定南县| 辽源市| 靖宇县| 富民县| 铜川市| 郁南县|