80%的程序員不了解的調(diào)試技巧

程序員的工作內(nèi)容岳枷,除了大部分時間寫代碼之外,因為有不少的時間是用在調(diào)試代碼上。甚至說不是在調(diào)試代碼空繁,就是即將調(diào)試代碼殿衰。 :)

今天我們來談?wù)務(wù){(diào)試代碼的一些技巧,在使用IDE提供的debugger時一些快速定位問題的方式盛泡。

看到這里的朋友闷祥,不要馬上認(rèn)為我標(biāo)題黨,再往下看看傲诵,如果你還有一些更好用的技巧凯砍,歡迎留言。

下面進(jìn)入正題拴竹。

1 多線程調(diào)試

開發(fā)過多線程應(yīng)用的朋友應(yīng)該有體會悟衩,有些時候,為了觀察多個線程間變量的不同狀態(tài)栓拜,以及鎖的獲取等座泳,就會想到在代碼里加個斷點(diǎn)debug一下。

在IDE里斷點(diǎn)停下來的時候幕与,可以切換到另外的線程中挑势,跑其他的代碼,不會互相影響啦鸣。當(dāng)然潮饱,這里是有個開關(guān)的,在Eclipse里默認(rèn)開啟赏陵,

但是在IntelliJ IDEA里默認(rèn)是沒有開啟的饼齿。也就是說如果你在IDEA里代碼里加斷點(diǎn)饲漾,雖然一個線程的斷了下來蝙搔,但其他線程的已經(jīng)執(zhí)行過了。此處把線程的suspend設(shè)置成和Eclipse模式一樣之后考传,也可以開始多線程應(yīng)用的調(diào)試吃型。簡單設(shè)置可以直接在斷點(diǎn)處,將suspend改成Thread

一個線程斷下來之后僚楞,可以通過在線程窗口切換勤晚,到其它線程中繼續(xù)運(yùn)行。

IntelliJ IDEA里在這兒切換


我們看到main線程和pool-1-thread-1這兩個線程都處于RUNNING狀態(tài)泉褐,切換到任何一個都可以繼續(xù)運(yùn)行赐写。

此時,就可以寫一個多線程的應(yīng)用膜赃,同時向ArryList這一類非線程安全的容器中存放內(nèi)容挺邀,然后觀察為什么他們是線程不安全的,會出現(xiàn)什么問題,生動又形象端铛。

PS: 這里順道說一下泣矛,這就是為什么創(chuàng)建線程時建議起一個有意義的名字,至少是可以識別的名字禾蚕,否則在這里都不能區(qū)分出哪個是自己的線程您朽,想切換還麻煩。

2 后退執(zhí)行

這里所說的后退執(zhí)行换淆,是有些時候我們在debug代碼時哗总,懶的每個方法都進(jìn)入單步調(diào)試,就會出現(xiàn)你觀察一個變量值的變化時产舞,某個方法沒跟進(jìn)去魂奥,結(jié)果值就變了,不得不重來一次易猫。

依靠后退執(zhí)行的功能耻煤,可以后退,就像下棋時悔棋那種功能一樣准颓。當(dāng)然哈蝇,這個后退招待的名字是我自己起的,在IDE里被稱為Drop Frame攘已。

有了這個功能炮赦,我們在Drop 了當(dāng)前這個Frame之后,已經(jīng)改變的變量值不會恢復(fù)样勃。比如你向當(dāng)前調(diào)用方法里傳入了一個List吠勘,并且在方法中向List里添加了內(nèi)容,那在Drop到調(diào)用該方法的地方時峡眶,List不會恢復(fù)到之前的狀態(tài)剧防。

但是在該方法再次被調(diào)用時,你可以觀察List什么時候被改變的辫樱,至少不需要再重跑一遍程序了峭拘。甚至你可以一言不合就后退。

3 條件斷點(diǎn)

為了調(diào)試代碼狮暑,就需要在要觀察變更的地方添加斷點(diǎn)鸡挠,然后小心翼翼的一步步執(zhí)行。但是如果是在一個循環(huán)里搬男,又或者該方法會被多線程同時調(diào)用到的時候拣展,你小心的向下單步調(diào)試,發(fā)現(xiàn)沒有你關(guān)心的內(nèi)容缔逛,又從循環(huán)開始處跑下來备埃,還是沒你的內(nèi)容溜腐,人就開始煩燥起來。

其實瓜喇,在添加斷點(diǎn)的時候挺益,我們可以為斷點(diǎn)增加一定的條件,這樣乘寒,在指定的條件滿足時望众,斷點(diǎn)才會生效。

IntelliJ IDEA內(nèi)伞辛,在斷點(diǎn)上右擊烂翰,會彈出如下圖的條件框,輸入指定的條件即可蚤氏。

有了條件斷點(diǎn)甘耿,不相關(guān),不感興趣的代碼就可以直接跳過了竿滨。

4 片斷代碼

這個沒想好用什么名字來表述佳恬。有些時候在調(diào)試過程中,忽然想招待一段與此相關(guān)于游,但不在源文件中的代碼來觀察一下毁葱,輔助進(jìn)行問題分析。此時你會停止程序贰剥,添加代碼然后重新跑一次嗎倾剿?

在IDEA里有一個執(zhí)行代碼片斷的功能,可以在當(dāng)前代碼的上下文內(nèi)蚌成,執(zhí)行你臨時寫的代碼前痘。

例如,當(dāng)前方法傳入一個List担忧,但這個方法里少一個你后面條件需要使用到的元素芹缔,此時你可以臨時使用片斷代碼執(zhí)行的功能,添加一個進(jìn)去涵妥。

注意乖菱,在IntelliJ IDEA里坡锡,這個上面紅框蓬网,像個小計算器的按鈕就是臨時執(zhí)行的功能,點(diǎn)擊之后鹉勒,會彈出按鈕下方這個Evaluate Expression的框帆锋,輸入代碼,點(diǎn)擊右下角的Evalute即可禽额。返回值會顯示在Result處锯厢。

這就就相當(dāng)于臨時改變了變量內(nèi)容皮官。

然后,還可以調(diào)用對象的方法实辑,執(zhí)行功能捺氢,獲取屬性值等。

5 查看變量修改值

每個IDE在調(diào)試代碼時都提供了一個觀察當(dāng)前上下文變量值的窗口剪撬。其實除了查看之外摄乒,一些非final的基本類型,還可以直接在此處修改值残黑。這樣如果多次循環(huán)執(zhí)行時馍佑,每次可以恢復(fù)到期望的值,不需要重啟程序梨水。

如果覺得本文標(biāo)題黨拭荤,歡迎分享你在調(diào)試過程中認(rèn)為不錯的技巧,歡迎留言分享疫诽。:)

Java調(diào)試的原理舅世,請查看上一篇文章。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奇徒,一起剝皮案震驚了整個濱河市歇终,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌逼龟,老刑警劉巖评凝,帶你破解...
    沈念sama閱讀 207,113評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異腺律,居然都是意外死亡奕短,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,644評論 2 381
  • 文/潘曉璐 我一進(jìn)店門匀钧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來翎碑,“玉大人,你說我怎么就攤上這事之斯∪砧荆” “怎么了?”我有些...
    開封第一講書人閱讀 153,340評論 0 344
  • 文/不壞的土叔 我叫張陵佑刷,是天一觀的道長茫因。 經(jīng)常有香客問我,道長叨叙,這世上最難降的妖魔是什么私恬? 我笑而不...
    開封第一講書人閱讀 55,449評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮麦萤,結(jié)果婚禮上鹿鳖,老公的妹妹穿的比我還像新娘扁眯。我一直安慰自己,他們只是感情好翅帜,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,445評論 5 374
  • 文/花漫 我一把揭開白布姻檀。 她就那樣靜靜地躺著,像睡著了一般涝滴。 火紅的嫁衣襯著肌膚如雪施敢。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,166評論 1 284
  • 那天狭莱,我揣著相機(jī)與錄音僵娃,去河邊找鬼。 笑死腋妙,一個胖子當(dāng)著我的面吹牛默怨,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播骤素,決...
    沈念sama閱讀 38,442評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼匙睹,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了济竹?” 一聲冷哼從身側(cè)響起痕檬,我...
    開封第一講書人閱讀 37,105評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎送浊,沒想到半個月后梦谜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,601評論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡袭景,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,066評論 2 325
  • 正文 我和宋清朗相戀三年唁桩,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片耸棒。...
    茶點(diǎn)故事閱讀 38,161評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡荒澡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出与殃,到底是詐尸還是另有隱情单山,我是刑警寧澤,帶...
    沈念sama閱讀 33,792評論 4 323
  • 正文 年R本政府宣布幅疼,位于F島的核電站米奸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏衣屏。R本人自食惡果不足惜躏升,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,351評論 3 307
  • 文/蒙蒙 一辩棒、第九天 我趴在偏房一處隱蔽的房頂上張望狼忱。 院中可真熱鬧膨疏,春花似錦、人聲如沸钻弄。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,352評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽窘俺。三九已至饲帅,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間瘤泪,已是汗流浹背灶泵。 一陣腳步聲響...
    開封第一講書人閱讀 31,584評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留对途,地道東北人赦邻。 一個月前我還...
    沈念sama閱讀 45,618評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像实檀,于是被迫代替她去往敵國和親惶洲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,916評論 2 344

推薦閱讀更多精彩內(nèi)容