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
轉自:http://dikar.iteye.com/blog/1014377
翻譯部分如下:
邏輯結構
邏輯結構用來展示map或者其它collection類存儲的值。它直接展示出“邏輯”部分,而不必詳細顯示其它的內部變量。通過點擊圖中所示按鈕來使用。
圖1爲不啓用邏輯結構,圖2爲啓用。
單步過濾
它使我們可以跳過部分代碼,直接跳到我們需要debug的代碼。在Window > PreferencesJava > Debug > Step Filtering 設置過濾器, 可以選擇需要過濾掉的包和類。同時要確保你在debug視圖中啓用了單步過濾,如下圖。這樣在使用單步調試的時候,就會使用到這個過濾功能。
跳到楨
在debug時,eclipse可以直接跳到調用棧中指定的任意楨,並且使JVM在此處重新運行。這使你可以重新運行你的部分代碼。
要注意的是:已經被修改的變量不會被重置,它們會保留當時的值。
使用方式:選擇調用棧中的一楨,點擊按鈕“跳到楨”
Debug透視圖
http://www.cnblogs.com/Jamesliang/archive/2010/01/09/1643188.html
當點擊Debug按鈕時,Eclipse會提示你進入 Debug透視圖。可以在右上方Expressions窗口點擊鼠標右鍵在彈出菜單中選擇 Add Watch Expression 或者點擊如下圖所示按鈕則會出現,添加表達式窗口。你可以輸入你想監視的表達式。
Display窗口
在上面的添加表達式窗口,雖然可以添加表達式,但是添加表達式他沒有智能提示功能。你可以點擊 Windows->Show View –>Display 菜單打開Display視圖。再次視圖中當你輸入表達式,會有智能提示功能。
條件斷點
有時我們需要斷點滿足某種條件是才進入斷點。此時我們可以在 斷點標記上點擊鼠標右鍵 在彈出菜單上 選擇 Breakpoint Properties 菜單,在斷點屬性對話框中 Enable Condition 複選框後,輸入需要的條件。
異常斷點
當我們設置某種異常時的斷點,是我們可以在Debug透視視圖上選中BreakPoints 視窗,在右上角點擊 Add Java Exception Breakpoint 按鈕,在彈出窗口中我們可以輸入我們需要Debug的異常類型。
全局 單步返回 F7
全局 單步跳過 F6
全局 單步跳入 F5
全局 單步跳入選擇 Ctrl+F5
全局 調試上次啓動 F11
全局 繼續 F8
全局 使用過濾器單步執行 Shift+F5
全局 添加/去除斷點 Ctrl+Shift+B
全局 顯示 Ctrl+D
全局 運行上次啓動 Ctrl+F11
全局 運行至行 Ctrl+R
全局 執行 Ctrl+U
=============================
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 實時地監視對象、方法或變量的變化
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 暫掛虛擬機
14.debug 過程中修改了某些code後--〉save&build-->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的表達式是可執行代碼,將會對代碼結果產生永久性影響,在調試時注意,經常將不用的表達式清除掉。