一筷黔、編譯運(yùn)行
1.1鞠眉、程序帶調(diào)試信息
????使用額外的 '-g' 選項(xiàng)來編譯程序:
gcc -g eg.c -o eg
1.2 運(yùn)行 gdb
裝載程序
方法一:在 shell 中,可以使用 'gdb' 命令并 指定程序名 作為參數(shù)來運(yùn)行 gdb
gdb + 程序名
方法二:在 gdb 中歹颓,可以使用 file 命令來裝入要調(diào)試的程序
(gdb)file + 文件名
兩種方式都假設(shè)您是在包含程序的目錄中執(zhí)行命令奢米。
命令? ? ? ? ? ? ? ?縮寫????????????????????????????功能
run? ? ? ? ? ? ? ? ? ?r???????????? ????????????????運(yùn)行程序
continue? ? ? ? ? c (fg)? ? ? ? ? ?繼續(xù)執(zhí)行直到下一次斷點(diǎn)
until +行號(hào)? ? ? ?u? ? ? ? ? ? ? ? ? ? ? ?繼續(xù)執(zhí)行直到指定行
每次執(zhí)行結(jié)束重新輸入 run 可重新執(zhí)行
參數(shù)設(shè)置
裝入程序之后,可以用 gdb 命令 'run + 運(yùn)行參數(shù)' 來啟動(dòng)程序讶迁。
run + 參數(shù)? ? ? ? ? ? ? ? ? ? # 啟動(dòng)程序 或者? restart?
或者在執(zhí)行run前 通過 set args + 運(yùn)行參數(shù) 設(shè)置
set args + 運(yùn)行參數(shù)
run
如果一切正常连茧,程序?qū)?zhí)行到結(jié)束(要是不想讓其結(jié)束要提前設(shè)置斷點(diǎn)),此時(shí) gdb 將重新獲得控制巍糯。
1.3 退出gdb
quit [退出條件]? ? ? ? ? ? ? ? ? ? ?# 退出gdb
二啸驯、調(diào)試命令
2.1?設(shè)置斷點(diǎn)
普通斷點(diǎn)
命令????????縮寫? ? ????用法1????????????????用法2????????????????????????????????????????用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
break? ? ? ?b? ? ? ? ? ? b + 函數(shù)名? ? ? ? ?b + 行號(hào)(文件名:行號(hào))? ? ????b + *地址(*0x7c00)? ? ??
查看斷點(diǎn)
info breakpoints
條件斷點(diǎn)
(1) break + .. + if? 條件
(2) condition 斷點(diǎn)號(hào) 條件
根據(jù)規(guī)則設(shè)置斷點(diǎn)
rbreak printNum*? ? ? ? ? ? #所有以printNum開頭的函數(shù)都設(shè)置了斷點(diǎn)
rbreak .? ? ? ? ? ? ? ? ? ? ? ? ? ?#對(duì)所有函數(shù)設(shè)置斷點(diǎn)
rbreak test.c: . ????????????????#對(duì)test.c中的所有函數(shù)設(shè)置斷點(diǎn)
rbreak test.c:^print ????????#對(duì)以print開頭的函數(shù)設(shè)置斷點(diǎn)
臨時(shí)斷點(diǎn)
斷點(diǎn)只想生效一次,可以設(shè)置臨時(shí)斷點(diǎn)
tbreak test.c:l0? #在第10行設(shè)置臨時(shí)斷點(diǎn)
刪除斷點(diǎn)
clear? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #刪除當(dāng)前行所有breakpoints
clear function? ????????????????????????????????#刪除函數(shù)名為function處的斷點(diǎn)
clear filename:function? ? ? ? ? ? ? ? ? ? #刪除文件filename中函數(shù)function處的斷點(diǎn)
clear lineNum? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? #刪除行號(hào)為lineNum處的斷點(diǎn)
clear filename:lineNum ????????????????#刪除文件filename中行號(hào)為lineNum處的斷點(diǎn)
delete? ????????????????????????????????????????????#刪除所有breakpoints,watchpoints和catchpoints
delete bnum ????????????????????????????????????#刪除斷點(diǎn)號(hào)為bnum的斷點(diǎn)
跳過多次設(shè)置斷點(diǎn)
ignore +? 斷點(diǎn)號(hào)? +? ?忽略次數(shù)
Num? ? Type? ? ? ? ? Disp Enb Address? ? ? ? ? ? What
1? ? ? breakpoint? ? keep y? 0x00000000004005e8 in printNum2 at test.c:16? ignore next 30 hits
根據(jù)表達(dá)式值變化產(chǎn)生斷點(diǎn)
需要觀察某個(gè)值或表達(dá)式祟峦,知道它什么時(shí)候發(fā)生變化
watch + 變量或者表達(dá)式的值
watch + 條件
讓程序繼續(xù)運(yùn)行罚斗,如果值發(fā)生變化,則會(huì)打印相關(guān)內(nèi)容宅楞,如:
Hardware watchpoint 2: a
Old value = 12
New value = 11
其? info breakpoints 信息
Num ???? Type ???????????????? Disp ????????Enb ????????????Address ???????? What
2? ? ? ???? hw watchpoint? ????keep ????????y? ? ? ? ? ? ? ? ? ? ? a? ?????????????breakpoint already hit 11 times
禁用或啟動(dòng)斷點(diǎn)
有些斷點(diǎn)暫時(shí)不想使用针姿,但又不想刪除,可以暫時(shí)禁用或啟用厌衙。例如:
disable? ????????????????????????????#禁用所有斷點(diǎn)
disable bnum? ? ? ? ? ? ? ? ? ? #禁用標(biāo)號(hào)為bnum的斷點(diǎn)
enable? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#啟用所有斷點(diǎn)
enable bnum ????????????????????#啟用標(biāo)號(hào)為bnum的斷點(diǎn)
enable delete bnum? ????????#啟動(dòng)標(biāo)號(hào)為bnum的斷點(diǎn)距淫,并且在此之后刪除該斷點(diǎn)
2.2 單步執(zhí)行
命令????????縮寫? ? ????用法? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?用法1
next? ? ? ? ? ?n? ? ? ? ? 執(zhí)行一行源程序代碼,不進(jìn)入函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ? ? ?n + 步數(shù)
step? ? ? ? ? ?s? ? ? ? ? 執(zhí)行一行源程序代碼婶希,單步跟蹤進(jìn)入函數(shù)? ? ? ? ? ? ? ? ? s?+ 步數(shù)
nexti? ? ? ? ? ?ni? ? ? ? ? 執(zhí)行一行匯編程序代碼榕暇,不進(jìn)入函數(shù)? ? ? ? ? ? ? ? ? ? ? ? ni + 步數(shù)
stepi? ? ? ? ? ?si? ? ? ? ? 執(zhí)行一行匯編程序代碼,單步跟蹤進(jìn)入函數(shù)? ? ? ? ? ? ?si + 步數(shù)
finish???????????????????????跳過該函數(shù),繼續(xù)后面的執(zhí)行
2.3 查看變量
在查看變量之前彤枢,需要先啟動(dòng)調(diào)試并設(shè)置斷點(diǎn)
命令? ? ?縮寫? ? ? ? 用法1? ? ? ? ? ? ? ????????????????????????????用法2? ? ? ? ? ? ? ? ? ? ??
print? ? ? ?p? ? ? ? p + 變量名? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? p + 數(shù)組名? ? ??
?命令? ? ?縮寫? ? ? ? ? 用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用法4????????????????????????????用法5
print? ? ? ?p?? ? ? ? ? ? ? p + 文件名(函數(shù)名) :: 變量名? ? ? ? p + *(地址或指針)? ? ? ? p + *指針@數(shù)量
環(huán)境變量$
$? 可表示上一個(gè)變量撤蟆,假設(shè)此時(shí)有一個(gè)鏈表linkNode,它有next成員代表下一個(gè)節(jié)點(diǎn)堂污,則可使用下面方式不斷打印鏈表內(nèi)容:
(gdb) p *linkNode? ? ? ? ? ? #顯示linkNode節(jié)點(diǎn)內(nèi)容
(gdb) p *$.next? ? ? ? ? ? ? ? #顯示linkNode節(jié)點(diǎn)下一個(gè)節(jié)點(diǎn)的內(nèi)容
如果想要查看前面數(shù)組的內(nèi)容,你可以將下標(biāo)一個(gè)一個(gè)累加龄砰,還可以定義一個(gè)類似UNIX環(huán)境變量盟猖,這樣就不需要每次修改下標(biāo)去打印,例如:
(gdb) set $index=0
(gdb) p b[$index++]
$11 = 1
(gdb) p $pc? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?# 當(dāng)前指令
2.4 打印格式
x 按十六進(jìn)制格式顯示變量换棚。????????d 按十進(jìn)制格式顯示變量式镐。????????????o 按八進(jìn)制格式顯示變量。
t 按二進(jìn)制格式顯示變量固蚤。????????????c 按字符格式顯示變量娘汞。????????????????f 按浮點(diǎn)數(shù)格式顯示變量。
(gdb) p/x c
2.5 查看內(nèi)存
命令? ? ? ? ? ? ? 用法? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????用法1? ? ? ? ? ? ??
? ?x? ? ? ? ? ? ? ?查看內(nèi)存內(nèi)容 ????????x / [n內(nèi)存單元數(shù)] [f格式] [u單元長(zhǎng)度] addr地址? ? ?
格式
t 二進(jìn)制? ? ? ? ? ?????x 十六進(jìn)制? ? ? ? ? ? ????d 十進(jìn)制? ? ? ? ? ? o 八進(jìn)制????????????????????????u 十進(jìn)制無符號(hào)
c 字符? ? ? ? ? ? ?????s 字符串? ? ? ? ? ? ? ? ????f 浮點(diǎn)數(shù)? ? ? ? ? ? ?z 零拓展十六進(jìn)制? ? ? ? ? a? 地址單元的長(zhǎng)度? ? ?
i 指令地址格式? ? ?
單元長(zhǎng)度
b 字節(jié)????????????h? 雙字節(jié)????????????????w? 四字節(jié)????????????g 八字節(jié)
默認(rèn)是4個(gè)byte
查看堆棧信息
x /8x $esp
2.6 自動(dòng)顯示變量
程序斷住時(shí)夕玩,就顯示某個(gè)變量的值
命令? ? ? ? ? ? ? ? ? ? ? 用法? ? ? ? ? ? ? ? ? ? ? ? ? ?用法1
display? ? ? ? ? ? ? ?查看變量名? ? ? ? ? ? ?display + 變量名
清除變量
delete display num ????????????# num變量的編號(hào)你弦,不帶num時(shí)清除所有變量
去使能
disable display num????????? # num為變量的編號(hào),不帶num時(shí)去使能所有
2.4 info
命令? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 縮寫? ? ? ? ? ????????? 功能
info? breakpoints? ? ? ? ? ?i? b? ? ? ????????????查看已設(shè)置斷點(diǎn)
info? watchpoints? ? ? ? ? ?i? wat? ? ? ? ? ? ? 查看已設(shè)置觀測(cè)點(diǎn)
info registers? ? ? ? ? ? ? ? ?i? r? ? ???????????????查看所有寄存器
info skip? ? ? ? ? ? ? ? ? ? ? ? i? s???????????????????查看所有需要跳過的函數(shù)?
info local? ? ? ? ? ? ? ? ? ? ? ?i lo? ? ? ? ? ? ? ? ? ? 查看當(dāng)前函數(shù)局部變量
help? info可查看更多
2.7 skip
命令? ? ? ? ? ? ? ? ? ? ? ? ? ?????????????????????????功能
skip + 函數(shù)名????????????????????單步執(zhí)行時(shí)跳過一些不想關(guān)注的函數(shù)
skip? file + 文件名? ? ? ? ? ? ?單步執(zhí)行時(shí)跳過某個(gè)文件的代碼
skip delete [num]? ? ? ? ? ? ? 刪除對(duì)應(yīng)編號(hào)skip
skip enable [num] ????????????使能對(duì)應(yīng)編號(hào)skip
skip disable [num] ????????????去使能對(duì)應(yīng)編號(hào)skip
三燎孟、查看源碼
3.1 list
list 列出指定行附件的源碼
命令? ? ? ? ? ? 縮寫? ? ? ? ? ? ? ? 用法1? ? ? ? ? ? 用法2? ? ? ? ? ? ? ? 用法3? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 用法4
list? ? ? ? ? ? ? ? ? l? ? ? ? ? ? ? ? ? ? l + 行號(hào)? ? ? ? l + 函數(shù)名? ? ? ? ? l 行號(hào) 禽作, 行號(hào)(指定范圍)? ? ? l + 文件名:行號(hào)
set listsize 20? ? ? ? ? ? # 顯示 每次顯示的行數(shù)