Debug---Eclipse斷點除錯基礎

langgufu314發表於2011-09-08

1.進入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.

 

2.基礎知識篇(包含部分實踐)

Eclipse 偵錯程式本身是 Eclipse 內的一個標準外掛集。Eclipse 還有一個特殊的 Debug 檢視,用於在工作臺中管理程式的除錯或執行。它可以顯示每個除錯目標中掛起執行緒的堆疊框架。程式中的每個執行緒都顯示為樹中的一個節點,Debug 檢視顯示了每個執行目標的程式。如果某個執行緒處於掛起狀態,其堆疊框架顯示為子元素。

在使用 Eclipse 偵錯程式之前,假定您已經安裝了合適的 Java SDK/JRE(我推薦使用 Java VM V1.4)和 Eclipse Platform SDK V3.3,而且兩者的執行都沒問題。一般來說,先用 Eclipse 示例測試一下除錯選項比較好。如果想開發和除錯 C/C++ 專案,還需要獲得並安裝 C/C++ 開發工具(C/C++ Development Tools,CDT)。關於 Java SDK/JRE、Eclipse 平臺和示例以及 CDT,請參閱 參考資源。 圖 1 顯示了 Debug 透檢視的一般檢視。


圖 1. Eclipse Debug 透檢視的一般檢視
Eclipse Debug 透檢視的一般檢視

除錯 Java 語言程式

在可以除錯專案前,需要乾淨地編譯和執行程式碼。首先,需要為應用程式建立一個執行配置,確保應用程式可以正確啟動。然後,需要通過 Run > Debug 選單以類似的方式設定除錯配置。還需要選擇一個類,將它作為除錯的主 Java 類來使用(請參見圖 2)。您可以按照自己的意願為單個專案設定多個除錯配置。當偵錯程式啟動時(從 Run > Debug),會在一個新的視窗中開啟,這時就可以開始除錯了。


圖 2. 在除錯配置中設定專案的主 Java 類
在除錯配置中設定專案的主 Java 類

接下來,將討論 Eclipse 中的一些常用除錯實踐。

設定斷點

在 啟動應用程式進行除錯時,Eclipse 會自動切換到 Debug 透檢視。毫無疑問,最常見的除錯步驟是設定斷點,這樣可以檢查條件語句或迴圈內的變數和值。要在 Java 透檢視的 Package Explorer 檢視中設定斷點,雙擊選擇的原始碼檔案,在一個編輯器中開啟它。遍歷程式碼,將滑鼠放在可疑程式碼一行的標記欄(在編輯器區域的左側)上,雙擊即可設定斷點。


圖 3. 編輯器左側看到的兩個斷點
編輯器左側看到的兩個斷點

現在,從 Run > Debug 選單啟動除錯會話。最好不要將多條語句放在一行上,因為會無法單步執行,也不能為同一行上的多條語句設定行斷點。


圖 4. 檢視中左側空白處的箭頭指示當前正在執行的行
檢視中左側空白處的箭頭指示當前正在執行的行

還有一個方便的斷點檢視來管理所有的斷點。


圖 5. 斷點檢視
斷點檢視

條件斷點

一 旦瞭解到錯誤發生的位置,您可能想要知道在程式崩潰之前,程式在做什麼。一種方法就是單步執行程式的每行語句。一次執行一行,直到執行到可疑的那行程式碼。 有時,最好只執行一段程式碼,在可疑程式碼處停止執行,在這個位置檢查資料。還可以宣告條件斷點,它在表示式值發生變化時觸發(請參見圖 6)。除此之外,在輸入條件表示式時,也可以使用程式碼幫助。


圖 6. 設定條件斷點觸發器
設定條件斷點觸發器

計算表示式的值

為了在 Debug 透檢視的編輯器中計算表示式的值,選擇設定了斷點的那行程式碼,在上下文選單中,通過 Ctrl+Shift+I 或右鍵單擊您感興趣的變數(參見圖 7)選擇 Inspect 選項。在當前堆疊框架的上下文中會計算表示式的值,在 Display 視窗的 Expressions 檢視中會顯示結果。


圖 7. 通過 Inspect 選項計算表示式的值
通過 Inspect 選項計算表示式的值

剪下活動程式碼

Display 檢視允許您以剪下型別的方式處理活動程式碼(參見圖 8)。要處理一個變數,在 Display 檢視中輸入變數名即可,檢視會提示您一個熟悉的內容助手。


圖 8. Display 檢視
The Display view

當 偵錯程式停止在一個斷點處時,您可以從 Debug 檢視工具欄(參見圖 9)中選擇 Step Over 選項,繼續偵錯程式會話。該操作會越過高亮顯示的那行程式碼,繼續執行同一方法中的下一行程式碼(或者繼續執行呼叫當前方法的那個方法的下一行程式碼)。執行上一 步後發生改變的變數會用某種顏色高亮顯示(預設是黃色)。顏色可以在除錯首選項頁面中改變。


圖 9. 改變顏色的變數
改變顏色的變數

要在 Debug 檢視中掛起執行執行緒,選擇一個執行執行緒,單擊 Debug 檢視工具欄中的 Suspend。 該執行緒的當前呼叫堆疊就會顯示出來,當前執行的程式碼行就會在 Debug 透檢視中的編輯器中高亮顯示。掛起一個執行緒時,將滑鼠放在 Java 編輯器中的變數上,該變數的值就會在一個小的懸停視窗中顯示出來。此時,該執行緒的頂部堆疊框架也會自動選中,其中的可視變數也會在 Variables 檢視中顯示出來。您可以通過單擊 Variables 檢視中合適的變數名來檢查變數。

熱交換錯誤修正:動態程式碼修正

如 果執行的是 Java 虛擬機器(Java Virtual Machine,JVM)V1.4 或更高的版本,Eclipse 支援一個叫做熱交換錯誤修正(Hotswap Bug Fixing)的功能,JVM V1.3 或更低的版本不支援該功能。該功能允許在偵錯程式會話中改變原始碼,這比退出應用程式、更改程式碼、重新編譯、然後啟動另一個除錯會話更好。要利用該功能,在 編輯器中更改程式碼後重新除錯即可。由於 JVM V1.4 與 Java 平臺偵錯程式架構(Java Platform Debugger Architecture,JPDA)相容,所以才有可能具備該功能。JPDA 實現了在執行的應用程式中替換經過修改的程式碼的功能。如果應用程式啟動時間較長或執行到程式失敗的地方時間很長,那麼這一點特別有用。

如果在完成除錯時,程式還沒有全部執行一遍,在 Debug 檢視的上下文選單中選擇 Terminate 選項。容易犯的一個錯誤是在偵錯程式會話中使用 Debug 或 Run,而不是 Resume。這樣做會啟動另一個偵錯程式會話,而不是繼續當前會話。

 

3.DEBUG除錯方式(方法彙總篇)

1、 條件斷點
斷點處點選滑鼠右鍵 - 選擇"Breakpoint Properties"
勾選"Enabled" 啟動斷點
勾選"Hit Count" 輸入框寫執行次數
勾選"Enable Condition" 輸入框寫停止條件

2、 變數斷點
變數也可以接受斷點,在變數的值初始化,或是變數值改變時可以停止
可以加條件,和上面條件斷點的設定是一樣的

3、 方法斷點
方法斷點的特別之處在於它可以打在 JDK的原始碼裡
由於 JDK 在編譯時去掉了除錯資訊,所以普通斷點是不能打到裡面的
但是方法斷點卻可以,可以通過這種方法檢視方法的呼叫棧

4、 改變變數值
在Debug 檢視的 Variables 小視窗中,
可以在變數上右鍵,選擇"Change Value..." 在彈出的對話方塊中修改變數的值
或是在下面的值檢視視窗中修改,Ctr+S 儲存

5、 重新除錯
這種除錯的回退不是萬能的,最多隻能退回到當前執行緒的呼叫的開始處
回退時,請在需要回退的執行緒方法上點右鍵,選擇 "Drop to Frame"

6、 遠端除錯
用於除錯不在本機上的程式
連線時遠端伺服器時,需要在Eclipse中新建一個遠端除錯程式

7、異常斷點
要找到異常發生的地方比較困難,還好可以打一個異常斷點
Breakpoints工具框頂右第四使用"增加Exception異常斷點"
當異常發生時,程式碼會停在異常發生處,定位問題時應該比較有幫助

 

4.各種斷點設定方法(實踐篇)

大家肯定都用過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
如果,我們期望某個特定異常發生時程式能夠被中斷,以方便檢視當時程式所處的狀態。通過設定ExceptionBreakpoint就能達到這一目標。本示例故意在第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,即當某個類被載入時,通過該斷點可以中斷程式。

 

相關文章