最近通過(guò)《軟件調(diào)試的藝術(shù)》學(xué)習(xí)GDB,書(shū)剛讀了大概三分之一,這里先記一些筆記
:-)
縮寫(xiě)
| short | full |
|---|---|
| b | break |
| i b | info break |
| c | continue |
| r | run |
| at | attach |
| s | step |
| n | next |
| p | |
| bt | backtrace |
基本操作
斷點(diǎn)
b position
position可以是 filename:line filename:function
filename可以不指明,gdb總有一個(gè)焦點(diǎn)文件,剛啟動(dòng)時(shí)焦點(diǎn)文件是main函數(shù)所在的文件,當(dāng)程序運(yùn)行時(shí),焦點(diǎn)文件是當(dāng)前執(zhí)行代碼所在的文件,也可以通過(guò) list filename:functionname來(lái)設(shè)定焦點(diǎn)。
斷點(diǎn)命令:
command breakPointNumber,對(duì)編號(hào)為breakPointNumber的斷點(diǎn)設(shè)置命令,以end結(jié)尾,執(zhí)行到此斷點(diǎn)時(shí),命令會(huì)執(zhí)行,比如打印變量:
printf(“at break point 3,
i = %d,j = %d,k = %d\n”,
i,j,k) //括號(hào)可有可無(wú)
一些命令,感覺(jué)用處不大。。。
-
define 定義宏,可帶最多十個(gè)參數(shù)define PRINT_AND_GO xxxxx(說(shuō)明) >printf $arg1,$arg0 >continue >end
- `show user` : 列出所有宏
- `silent` : 不輸出信息
## 監(jiān)視點(diǎn)
wathc `value`
watch `expession`
`expression`是 **當(dāng)前程序語(yǔ)言風(fēng)格** 的條件表達(dá)式,比如 (i>0)&&(j==2)
當(dāng)`value`變化或`expression`成立時(shí),程序中斷。
設(shè)置監(jiān)視點(diǎn)時(shí)必須保證監(jiān)視變量在當(dāng)前程序指針?biāo)谖蛔佑行?,即?duì)已局部變量,必須保證程序指針停留在局部變量所在函數(shù),所以一般在要函數(shù)入口處加一個(gè)斷點(diǎn),然后才能設(shè)置函數(shù)內(nèi)變量的監(jiān)視點(diǎn)。
##條件斷點(diǎn)
- 設(shè)置條件斷點(diǎn)
b `position` if (`expression`)
`expression`外的括號(hào)可有可無(wú)
- 將已有斷電設(shè)置為條件斷點(diǎn)
condition `breakPointNumber` if (`expression`)
`breakPointNUmber`用 info breakpoint(i b)查看
## 繼續(xù)執(zhí)行
- c/continue 繼續(xù)執(zhí)行到下個(gè)斷點(diǎn)
- fin/finsh 繼續(xù)執(zhí)行到此函數(shù)結(jié)束
- u/until 繼續(xù)執(zhí)行到循環(huán)結(jié)束
*當(dāng)然,斷點(diǎn)對(duì) `fin/u` 依然有效*
*u 可帶位置參數(shù):u `position` *
- s/step 執(zhí)行下一條語(yǔ)句,會(huì)進(jìn)入函數(shù)
- n/next 執(zhí)行下一條語(yǔ)句,不會(huì)進(jìn)入函數(shù)
*s/n可帶步數(shù)參數(shù): s 4*