作為程序員,調(diào)試是一項(xiàng)很重要的基本功。調(diào)試的技巧和水平,直接決定了解決問(wèn)題的時(shí)間。一般情況下,GDB的基本命令已經(jīng)足以應(yīng)付大多數(shù)問(wèn)題了。但是,對(duì)于有些問(wèn)題,還是需要更高級(jí)一些的命令。
今天給大家介紹GDB功能十分強(qiáng)大的三個(gè)調(diào)試技巧。checkpoint、condition和ignore。
一,checkpoint
有一些bug,可能很難復(fù)現(xiàn),當(dāng)好不容易復(fù)現(xiàn)一次,且剛剛進(jìn)入程序的入口時(shí),我們需要珍惜這個(gè)來(lái)之不易的機(jī)會(huì)。如果只使用基本命令的話,對(duì)于大部分代碼,我們都需要使用step來(lái)步進(jìn)。這樣無(wú)疑會(huì)耗費(fèi)大量的時(shí)間,因?yàn)榇蟛糠值拇a可能都沒(méi)有問(wèn)題??墒且坏┎恍⌒氖褂胣ext,結(jié)果恰好該語(yǔ)句的函數(shù)調(diào)用返回出錯(cuò)。那么對(duì)于這次來(lái)之不易的機(jī)會(huì),我們只得到了部分信息,即確定問(wèn)題出在該函數(shù),但是哪里出錯(cuò)還是不清楚。于是還需要再一次的復(fù)現(xiàn)bug,時(shí)間就這樣浪費(fèi)了。對(duì)于這種問(wèn)題,是checkpoint大顯身手的時(shí)候了。
checkpoint可以看做程序在那一刻的快照,當(dāng)我們發(fā)現(xiàn)錯(cuò)過(guò)了某個(gè)調(diào)試機(jī)會(huì)時(shí),可以再次回到checkpoint保存的那個(gè)程序狀態(tài)。
checkpoint的用法很簡(jiǎn)單,但是很有用。就是在平時(shí)的簡(jiǎn)單的bug修正中,也可以加快我們的調(diào)試速度——畢竟減少了不必要的重現(xiàn)bug的時(shí)間。
二,condition
調(diào)試程序時(shí),程序中如果包含循環(huán)調(diào)用,但想觀察循環(huán)中間,此時(shí)condition就很有用了,可以根據(jù)條件來(lái)停止當(dāng)前的斷點(diǎn)。
這個(gè)功能很強(qiáng)大,可以在我們?cè)O(shè)置的條件成立時(shí),自動(dòng)停止當(dāng)前的程序,先使用break(或者watch也可以)設(shè)置斷點(diǎn),然后用condition來(lái)修改這個(gè)斷點(diǎn)的停止(就是斷)的條件。使用方法很簡(jiǎn)單,如下:
condition <break_number> <expression> 修改當(dāng)前的斷點(diǎn)停止條件為expression為真值condition <break_number> 清楚斷點(diǎn)號(hào)的停止條件,這樣就是一般的斷點(diǎn)了。
如,我們想在斷點(diǎn)號(hào)為1處,參數(shù)args的值為root時(shí)才停止(斷點(diǎn)才斷),可以設(shè)置如下:condition 1 args="root"。然后如果想清除這個(gè)條件,可以這樣condition 1
三,ignore
如果我們不是想根據(jù)某一條件表達(dá)式來(lái)停止,而是想斷點(diǎn)自動(dòng)忽略前面多少次的停止,從某一次開(kāi)始才停止,這時(shí)ignore就很有用了。
ignore break_number count
上面的命令行表示break_number所指定的斷點(diǎn)號(hào)將被忽略count次。如:
ignore 1 100,表示忽略斷點(diǎn)1的前100次停止
本文版權(quán)歸傳智播客C++培訓(xùn)學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請(qǐng)注明作者出處。謝謝!
作者:傳智播客C/C++培訓(xùn)學(xué)院
首發(fā):http://m.fskzgqt.cn/c/