1.編譯時加上一個-g
默認(rèn)編譯生成的可執(zhí)行文件是無法使用 gdb 來跟蹤或調(diào)試的,因為可執(zhí)行程序中沒有可供 gdb 調(diào)試使用的特殊信息赋访,為了將必要的調(diào)試信息整合到可執(zhí)行文件中缓待,我們便需要用到 -g 選項,這樣生成的可執(zhí)行程序步悠,倘若出現(xiàn)問題国葬,便可以使用 gdb 找出問題具體出現(xiàn)的位置芹壕,便于問題的解決踢涌。
2.開始調(diào)試
gdb xxx(可執(zhí)行程序)
3.查看源碼
在gdb中輸入l,不能完全顯示,多次l
4.下斷點
方式1、根據(jù)函數(shù)名睁壁,查找符號(symbol)設(shè)置斷點?
例子:b func_name
方式2潘明、根據(jù)代碼行位置設(shè)置斷點?
例子:b /src/codefile.cc:81
方式3、根據(jù)運行時的地址設(shè)置斷點?
例子1:b *0x5859c0厚宰。"*"號是必須加在地址前的,0x5859c0為函數(shù)指針的地址
5.查看變量的值
在gdb中p或者print
(1).程序變量
在GDB中澈蝙,你可以隨時查看以下三種變量的值:
1撵幽、全局變量(所有文件可見的)
2、靜態(tài)全局變量(當(dāng)前文件可見的)
3逗载、局部變量(當(dāng)前Scope可見的)
如果你的局部變量和全局變量發(fā)生沖突(也就是重名)链烈,一般情況下是局部變量會隱藏全局變量,也就是說捏膨,如果一個全局變量和一個函數(shù)中的局部變量同名時食侮,如果當(dāng)前停止點在函數(shù)中,用print顯示出的變量的值會是函數(shù)中的局部變量的值链快。如果此時你想查看全局變量的值時眉尸,你可以使用“::”操作符:
file::variable
function::variable
可以通過這種形式指定你所想查看的變量噪猾,是哪個文件中的或是哪個函數(shù)中的。
(2).查看數(shù)組
有時候袱蜡,你需要查看一段連續(xù)的內(nèi)存空間的值坪蚁。比如數(shù)組的一段,或是動態(tài)分配的數(shù)據(jù)的大小贱田。你可以使用GDB的“@”操作符嘴脾,“@”的左邊是第一個內(nèi)存的地址的值,“@”的右邊則你你想查看內(nèi)存的長度彩倚。例如,你的程序中有這樣的語句:
int *array = (int *) malloc (len * sizeof (int));
于是蔬蕊,在GDB調(diào)試過程中哥谷,你可以以如下命令顯示出這個動態(tài)數(shù)組的取值:
p?*array@len?
如果是靜態(tài)數(shù)組的話,可以直接用print數(shù)組名猜扮,就可以顯示數(shù)組中所有數(shù)據(jù)的內(nèi)容了监婶。
(3).輸出格式
一般來說惑惶,GDB會根據(jù)變量的類型輸出變量的值。但你也可以自定義GDB的輸出的格式带污。例如鱼冀,你想輸出一個整數(shù)的十六進(jìn)制,或是二進(jìn)制來查看這個整型變量的中的位的情況充易。要做到這樣翘紊,你可以使用GDB的數(shù)據(jù)顯示格式:
x 按十六進(jìn)制格式顯示變量藐唠。
d 按十進(jìn)制格式顯示變量宇立。
u 按十六進(jìn)制格式顯示無符號整型踪宠。
o 按八進(jìn)制格式顯示變量。
t 按二進(jìn)制格式顯示變量妈嘹。
a 按十六進(jìn)制格式顯示變量柳琢。
c 按字符格式顯示變量。
f 按浮點數(shù)格式顯示變量。
(4).查看內(nèi)存
你可以使用examine命令(簡寫是x)來查看內(nèi)存地址中的值柬脸。x命令的語法如下所示:
x/
n他去、f、u是可選的參數(shù)倒堕。
n 是一個正整數(shù)灾测,表示顯示內(nèi)存的長度,也就是說從當(dāng)前地址向后顯示幾個地址的內(nèi)容垦巴。
f 表示顯示的格式媳搪,參見上面骤宣。如果地址所指的是字符串秦爆,那么格式可以是s,如果地十是指令地址憔披,那么格式可以是i等限。
u 表示從當(dāng)前地址往后請求的字節(jié)數(shù),如果不指定的話芬膝,GDB默認(rèn)是4個bytes精刷。u參數(shù)可以用下面的字符來代替,b表示單字節(jié)蔗候,h表示雙字節(jié)怒允,w表示四字節(jié),g表示八字節(jié)锈遥。當(dāng)我們指定了字節(jié)長度后纫事,GDB會從指內(nèi)存定的內(nèi)存地址開始,讀寫指定字節(jié)所灸,并把其當(dāng)作一個值取出來丽惶。
表示一個內(nèi)存地址。