Eclipse调试Bug的七种常用技巧(转)
如果設置Conditional,監控的變量需要比當前行高一級block,譬如for(int i=0;i<20;i++)中的i,for循環內部可以對i設置條件 (2)Java Exception Breakpoint的監控范圍是Class,不需要指定行,在Breakpoints面板右側上的圖標為J! (3)Watchpoint:針對字段
(3)Method Breakpoint:與將Line Breakpoint設在方法中的第一行相同 大家肯定都用過Eclipse的調試的功能,在調試的過程中自然也無法避免要使用斷點(breakpoint),但不知是否對Eclipse中各類斷點都有所了解。本篇圖文并茂地介紹了Eclipse中全部類型的斷點,及其設置,希望對大家有所幫助。(2011.11.20)
1. 示例程序
BreakpointDemo是一個臆造的應用程序,只是為了便于講解Eclipse中各類斷點的使用罷了。其代碼如下圖所示,
BreakpointDemo主要包含兩個方法:
[1]setValue,該方法根據指定的次數(count),對成員變量value進行賦值,值的范圍為0-9的隨機整數。
[2]printValue,該方法會調用setValue()對value進行賦值,并打印出value的值;但,如果value能被3整除,那么就會拋出IllegalArgumentException異常。
2. Line Breakpoint
Line Breakpoin是最簡單的Eclipse斷點,只要雙擊某行代碼對應的左側欄,就對該行設置上斷點。此處,對第20行代碼設置上Line Breakpoint,如下圖所示,
可以為Line Breakpoint設置一個條件,那么當程序運行到該斷點時,只有滿足設定的條件,才會被中斷。右鍵點擊第20行的斷點,選擇"Breakpoint Properties..."
在彈出的屬性對話框中,勾選上"Conditional",然后在文本框中輸入"count % 2 == 0"。
該條件表示,當程序運行到第20行時,只有當count為偶數時,程序才會被中斷。細心地話,你會發現該斷點的圖標發生了改變,多了一個問號。
3. Watchpoint
Line Breakpoint關注于程序運行的"過程",大家也常把使用這種斷點的調試稱為單步調試。但有時候,我們對程序的運行過程不太了解,可能也不太關心,不能確定在什么地方設置斷點比較合適,而可能比較關注某個關鍵變量的變化或使用。此時,就可以為該變量設置一種特殊的斷點--Watchpoint。在此示例,我們最關心的就是成員變量value的值,那么就可以為它設置一個Watchpoint,雙擊第9行代碼對應的左側欄就可以了。
使用在2中所提及的方法,查看該斷點的屬性,
默認地,當該變量被訪問或它的值被修改時,程序都會被中斷。但在本示例中,只希望當對value的值進行修改時程序才需要被中斷,所以取消對"Access"的勾選。
這時,我們會發現原來的Watchpoin圖標也有變化了。
4. Method Breakpoint
與關注對某個變量的訪問與修改一樣,我們也可以關注程序對某個方法的調用情況,即,可以設置Method Breakpoint。在此處,設置針對方法setValue的Method Breakpoint。同理,雙擊第11行代碼對應的左側欄即可。
仍然要查看該斷點的屬性。默認地,只勾選了"Entry",而沒有勾選"Exit"。
這表示,當剛進入該方法(調用開始)時,程序會被中斷;而離開該方法(調用結束)時,程序并不會被中斷。在本示例中,需要同時勾選上"Exit"。
點擊OK之后,可以看到該斷點的圖標也有所改變。
根據這里的設置,當程序運行到第20行后會在第12行被中斷,盡管這里沒有顯式的斷點,但這就是setValue()方法的入口(Entry)。必須注意地是,程序在運行到第16行時不會被中斷,盡管它看起來像是setValue()方法的出口(Exit)。實際上,程序會在第17行被中斷,這里才是setValue()調用結束的地方。
5. Exception Breakpoint
如果,我們期望某個特定異常發生時程序能夠被中斷,以方便查看當時程序所處的狀態。通過設置Exception Breakpoint就能達到這一目標。本示例故意在第23行拋出了IllegalArgumentException異常,我們期望程序運行到此處時會被中斷。但我們不直接為此行代碼設置Line Breakpoint,而是為IllegalArgumentException設置Exception Breakpoint。設置Exception Breakpoint的方法與其它類型斷點都不同,它不能通過雙擊左側欄的方式在代碼編輯器上直接進行設置。點擊Breakpoints視圖右上角形如Ji的圖標,
會彈出如下所示的對話框,
在其中選中IllegalArgumentException,并點擊OK,這時一個Exception Breakpoint就設置好了。
當value為3的倍數時,程序會在第23行被中斷,這時我們就能使用調試器來看看value具體是等于0,3或6。
6. Class Load Breakpoint
還有一種大家平時可能不太用的斷點--Class Load Breakpoint,即當某個類被加載時,通過該斷點可以中斷程序。
小結
上述的Eclipse斷點,我們在現實工作中肯定都有意或無意地使用過其中的幾種,只是不一定十分了解內情罷了。使用好Eclipse的各種斷點,可以把很好地幫助我們分析程序,定位問題。
http://www.blogjava.net/jiangshachina/archive/2011/11/20/364367.html? 摘要:本篇文章主要介紹了Eclipse在調試代碼時用到的幾種調試方法,并附于截圖方便理解。
本文寫給那些像幾年前的我一樣剛剛走出校門,及一些未使用過這些高級些的調試技巧的人。
記得剛剛畢業的時候,自己連斷點也不會打,當時還在用JCreate ,就連畢業設計也是用 System.out 找 Bug 的,想想真的很笨。開始工作后,一個星期過去了,在一個 1 、 2 百萬行的系統中找 Bug ,我依然在用 System.out ,當時最痛苦的就是修改代碼,每次找到疑似 Bug ,就輸出一下,然后重啟(那時也不知道代碼熱替換),直到有一天帶我的導師發現了這樣笨笨的調試 Bug ,才讓我第一次認識了斷點,也知道了代碼修改完了可以進行熱替換,我這個中國教育的半犧牲品才算向美好生活邁進了一小步。
1、 條件斷點
斷點大家都比較熟悉,在EclipseJava 編輯區的行頭雙擊就會得到一個斷點,代碼會運行到此處時停止。
條件斷點,顧名思義就是一個有一定條件的斷點,只有滿足了用戶設置的條件,代碼才會在運行到斷點處時停止。
在斷點處點擊鼠標右鍵,選擇最后一個"BreakpointProperties"
斷點的屬性界面及各個選項的意思如下圖,
2、 變量斷點
斷點不僅能打在語句上,變量也可以接受斷點,
上圖就是一個變量的打的斷點,在變量的值初始化,或是變量值改變時可以停止,當然變量斷點上也是可以加條件的,和上面的介紹的條件斷點的設置是一樣的。
3、 方法斷點
方法斷點就是將斷點打在方法的入口處,
方法斷點的特別之處在于它可以打在 JDK的源碼里,由于 JDK 在編譯時去掉了調試信息,所以普通斷點是不能打到里面的,但是方法斷點卻可以,可以通過這種方法查看方法的調用棧。
4、 改變變量值
代碼停在了斷點處,但是傳過來的值不正確,如何修改一下變量值保證代碼繼續走正確的流程,或是說有一個異常分支老是進不去,能不能調試時改一下條件,看一下異常分支代碼是否正確?
在Debug 視圖的 Variables 小窗口中,我們可以看到 mDestJarName 變量的值為 " F:\Study\eclipsepro\JarDir\jarHelp.jar "
我們可以在變量上右鍵,選擇"ChangeValue..." 在彈出的對話框中修改變量的值,
或是在下面的值查看窗口中修改,保用Ctr+S 保存后,變量值就會變成修改后的新值了。
5、 重新調試
這種調試的回退不是萬能的,只能在當前線程的棧幀中回退,也就說最多只能退回到當前線程的調用的開始處。
回退時,請在需要回退的線程方法上點右鍵,選擇 "DroptoFrame"
6、 遠程調試
用于調試不在本機上的程序,有兩種方式,
1、本機作為客戶端
2、本機作為服務端
使用遠程調試的前提是服務器端和客戶端的代碼是一致的。
本機作為客戶端
本機作客戶端比較常用,需要在遠端的服務器上的java程序在啟動時打開遠程調試開關,
服務器端需要加上虛擬機參數
1.5以前版本(1.5以后也可用):【-Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 】
1.5及以上版本:【 -agentlib:jdwp=transport=dt_socket,server=y,address=8000】
F:\Study\eclipsepro\screensnapjava -Xdebug -Xrunjdwp:transport=dt_socket,server=y,address=8000 -jar screensnap3.jar
連接時遠程服務器時,需要在Eclipse中新建一個遠程調試程序
這里有一個小地方需注意,連接上的時候貌似不能自動切換到Debug視圖,不要以為本機的調試程序沒有連接到服務器端。
本機作為服務端
同本機作為客戶端相比,只需要修改一下Connection Type
這時Eclipse會進入到等待連接的狀態
連接程序使用如下參數即可連接本機服務器,IP地址請用實現IP替換~~
【-agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000】
F:\Study\eclipsepro\screensnapjava -agentlib:jdwp=transport=dt_socket,suspend=y,address=127.0.0.1:8000 -jar screensnap3.jar
遠程調試時本地的代碼修改可同步到遠程,但不會寫到遠程的文件里,也就是說本地修改會在下次啟動遠程程序時就沒有了,不會影響到下次使用時的遠程代碼。
7、異常斷點
經常遇見一些異常,然后程序就退出來了,要找到異常發生的地方就比較難了,還好可以打一個異常斷點,
上圖中我們增加了一個NullPointException的異常斷點,當異常發生時,代碼會停在異常發生處,定位問題時應該比較有幫助。
?
http://kb.cnblogs.com/page/91820/
?
?
總結
以上是生活随笔為你收集整理的Eclipse调试Bug的七种常用技巧(转)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 码农如何快速打造一个有设计感的网站
- 下一篇: 用CSS伪元素制作箭头