80%的程序員不瞭解的調試技巧

程序員的工做內容,除了大部分時間寫代碼以外,由於有很多的時間是用在調試代碼上。甚至說不是在調試代碼,就是即將調試代碼。 :)java

今天咱們來談談調試代碼的一些技巧,在使用IDE提供的debugger時一些快速定位問題的方式。程序員

看到這裏的朋友,不要立刻認爲我標題黨,再往下看看,若是你還有一些更好用的技巧,歡迎留言。面試

下面進入正題。安全

1 多線程調試多線程

開發過多線程應用的朋友應該有體會,有些時候,爲了觀察多個線程間變量的不一樣狀態,以及鎖的獲取等,就會想到在代碼里加個斷點debug一下。架構

在IDE裏斷點停下來的時候,能夠切換到另外的線程中,跑其餘的代碼,不會互相影響。固然,這裏是有個開關的,在Eclipse裏默認開啓,框架

可是在IntelliJ IDEA裏默認是沒有開啓的。也就是說若是你在IDEA裏代碼里加斷點,雖然一個線程的斷了下來,但其餘線程的已經執行過了。此處把線程的suspend設置成和Eclipse模式同樣以後,也能夠開始多線程應用的調試。簡單設置能夠直接在斷點處,將suspend改爲Thread分佈式

一個線程斷下來以後,能夠經過在線程窗口切換,到其它線程中繼續運行。源碼分析

IntelliJ IDEA裏在這兒切換性能

咱們看到main線程和pool-1-thread-1這兩個線程都處於RUNNING狀態,切換到任何一個均可以繼續運行。

此時,就能夠寫一個多線程的應用,同時向ArryList這一類非線程安全的容器中存放內容,而後觀察爲何他們是線程不安全的,會出現什麼問題,生動又形象。

PS: 這裏順道說一下,這就是爲何建立線程時建議起一個有意義的名字,至少是能夠識別的名字,不然在這裏都不能區分出哪一個是本身的線程,想切換還麻煩。

2 後退執行

這裏所說的後退執行,是有些時候咱們在debug代碼時,懶的每一個方法都進入單步調試,就會出現你觀察一個變量值的變化時,某個方法沒跟進去,結果值就變了,不得不重來一次

依靠後退執行的功能,能夠後退,就像下棋時悔棋那種功能同樣。固然,這個後退招待的名字是我本身起的,在IDE裏被稱爲Drop Frame

有了這個功能,咱們在Drop 了當前這個Frame以後,已經改變的變量值不會恢復。好比你向當前調用方法裏傳入了一個List,而且在方法中向List裏添加了內容,那在Drop到調用該方法的地方時,List不會恢復到以前的狀態。

可是在該方法再次被調用時,你能夠觀察List何時被改變的,至少不須要再重跑一遍程序了。甚至你能夠一言不合就後退。

3 條件斷點

爲了調試代碼,就須要在要觀察變動的地方添加斷點,而後當心翼翼的一步步執行。可是若是是在一個循環裏,又或者該方法會被多線程同時調用到的時候,你當心的向下單步調試,發現沒有你關心的內容,又從循環開始處跑下來,仍是沒你的內容,人就開始煩燥起來。

其實,在添加斷點的時候,咱們能夠爲斷點增長必定的條件,這樣,在指定的條件知足時,斷點纔會生效。

IntelliJ IDEA內,在斷點上右擊,會彈出以下圖的條件框,輸入指定的條件便可。

有了這個功能,咱們在Drop 了當前這個Frame以後,已經改變的變量值不會恢復。好比你向當前調用方法裏傳入了一個List,而且在方法中向List裏添加了內容,那在Drop到調用該方法的地方時,List不會恢復到以前的狀態。

可是在該方法再次被調用時,你能夠觀察List何時被改變的,至少不須要再重跑一遍程序了。甚至你能夠一言不合就後退。

3 條件斷點

爲了調試代碼,就須要在要觀察變動的地方添加斷點,而後當心翼翼的一步步執行。可是若是是在一個循環裏,又或者該方法會被多線程同時調用到的時候,你當心的向下單步調試,發現沒有你關心的內容,又從循環開始處跑下來,仍是沒你的內容,人就開始煩燥起來。

其實,在添加斷點的時候,咱們能夠爲斷點增長必定的條件,這樣,在指定的條件知足時,斷點纔會生效。

IntelliJ IDEA內,在斷點上右擊,會彈出以下圖的條件框,輸入指定的條件便可。

有了條件斷點,不相關,不感興趣的代碼就能夠直接跳過了。

4 片段代碼

這個沒想好用什麼名字來表述。有些時候在調試過程當中,突然想招待一段與此相關,但不在源文件中的代碼來觀察一下,輔助進行問題分析。此時你會中止程序,添加代碼而後從新跑一次嗎?

在IDEA裏有一個執行代碼片段的功能,能夠在當前代碼的上下文內,執行你臨時寫的代碼。

例如,當前方法傳入一個List,但這個方法裏少一個你後面條件須要使用到的元素,此時你能夠臨時使用片段代碼執行的功能,添加一個進去。

注意,在IntelliJ IDEA裏,這個上面紅框,像個小計算器的按鈕就是臨時執行的功能,點擊以後,會彈出按鈕下方這個Evaluate Expression的框,輸入代碼,點擊右下角的Evalute便可。返回值會顯示在Result處。

這就就至關於臨時改變了變量內容。

而後,還能夠調用對象的方法,執行功能,獲取屬性值等。

5 查看變量修改值

每一個IDE在調試代碼時都提供了一個觀察當前上下文變量值的窗口。其實除了查看以外,一些非final的基本類型,還能夠直接在此處修改值。這樣若是屢次循環執行時,每次能夠恢復到指望的值,不須要重啓程序。

加Java架構師羣獲取Java工程化、高性能及分佈式、高性能、深刻淺出。高架構。性能調優、Spring,MyBatis,Netty源碼分析和大數據等多個知識點高級進階乾貨的直播免費學習權限 都是大牛帶飛 讓你少走不少的彎路的 羣..號是:855801563 對了 小白勿進 最好是有開發經驗

注:加羣要求

一、具備工做經驗的,面對目前流行的技術不知從何下手,須要突破技術瓶頸的能夠加。

二、在公司待久了,過得很安逸,但跳槽時面試碰壁。須要在短期內進修、跳槽拿高薪的能夠加。

三、若是沒有工做經驗,但基礎很是紮實,對java工做機制,經常使用設計思想,經常使用java開發框架掌握熟練的,能夠加。

四、以爲本身很牛B,通常需求都能搞定。可是所學的知識點沒有系統化,很難在技術領域繼續突破的能夠加。

5.阿里Java高級大牛直播講解知識點,分享知識,多年工做經驗的梳理和總結,帶着你們全面、科學地創建本身的技術體系和技術認知!

相關文章
相關標籤/搜索