Debug---Eclipse斷點(diǎn)調(diào)試基礎(chǔ)
1.進(jìn)入debug模式(基礎(chǔ)知識(shí)列表)
1、設(shè)置斷點(diǎn)?
2、啟動(dòng)servers端的debug模式?
3、運(yùn)行程序,在后臺(tái)遇到斷點(diǎn)時(shí),進(jìn)入debug調(diào)試狀態(tài)?
=============================?
作用域 功能 快捷鍵?
全局 單步返回 F7?
全局 單步跳過 F6?
全局 單步跳入 F5?
全局 單步跳入選擇 Ctrl+F5?
全局 調(diào)試上次啟動(dòng) F11?
全局 繼續(xù) F8?
全局 使用過濾器單步執(zhí)行 Shift+F5?
全局 添加/去除斷點(diǎn) Ctrl+Shift+B?
全局 顯示 Ctrl+D?
全局 運(yùn)行上次啟動(dòng) Ctrl+F11?
全局 運(yùn)行至行 Ctrl+R?
全局 執(zhí)行 Ctrl+U?
=============================?
1.Step Into (also F5) 跳入?
2.Step Over (also F6) 跳過?
3.Step Return (also F7) 執(zhí)行完當(dāng)前method,然后return跳出此method?
4.step Filter 逐步過濾 一直執(zhí)行直到遇到未經(jīng)過濾的位置或斷點(diǎn)(設(shè)置Filter:window-preferences-java-Debug-step Filtering)?
5.resume 重新開始執(zhí)行debug,一直運(yùn)行直到遇到breakpoint。?
??? 例如 :A和B兩個(gè)斷點(diǎn),debug過程中發(fā)現(xiàn)A斷點(diǎn)已經(jīng)無用,去除A斷點(diǎn),運(yùn)行resume就會(huì)跳過A直接到達(dá)B斷點(diǎn)。?
6.hit count 設(shè)置執(zhí)行次數(shù) 適合程序中的for循環(huán)(設(shè)置 breakpoint view-右鍵hit count)?
7.inspect 檢查 運(yùn)算。執(zhí)行一個(gè)表達(dá)式顯示執(zhí)行值?
8.watch 實(shí)時(shí)地監(jiān)視對(duì)象、方法或變量的變化?
9.我們常說的斷點(diǎn)(breakpoints)是指line breakpoints,除了line breakpoints,還有其他的斷點(diǎn)類型:field(watchpoint)breakpoint,method breakpoint ,exception breakpoint.?
10.field breakpoint 也叫watchpoint(監(jiān)視點(diǎn)) 當(dāng)成員變量被讀取或修改時(shí)暫掛?
11.添加method breakpoint 進(jìn)入/離開此方法時(shí)暫掛(Run-method breakpoint)?
12.添加Exception breakpoint 捕抓到Execption時(shí)暫掛(待續(xù)...)?
斷點(diǎn)屬性:?
?? 1.hit count 執(zhí)行多少次數(shù)后暫掛 用于循環(huán)?
?? 2.enable condition 遇到符合你輸入條件(為ture改變時(shí))就暫掛?
?? 3.suspend thread 多線程時(shí)暫掛此線程?
?? 4.suspend VM 暫掛虛擬機(jī)?
13.variables 視圖里的變量可以改變變量值,在variables 視圖選擇變量點(diǎn)擊右鍵--change value.一次來進(jìn)行快速調(diào)試。?
14.debug 過程中修改了某些code后--〉save&build-->resume-->重新暫掛于斷點(diǎn)?
15.resume 當(dāng)debug調(diào)試跑出異常時(shí),運(yùn)行resume,重新從斷點(diǎn)開始調(diào)試?
16.如果一行有很多方法,?
當(dāng)?shù)谝淮伟碏5鍵就跳入這一行第一個(gè)方法,F6一步一步調(diào)試,F7跳出這方法.?
當(dāng)?shù)诙伟碏5鍵就跳入這一行第二個(gè)方法,F6一步一步調(diào)試,F7跳出這方法.?
以此類推.想進(jìn)入這一行第幾個(gè)方法,就按幾次F5和F7.
?
2.基礎(chǔ)知識(shí)篇(包含部分實(shí)踐)
Eclipse 調(diào)試器本身是 Eclipse 內(nèi)的一個(gè)標(biāo)準(zhǔn)插件集。Eclipse 還有一個(gè)特殊的 Debug 視圖,用于在工作臺(tái)中管理程序的調(diào)試或運(yùn)行。它可以顯示每個(gè)調(diào)試目標(biāo)中掛起線程的堆??蚣堋3绦蛑械拿總€(gè)線程都顯示為樹中的一個(gè)節(jié)點(diǎn),Debug 視圖顯示了每個(gè)運(yùn)行目標(biāo)的進(jìn)程。如果某個(gè)線程處于掛起狀態(tài),其堆??蚣茱@示為子元素。
在使用 Eclipse 調(diào)試器之前,假定您已經(jīng)安裝了合適的 Java SDK/JRE(我推薦使用 Java VM V1.4)和 Eclipse Platform SDK V3.3,而且兩者的運(yùn)行都沒問題。一般來說,先用 Eclipse 示例測(cè)試一下調(diào)試選項(xiàng)比較好。如果想開發(fā)和調(diào)試 C/C++ 項(xiàng)目,還需要獲得并安裝 C/C++ 開發(fā)工具(C/C++ Development Tools,CDT)。關(guān)于 Java SDK/JRE、Eclipse 平臺(tái)和示例以及 CDT,請(qǐng)參閱?參考資源。 圖 1 顯示了 Debug 透視圖的一般視圖。
圖 1. Eclipse Debug 透視圖的一般視圖
調(diào)試 Java 語言程序
? ? ? ?在可以調(diào)試項(xiàng)目前,需要干凈地編譯和運(yùn)行代碼。首先,需要為應(yīng)用程序創(chuàng)建一個(gè)運(yùn)行配置,確保應(yīng)用程序可以正確啟動(dòng)。然后,需要通過?Run > Debug?菜單以類似的方式設(shè)置調(diào)試配置。還需要選擇一個(gè)類,將它作為調(diào)試的主 Java 類來使用(請(qǐng)參見圖 2)。您可以按照自己的意愿為單個(gè)項(xiàng)目設(shè)置多個(gè)調(diào)試配置。當(dāng)調(diào)試器啟動(dòng)時(shí)(從?Run > Debug),會(huì)在一個(gè)新的窗口中打開,這時(shí)就可以開始調(diào)試了。
圖 2. 在調(diào)試配置中設(shè)置項(xiàng)目的主 Java 類
接下來,將討論 Eclipse 中的一些常用調(diào)試實(shí)踐。
設(shè)置斷點(diǎn)
? ? ? ?在啟動(dòng)應(yīng)用程序進(jìn)行調(diào)試時(shí),Eclipse 會(huì)自動(dòng)切換到 Debug 透視圖。毫無疑問,最常見的調(diào)試步驟是設(shè)置斷點(diǎn),這樣可以檢查條件語句或循環(huán)內(nèi)的變量和值。要在 Java 透視圖的 Package Explorer 視圖中設(shè)置斷點(diǎn),雙擊選擇的源代碼文件,在一個(gè)編輯器中打開它。遍歷代碼,將鼠標(biāo)放在可疑代碼一行的標(biāo)記欄(在編輯器區(qū)域的左側(cè))上,雙擊即可設(shè)置斷點(diǎn)。
圖 3. 編輯器左側(cè)看到的兩個(gè)斷點(diǎn)
? ? ? ? 現(xiàn)在,從?Run > Debug?菜單啟動(dòng)調(diào)試會(huì)話。最好不要將多條語句放在一行上,因?yàn)闀?huì)無法單步執(zhí)行,也不能為同一行上的多條語句設(shè)置行斷點(diǎn)。
圖 4. 視圖中左側(cè)空白處的箭頭指示當(dāng)前正在執(zhí)行的行
還有一個(gè)方便的斷點(diǎn)視圖來管理所有的斷點(diǎn)。
圖 5. 斷點(diǎn)視圖
條件斷點(diǎn)
? ? ? ? 一 旦了解到錯(cuò)誤發(fā)生的位置,您可能想要知道在程序崩潰之前,程序在做什么。一種方法就是單步執(zhí)行程序的每行語句。一次執(zhí)行一行,直到運(yùn)行到可疑的那行代碼。 有時(shí),最好只運(yùn)行一段代碼,在可疑代碼處停止運(yùn)行,在這個(gè)位置檢查數(shù)據(jù)。還可以聲明條件斷點(diǎn),它在表達(dá)式值發(fā)生變化時(shí)觸發(fā)(請(qǐng)參見圖 6)。除此之外,在輸入條件表達(dá)式時(shí),也可以使用代碼幫助。
圖 6. 設(shè)置條件斷點(diǎn)觸發(fā)器
計(jì)算表達(dá)式的值
? ? ? ?為了在 Debug 透視圖的編輯器中計(jì)算表達(dá)式的值,選擇設(shè)置了斷點(diǎn)的那行代碼,在上下文菜單中,通過?Ctrl+Shift+I?或右鍵單擊您感興趣的變量(參見圖 7)選擇 Inspect 選項(xiàng)。在當(dāng)前堆??蚣艿纳舷挛闹袝?huì)計(jì)算表達(dá)式的值,在 Display 窗口的 Expressions 視圖中會(huì)顯示結(jié)果。
圖 7. 通過 Inspect 選項(xiàng)計(jì)算表達(dá)式的值
剪切活動(dòng)代碼
? ? ? ?Display 視圖允許您以剪切類型的方式處理活動(dòng)代碼(參見圖 8)。要處理一個(gè)變量,在 Display 視圖中輸入變量名即可,視圖會(huì)提示您一個(gè)熟悉的內(nèi)容助手。
圖 8. Display 視圖
? ? ? ?當(dāng)調(diào)試器停止在一個(gè)斷點(diǎn)處時(shí),您可以從 Debug 視圖工具欄(參見圖 9)中選擇 Step Over 選項(xiàng),繼續(xù)調(diào)試器會(huì)話。該操作會(huì)越過高亮顯示的那行代碼,繼續(xù)執(zhí)行同一方法中的下一行代碼(或者繼續(xù)執(zhí)行調(diào)用當(dāng)前方法的那個(gè)方法的下一行代碼)。執(zhí)行上一 步后發(fā)生改變的變量會(huì)用某種顏色高亮顯示(默認(rèn)是黃色)。顏色可以在調(diào)試首選項(xiàng)頁面中改變。
圖 9. 改變顏色的變量
? ? ? ? 要在 Debug 視圖中掛起執(zhí)行線程,選擇一個(gè)運(yùn)行線程,單擊 Debug 視圖工具欄中的?Suspend。 該線程的當(dāng)前調(diào)用堆棧就會(huì)顯示出來,當(dāng)前執(zhí)行的代碼行就會(huì)在 Debug 透視圖中的編輯器中高亮顯示。掛起一個(gè)線程時(shí),將鼠標(biāo)放在 Java 編輯器中的變量上,該變量的值就會(huì)在一個(gè)小的懸停窗口中顯示出來。此時(shí),該線程的頂部堆??蚣芤矔?huì)自動(dòng)選中,其中的可視變量也會(huì)在 Variables 視圖中顯示出來。您可以通過單擊 Variables 視圖中合適的變量名來檢查變量。
熱交換錯(cuò)誤修正:動(dòng)態(tài)代碼修正
? ? ? ?
? ? ? ?如果運(yùn)行的是 Java 虛擬機(jī)(Java Virtual Machine,JVM)V1.4 或更高的版本,Eclipse 支持一個(gè)叫做熱交換錯(cuò)誤修正(Hotswap Bug Fixing)的功能,JVM V1.3 或更低的版本不支持該功能。該功能允許在調(diào)試器會(huì)話中改變?cè)创a,這比退出應(yīng)用程序、更改代碼、重新編譯、然后啟動(dòng)另一個(gè)調(diào)試會(huì)話更好。要利用該功能,在 編輯器中更改代碼后重新調(diào)試即可。由于 JVM V1.4 與 Java 平臺(tái)調(diào)試器架構(gòu)(Java Platform Debugger Architecture,JPDA)兼容,所以才有可能具備該功能。JPDA 實(shí)現(xiàn)了在運(yùn)行的應(yīng)用程序中替換經(jīng)過修改的代碼的功能。如果應(yīng)用程序啟動(dòng)時(shí)間較長或執(zhí)行到程序失敗的地方時(shí)間很長,那么這一點(diǎn)特別有用。
? ? ? ?如果在完成調(diào)試時(shí),程序還沒有全部執(zhí)行一遍,在 Debug 視圖的上下文菜單中選擇 Terminate 選項(xiàng)。容易犯的一個(gè)錯(cuò)誤是在調(diào)試器會(huì)話中使用 Debug 或 Run,而不是 Resume。這樣做會(huì)啟動(dòng)另一個(gè)調(diào)試器會(huì)話,而不是繼續(xù)當(dāng)前會(huì)話。
?
3.DEBUG調(diào)試方式(方法匯總篇)
1、 條件斷點(diǎn)?
斷點(diǎn)處點(diǎn)擊鼠標(biāo)右鍵 - 選擇"Breakpoint Properties"?
勾選"Enabled" 啟動(dòng)斷點(diǎn)?
勾選"Hit Count" 輸入框?qū)戇\(yùn)行次數(shù)?
勾選"Enable Condition" 輸入框?qū)懲V箺l件?
2、 變量斷點(diǎn)?
變量也可以接受斷點(diǎn),在變量的值初始化,或是變量值改變時(shí)可以停止?
可以加條件,和上面條件斷點(diǎn)的設(shè)置是一樣的?
3、 方法斷點(diǎn)?
方法斷點(diǎn)的特別之處在于它可以打在 JDK的源碼里?
由于 JDK 在編譯時(shí)去掉了調(diào)試信息,所以普通斷點(diǎn)是不能打到里面的?
但是方法斷點(diǎn)卻可以,可以通過這種方法查看方法的調(diào)用棧?
4、 改變變量值?
在Debug 視圖的 Variables 小窗口中,?
可以在變量上右鍵,選擇"Change Value..." 在彈出的對(duì)話框中修改變量的值?
或是在下面的值查看窗口中修改,Ctr+S 保存?
5、 重新調(diào)試?
這種調(diào)試的回退不是萬能的,最多只能退回到當(dāng)前線程的調(diào)用的開始處?
回退時(shí),請(qǐng)?jiān)谛枰赝说木€程方法上點(diǎn)右鍵,選擇 "Drop to Frame"?
6、 遠(yuǎn)程調(diào)試?
用于調(diào)試不在本機(jī)上的程序?
連接時(shí)遠(yuǎn)程服務(wù)器時(shí),需要在Eclipse中新建一個(gè)遠(yuǎn)程調(diào)試程序?
7、異常斷點(diǎn)?
要找到異常發(fā)生的地方比較困難,還好可以打一個(gè)異常斷點(diǎn)?
Breakpoints工具框頂右第四使用"增加Exception異常斷點(diǎn)"?
當(dāng)異常發(fā)生時(shí),代碼會(huì)停在異常發(fā)生處,定位問題時(shí)應(yīng)該比較有幫助
?
4.各種斷點(diǎn)設(shè)置方法(實(shí)踐篇)
大家肯定都用過Eclipse的調(diào)試的功能,在調(diào)試的過程中自然也無法避免要使用斷點(diǎn)(breakpoint),但不知是否對(duì)Eclipse中各類斷點(diǎn)都有所了解。本篇圖文并茂地介紹了Eclipse中全部類型的斷點(diǎn),及其設(shè)置,希望對(duì)大家有所幫助。(2011.11.20)
1. 示例程序
? ? ?BreakpointDemo是一個(gè)臆造的應(yīng)用程序,只是為了便于講解Eclipse中各類斷點(diǎn)的使用罷了。其代碼如下圖所示,
? ? ? [1]setValue,該方法根據(jù)指定的次數(shù)(count),對(duì)成員變量value進(jìn)行賦值,值的范圍為0-9的隨機(jī)整數(shù)。
? ? ? [2]printValue,該方法會(huì)調(diào)用setValue()對(duì)value進(jìn)行賦值,并打印出value的值;但,如果value能被3整除,那么就會(huì)拋出IllegalArgumentException異常。
2. Line Breakpoint
? ? ?Line Breakpoin是最簡單的Eclipse斷點(diǎn),只要雙擊某行代碼對(duì)應(yīng)的左側(cè)欄,就對(duì)該行設(shè)置上斷點(diǎn)。此處,對(duì)第20行代碼設(shè)置上Line Breakpoint,如下圖所示,
? ? ? ? ? ? ?
? ? ? ?該條件表示,當(dāng)程序運(yùn)行到第20行時(shí),只有當(dāng)count為偶數(shù)時(shí),程序才會(huì)被中斷。細(xì)心地話,你會(huì)發(fā)現(xiàn)該斷點(diǎn)的圖標(biāo)發(fā)生了改變,多了一個(gè)問號(hào)。
3. Watchpoint
? ? ? ? ? Line Breakpoint關(guān)注于程序運(yùn)行的"過程",大家也常把使用這種斷點(diǎn)的調(diào)試稱為單步調(diào)試。但有時(shí)候,我們對(duì)程序的運(yùn)行過程不太了解,可能也不太關(guān)心,不能確定在什么地方設(shè)置斷點(diǎn)比較合適,而可能比較關(guān)注某個(gè)關(guān)鍵變量的變化或使用。此時(shí),就可以為該變量設(shè)置一種特殊的斷點(diǎn)--Watchpoint。在此示例,我們最關(guān)心的就是成員變量value的值,那么就可以為它設(shè)置一個(gè)Watchpoint,雙擊第9行代碼對(duì)應(yīng)的左側(cè)欄就可以了。
?
?
?
4. Method Breakpoint
? ? ? ? ? 與關(guān)注對(duì)某個(gè)變量的訪問與修改一樣,我們也可以關(guān)注程序?qū)δ硞€(gè)方法的調(diào)用情況,即,可以設(shè)置Method Breakpoint。在此處,設(shè)置針對(duì)方法setValue的Method Breakpoint。同理,雙擊第11行代碼對(duì)應(yīng)的左側(cè)欄即可。
?
5. Exception Breakpoint
如果,我們期望某個(gè)特定異常發(fā)生時(shí)程序能夠被中斷,以方便查看當(dāng)時(shí)程序所處的狀態(tài)。通過設(shè)置ExceptionBreakpoint就能達(dá)到這一目標(biāo)。本示例故意在第23行拋出了IllegalArgumentException異常,我們期望程序運(yùn)行到此處時(shí)會(huì)被中斷。但我們不直接為此行代碼設(shè)置Line Breakpoint,而是為IllegalArgumentException設(shè)置Exception?Breakpoint。設(shè)置Exception Breakpoint的方法與其它類型斷點(diǎn)都不同,它不能通過雙擊左側(cè)欄的方式在代碼編輯器上直接進(jìn)行設(shè)置。點(diǎn)擊Breakpoints視圖右上角形如Ji的圖標(biāo),
當(dāng)value為3的倍數(shù)時(shí),程序會(huì)在第23行被中斷,這時(shí)我們就能使用調(diào)試器來看看value具體是等于0,3或6。
6. Class Load Breakpoint
還有一種大家平時(shí)可能不太用的斷點(diǎn)--Class Load Breakpoint,即當(dāng)某個(gè)類被加載時(shí),通過該斷點(diǎn)可以中斷程序。