1. 程式人生 > >【Eclipse】Eclipse Debug技巧詳解

【Eclipse】Eclipse Debug技巧詳解

1、Debug基礎及介面詳解

今天瀏覽csdn,發現一文詳細的描述了Eclipse Debug中的各個知識點,非常詳盡!特此記錄。

Debug檢視

認識debug檢視,紅色部分框為執行緒堆疊檢視,黃色部分框為表示式、斷點、變數檢視,藍色部分為程式碼檢視。


 執行緒堆疊檢視

分別介紹一下這幾個按鈕的含義:

1.表示當前實現繼續執行直到下一個斷點,快捷鍵為F8。

2.表示打斷整個程序

3.表示進入當前方法,快捷鍵為F5。

4.表示執行下一行程式碼,快捷鍵為F6。

5.表示退出當前方法,返回到呼叫層,快捷鍵為F7。

6.表示當前執行緒的堆疊,從中可以看出在執行哪些程式碼,並且整個呼叫過程,以及程式碼行號



 

變數檢視

1.為變數名檢視,顯示當前程式碼行中所有可以訪問的例項變數和區域性變數

2.顯示所有的變數值

3.可以通過該視窗來改變變數值



 

斷點檢視

1.顯示所有斷點

2. 將當前視窗1中選中的埠失效,再次點選啟用。

3.異常斷點



 

表示式檢視

表示式檢視:表示式檢視是Debug過程中較為常用的一個檢視,可以對自己的感興趣的一些變數進行觀察,也可以增加一些自己的表示式,也可以檢視一行程式碼的執行結果。

1.表示式

2. 點選此可以新增一個表示式



 

程式碼檢視

程式碼檢視:用來顯示具體的程式碼。其中綠色部分是指當前將要執行的程式碼



 

場景一:小明辛苦了兩天終於將自己的負責的任務完成了,第二天轉測後,測試找到了小明說,小明的程式有bug,可以是小明經過仔細除錯,發現本地沒有任何問題,但是測試的環境上確實有問題,所以小明遇到了難題,測試的環境linux,又不能上去linux去debug,小明這個時候想要是Linux也可以debug就好了.

遠端debug

遠端debug:遠端debug顧名思義,能夠將遠端作業系統上的任何java進行debug,但是有前提是本地需要有同步的程式碼。

1.遠端debug的步驟是在遠端作業系統上啟動java程序時增加特殊的

-Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=$DEBUG_PORT,server=y,suspend=n

2.在Eclipse中新建一個Remote Java Application

遠端debug

1.開啟Debug Configurations檢視

2.右擊Remote Java Application,

New

3.選擇原始碼工程

4.輸入遠端IP和埠,埠即服務

端的$DEBUG_PORT,點選OK。


  

場景一:小明寫了一個任務執行者,該執行者不間斷的執行一些任務,在現網上運行了一段時間後,發現有概率的出現一些故障,發現執行一段時間後,該任務者異常退出了,退出的因為是空指標,可以小明想要在本地debug,不知道斷點打在哪裡,該問題是概率事件,不一定會出現,所以小明debug幾遍下來後,頭暈眼花,連程式碼都看不清楚了,小明想要是能有個斷點每當出現空指標異常的時候就停下來讓他發現問題,那該多好呀。

異常斷點

異常斷點:在定位問題的過程中,常常會遇到斷點無法打到合適的位置,以至於和問題的觸發點千差萬別,所以這個時候不妨試試異常斷點,顧名思義,異常斷點是指丟擲某種異常後自動掛起的斷點。

點選紅色部位,增加一個異常斷點



 

輸入想要定位的異常型別,例如NullPointerException,這樣系統中丟擲任何NullPointerException異常後,都會掛起當前執行緒,給你機會去定位問題。

場景一:小明寫了一個巨大的迴圈,在調測程式碼時,小明發現每當迴圈到第100000次的時候,就是出現問題,沒有達到自己的預期,於是小明在迴圈裡打了個斷點,想看看到底怎麼回事,可小明萬萬沒有想到,想要到達100000次迴圈是多麼的困難,小明這個時候已經開始浮想聯翩,如果能有這樣的斷點:

             If 迴圈次數== 100000,執行緒停下來

條件斷點

如右圖,迴圈1000次,如果想要在迴圈到500

次的時候停下來,可以建立一個條件斷點,右

擊斷點懸著Breakpoint Properties。



 

選中Enable Condition

在空白處,新增你自己的條件,如果條件返回true,執行緒會被掛起,如果為false,則忽略該異常

Hit Count為該斷點經過多少次後,正式掛起執行緒,如果設定為500,則表達前499次,經過該斷點都不會停下,當第500次,該斷點會掛起當前執行緒。

 

 表示式

表示式可以檢視一些在當前程式碼中沒有的命令列,方便定位問題。

場景一:小明最近遇到一個難題,在呼叫一個第三方外掛時總是會有問題,小明懷疑是第三方外掛的bug,但小明沒有找到原始碼不能進行debug,小明該怎麼辦呢?

Debug定位第三方外掛的問題

1.使用反編譯工具將程式碼反編譯

2.將反編譯後的原始碼進行過濾

3.修復原始碼編譯錯誤

4.進行debug

Debug一些經驗

1.儘量減少debug,少用debug,優秀的程式設計師總是花80%的時間來思考如何解決問題,20%的時間來動手完成程式碼,而糟糕的程式設計師總是用20%的時間去寫程式碼,80%的時間去除錯程式碼,動手之前儘量想好如何去做,並且已經為你自己的思路做了充分的實驗。

2.儘可能的提高debug的效率,設定合適的斷點,使用快捷鍵。

3.debug的F6快捷鍵經常用到,它與金山詞霸的快捷鍵衝突,所以在debug的時候最好將金山詞霸關掉。

4.debug的表示式是可執行程式碼,將會對程式碼結果產生永久性影響,在除錯時注意,經常將不用的表示式清除掉。

http://blog.csdn.net/jackpk/article/details/7655777

2、Debug高階技巧

九個技巧:

  1. 邏輯結構
  2. 條件debug
  3. 異常斷點
  4. 單步過濾
  5. 跳到幀
  6. Inspect
  7. expressions
  8. display
  9. 遠端debug

  最早開始用eclipse的debug的時候,只會F5 F6 F7 F8,甚至F7都不是很搞的明白是怎麼用的,那時候資淺,碰不到需要複雜debug的程式碼,慢慢工作深入了,場景碰多了,就需要各種debug技巧來提升定位bug效率,以前找人幫忙排查問題,看他開各種視窗debug各種溜甚是羨慕嫉妒恨,慢慢久病成醫自己也用溜了eclipse的一些主要的debug技巧。稍作整理分享出來。

  F5678這四個基本技能就略過不說了,但是最基本的技能能解決90%問題,所以雖然略過不說 ,但是必須用的很溜,相信園友達人們這四個肯定比我用的溜的多。

1. 邏輯結構

邏輯結構主要用來展示map之類的collection資料結構儲存的值的,它只展示儲存值的邏輯部分,而遮蔽了資料結構詳細的內部結構,更方便我們檢視map之類collection結構裡儲存的值,推薦使用。

這個按鈕就是展示邏輯結構的按鈕,下面兩個圖,上圖是不展示邏輯結構,下圖是展示邏輯結構,很明顯,下圖的結構可讀性更強,可以專注於debug的變數。

2. 條件debug

條件debug用在需要滿足某種條件才會觸發斷點的場景,比如只有id是12345這條記錄會有問題,那就當id等於12345時才觸發斷點,其他都放過。

右擊斷點選擇斷點屬性,就能看到這樣一個配置框,右邊的文字區塊可以填寫條件程式碼,比如id==12345,由於每次都要做這個判斷,如果迴圈數很大的話,還是有點點慢的,你可以去上個廁所接個水啊什麼的,還是很方便的。

3. 異常斷點

異常斷點只要用在debug某種異常的時候,可以配置當這個異常出現後才觸發斷點,不需要debug去尋找異常。

點選這個紅圈就能彈出異常斷點的視窗,會列出你係統裡的所有異常類,然後選擇需要斷點的異常就OK。

4. 單步過濾

單步過濾的場景是我們在使用F5來跟到某個方法內部的時候,經常會跟到一些我們確定不需要看的方法內部。

this.getTradeDetail(uid, itemStr.subString(0,5))

比如這行程式碼,想F5進入getTradeDetail內部,會首先執行itemStr.subString方法,會先進入subString方法,而這方法是jdk的String方法,確定沒問題,不需要關心,單步過濾就是跳過這些我們想忽略的方法直接到目標方法內部的一種debug技巧。

在Window > PreferencesJava > Debug > Step Filtering 設定過濾器, 可以選擇需要過濾掉的包和類。同時要確保你在debug檢視中啟用了單步過濾,如下圖。這樣在使用單步除錯的時候,就會使用到這個過濾功能。

上圖是過濾器配置,典型的就是把jdk的一些類和包配置過濾。下圖是要在debug時候開啟單步過濾,否則不生效。

5. 跳到幀

跳到幀是一種重入技巧,在debug時,eclipse可以直接跳到呼叫棧中指定的任意楨,並且使JVM在此處重新執行。這使你可以重新執行你的部分程式碼,而不需要為了除錯之前的程式碼而重新來一次。

要注意的是:已經被修改的變數不會被重置,它們會保留當時的值。

使用方式:選擇呼叫棧中的一楨,點選按鈕“跳到楨”

6. Inspect

inspect用來檢視某個表示式的之,對於變數值debug很容檢視,但是對於一個表示式的值就不容易檢視,還是這句:

this.getTradeDetail(uid, itemStr.subString(0,5))

想看getTradeDetail的值,就沒法想看變數值一樣(雖然這個很有可能是賦值給一個變數...),要看這種表示式值,就需要inspect,具體做法是選中這行表示式,然後右擊->inspect,或者更方便的快捷鍵組合:ctrl+shift+i,會彈出如下的展示表示式結果的框:

7. expressions

expressions視窗也是用來看變數或者表示式的值的,在windows->show viewz中開啟expression視窗,然後在裡面新增你想觀察的表示式,比如還是這句:

this.getTradeDetail(uid, itemStr.subString(0,5))

然後debug的時候,就能看到被新增的表示式結果了,另外也能根據需要改value的值。

8. display

display也是用來觀察和修改變數or表示式的,這個應該用的人比較多,在windows->show viewz中開啟display視窗,可以在display窗口裡寫表示式,然後右擊選擇display執行檢視結果或者ctrl+shift+D快捷鍵組合,表示式可以是程式中一行程式碼或者你自己寫的一個賦值語句來改變變數值之類的。

9. 遠端debug

遠端debug可以用來除錯遠端伺服器上的程式碼,保證你原生代碼和遠端部署的程式碼是一致,就可以通過這種方式debug伺服器程式碼,這個是java web開發的一大利器,否則定位伺服器問題簡直是災難。

遠端debug需要伺服器端啟動jvm的時候做一些開啟和埠的配置,具體的配置網上很多,搜一下即可。然後在本地的debug configuration中雙擊新增一個remote java application,填寫遠端主機的host和配置的debug埠,就可以開始debug了,如下圖:

我平時用到的主要就是這些了,如果有其他的feature,歡迎園友達人們補充。

http://www.cnblogs.com/lingiu/p/3802391.html

歡迎關注公眾號: