eclipse Debug 技巧
eclipse debug 技巧
你認為你的eclipse debug技能都學會了嗎?能夠熟練運用嗎,下面一些文章裡介紹的技能值得你學習下
1: 5 Tips for Debugging Java Code in Eclipse
http://www.cavdar.net/2008/09/13/5-tips-for-debugging-java-code-in-eclipse/
2: Using the Debugger
http://eclipsetutorial.sourceforge.net/debuggerlessons.html
3:Debugging with the Eclipse Platform
http://www.ibm.com/developerworks/library/os-ecbug/
4:Java Debugging with Eclipse - Tutorial
http://www.vogella.de/articles/EclipseDebugging/article.html
翻譯部分如下:
邏輯結構
邏輯結構用來展示map或者其它collection類儲存的值。它直接展示出“邏輯”部分,而不必詳細顯示其它的內部變數。通過點選圖中所示按鈕來使用。
圖1為不啟用邏輯結構,圖2為啟用。
單步過濾
它使我們可以跳過部分程式碼,直接跳到我們需要debug的程式碼。在Window > Preferences
跳到楨
在debug時,eclipse可以直接跳到呼叫棧中指定的任意楨,並且使JVM在此處重新執行。這使你可以重新執行你的部分程式碼。
要注意的是:已經被修改的變數不會被重置,它們會保留當時的值。
使用方式:選擇呼叫棧中的一楨,點選按鈕“跳到楨”
Debug透檢視
當點選Debug按鈕時,Eclipse會提示你進入 Debug透檢視。可以在右上方Expressions視窗點選滑鼠右鍵在彈出選單中選擇 Add Watch Expression 或者點選如下圖所示按鈕則會出現,新增表示式視窗。你可以輸入你想監視的表示式。
Display視窗
在上面的新增表示式視窗,雖然可以新增表示式,但是新增表示式他沒有智慧提示功能。你可以點選 Windows->Show View –>Display 選單開啟Display檢視。再次檢視中當你輸入表示式,會有智慧提示功能。
條件斷點
有時我們需要斷點滿足某種條件是才進入斷點。此時我們可以在 斷點標記上點選滑鼠右鍵 在彈出選單上 選擇 Breakpoint Properties 選單,在斷點屬性對話方塊中 Enable Condition 複選框後,輸入需要的條件。
異常斷點
當我們設定某種異常時的斷點,是我們可以在Debug透視檢視上選中BreakPoints 視窗,在右上角點選 Add Java Exception Breakpoint 按鈕,在彈出視窗中我們可以輸入我們需要Debug的異常型別。
進入debug模式: 1、設定斷點 2、啟動servers端的debug模式 3、執行程式,在後臺遇到斷點時,進入debug除錯狀態 ============================= 作用域 功能 快捷鍵
全域性 單步返回 F7
全域性 單步跳過 F6
全域性 單步跳入 F5
全域性 單步跳入選擇 Ctrl+F5
全域性 除錯上次啟動 F11
全域性 繼續 F8
全域性 使用過濾器單步執行 Shift+F5
全域性 新增/去除斷點 Ctrl+Shift+B
全域性 顯示 Ctrl+D
全域性 執行上次啟動 Ctrl+F11
全域性 執行至行 Ctrl+R
全域性 執行 Ctrl+U
============================= 1.Step Into (also F5) 跳入
2.Step Over (also F6) 跳過
3.Step Return (also F7) 執行完當前method,然後return跳出此method
4.step Filter 逐步過濾 一直執行直到遇到未經過濾的位置或斷點(設定Filter:window-preferences-java-Debug-step Filtering)
5.resume 重新開始執行debug,一直執行直到遇到breakpoint。
例如 :A和B兩個斷點,debug過程中發現A斷點已經無用,去除A斷點,執行resume就會跳過A直接到達B斷點。
6.hit count 設定執行次數 適合程式中的for迴圈(設定 breakpoint view-右鍵hit count)
7.inspect 檢查 運算。執行一個表示式顯示執行值
8.watch 實時地監視物件、方法或變數的變化 9.我們常說的斷點(breakpoints)是指line breakpoints,除了line breakpoints,還有其他的斷點型別:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint.
10.field breakpoint 也叫watchpoint(監視點) 當成員變數被讀取或修改時暫掛
11.新增method breakpoint 進入/離開此方法時暫掛(Run-method breakpoint)
12.新增Exception breakpoint 捕抓到Execption時暫掛(待續...)
斷點屬性:
1.hit count 執行多少次數後暫掛 用於迴圈
2.enable condition 遇到符合你輸入條件(為ture\改變時)就暫掛
3.suspend thread 多執行緒時暫掛此執行緒
4.suspend VM 暫掛虛擬機器 13.variables 視圖裡的變數可以改變變數值,在variables 檢視選擇變數點選右鍵--change value.一次來進行快速除錯。
14.debug 過程中修改了某些code後--〉save&build-->resume-->重新暫掛於斷點 15.resume 當debug除錯跑出異常時,執行resume,重新從斷點開始除錯
16.如果一行有很多方法,
當第一次按F5鍵就跳入這一行第一個方法,F6一步一步除錯,F7跳出這方法.
當第二次按F5鍵就跳入這一行第二個方法,F6一步一步除錯,F7跳出這方法.
以此類推.想進入這一行第幾個方法,就按幾次F5和F7.
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的表示式是可執行程式碼,將會對程式碼結果產生永久性影響,在除錯時注意,經常將不用的表示式清除掉。