Eclipse的Debug調(diào)試技巧大全(總結(jié))
作為開發(fā)人員,掌握開發(fā)環(huán)境下的調(diào)試技巧十分有必要。我們?cè)诰帉慾ava程序的過(guò)程中,經(jīng)常會(huì)遇到各種莫名其妙的問(wèn)題,為了檢測(cè)程序是哪里出現(xiàn)問(wèn)題,經(jīng)常需要增加日志,看變量的值,這樣調(diào)試很麻煩。假設(shè)我每天花費(fèi)1小時(shí)在調(diào)試我的應(yīng)用程序上的話,那累積起來(lái)的話也是很大量的時(shí)間。由于這個(gè)原因,用這些時(shí)間來(lái)重視并了解所有使我們調(diào)試更方便的功能。那能為你省下一些時(shí)間,也將會(huì)使你的生活更安逸、輕松。
一、Debug視圖
調(diào)試中最常用的窗口是:
窗口 | 說(shuō)明 |
---|---|
Debug窗口 | 主要顯示當(dāng)前線程方法調(diào)用棧, 以及代碼行數(shù)(有調(diào)試信息的代碼) |
斷點(diǎn)Breakpoints窗口 | => 斷點(diǎn)列表窗口,可以方便增加斷點(diǎn),設(shè)置斷點(diǎn)條件,刪除斷點(diǎn)等 |
變量Variables窗口 | => 顯示當(dāng)前方法的本地變量,非static方法,包含this應(yīng)用,可以修改變量值 |
代碼編輯窗口 | => 這個(gè)不用多說(shuō)了 |
輸出Console窗口 | => 日志等輸出內(nèi)容,調(diào)試時(shí),可以將關(guān)注的組件級(jí)別設(shè)置低一點(diǎn),以便獲得跟多輸出信息 |
另外輔助的窗口有:
窗口 | 說(shuō)明 |
---|---|
表達(dá)式expression窗口 | => 寫上自己需要觀察的數(shù)據(jù)的表達(dá)式,或者修改變量值 |
Display窗口 | => 可以在display中執(zhí)行代碼塊,輸出內(nèi)容等 |
大綱Outline窗口 | => 查看當(dāng)前類的方法,變量等 |
類型層級(jí)Type hierarchy窗口 | => 查看當(dāng)前所在類的繼承層次,包括實(shí)現(xiàn)接口,類繼承層次 |
方法調(diào)用關(guān)系Call hierarchy窗口 | => 查看當(dāng)前方法被哪些方法調(diào)用,調(diào)用方法在哪些類中、第幾行,可以直接打開對(duì)應(yīng)的方法 |
搜索結(jié)果Search窗口 | => 結(jié)合快捷鍵可以查看變量、方法等在工作空間、項(xiàng)目、工作集中被引用或定義的代碼位置 |
1)窗口全覽:
2)Debug View(線程堆棧視圖):
debug視圖允許您在工作臺(tái)上管理正在調(diào)試和運(yùn)行的程序,他顯示了你正在調(diào)試的程序中掛起的線程的堆棧幀,程序中的每個(gè)線程作為樹的節(jié)點(diǎn)出現(xiàn)。他展示了正在運(yùn)行的每個(gè)目標(biāo)的進(jìn)程。如果線程被掛起,它的堆棧幀以子元素的形式展示。以下是一些常用的debug按鈕:
1.表示當(dāng)前實(shí)現(xiàn)繼續(xù)運(yùn)行直到下一個(gè)斷點(diǎn),快捷鍵為F8。
2.表示打斷整個(gè)進(jìn)程
3.表示進(jìn)入當(dāng)前方法,快捷鍵為F5。
4.表示運(yùn)行下一行代碼,快捷鍵為F6。
5.表示退出當(dāng)前方法,返回到調(diào)用層,快捷鍵為F7。
6.表示當(dāng)前線程的堆棧,從中可以看出在運(yùn)行哪些代碼,并且整個(gè)調(diào)用過(guò)程,以及代碼行號(hào)
詳細(xì)介紹:
Skip All Breakpoints : 將所有斷點(diǎn)設(shè)置為被跳過(guò)的,設(shè)置了Skip All Breakpoints之后,所有斷點(diǎn)上都會(huì)有一個(gè)斜線,表示斷點(diǎn)將被跳過(guò),線程不會(huì)在該斷點(diǎn)處被掛起。
Drop to Frame : 這個(gè)命令可以讓程序回到當(dāng)前方法的開頭第一行重新開始執(zhí)行,可以重新執(zhí)行這個(gè)java堆棧幀,可以選擇一個(gè)指定的堆棧幀,然后點(diǎn)擊 Drop to Frame,這樣就可以重新進(jìn)入指定的堆棧幀。使用Drop to Frame時(shí)候需要注意:
1.不能drop到已經(jīng)執(zhí)行過(guò)的方法棧中的方法中。
2.drop到stack frame中時(shí),不會(huì)改變?nèi)謹(jǐn)?shù)據(jù)原有的值,比如,一個(gè)包含元素的vertor并不會(huì)被清空。
Step Filters : 這個(gè)功能比較簡(jiǎn)單,就是當(dāng)我們?cè)赿ebug的時(shí)候想要忽略一些我們不關(guān)注的類時(shí),可以開啟Step Filters進(jìn)行過(guò)濾,程序會(huì)一直執(zhí)行直到遇到未經(jīng)過(guò)濾的位置或斷點(diǎn)。Step Filters功能由Use Step Filters,Edit Step Filters,F(xiàn)ilter Type,F(xiàn)ilter Package四項(xiàng)組成。具體操作如下:
步驟 1: Windows -> Preferences -> Java -> Debug -> Step Filtering.
步驟 2:選擇‘Use Step Filters'
步驟 3:在屏幕上選中所需的選項(xiàng)。你可以添加你自己代碼庫(kù)中的部分代碼。
步驟 4:點(diǎn)擊‘Apply'
原理上,Edit Step Filter命令用于配置Step Filter規(guī)則,而Filter Type與Filter Package分別指的是過(guò)濾的Java類型與Java Package。
Step Return : 跳出當(dāng)前方法,在被調(diào)用方法的執(zhí)行過(guò)程中,使用Step Return會(huì)在執(zhí)行完當(dāng)前方法的全部代碼后跳出該方法返回到調(diào)用該方法的方法中。
Step Over : 在單步執(zhí)行時(shí),在函數(shù)內(nèi)遇到子函數(shù)時(shí)不會(huì)進(jìn)入子函數(shù)內(nèi)單步執(zhí)行,而是將子函數(shù)整個(gè)執(zhí)行完在停止,也就是把子函數(shù)整個(gè)作為一步。
Step Into:?jiǎn)尾綀?zhí)行,遇到子函數(shù)就進(jìn)入并且繼續(xù)單步執(zhí)行
Resume:恢復(fù)暫停的線程,直接從當(dāng)前位置跳到下一個(gè)斷點(diǎn)位置。
Suspend:暫停選定的線程,這個(gè)時(shí)候可以進(jìn)行瀏覽或者修改代碼,檢查數(shù)據(jù)等。
Eclipse通過(guò)Suspend與Resume來(lái)支持線程的暫掛與恢復(fù)。一般來(lái)講,Suspend適用于多線程程序的調(diào)試,當(dāng)需要查看某一個(gè)線程的堆棧幀及變量值時(shí),我們可以通過(guò)Suspend命令將該線程暫掛。Resume用于恢復(fù)。
有兩種Resume需要注意:
第一是當(dāng)在調(diào)試過(guò)程中修改程序代碼,然后保存,點(diǎn)擊Resume,此時(shí)程序會(huì)暫掛于斷點(diǎn)。
第二是當(dāng)程序拋出異常時(shí),運(yùn)行Resume,程序也會(huì)暫掛于斷點(diǎn)。
Terminate : Eclipse通過(guò)Terminate命令終止對(duì)本地程序的調(diào)試。
Disconnect:Eclipse使用Disconnect命令來(lái)終止與遠(yuǎn)程JVM的socket連接。
1、調(diào)試執(zhí)行
標(biāo)記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
6.4 | Step Info | F5 | -> 單步進(jìn)入(如果有方法調(diào)用,將進(jìn)入調(diào)用方法中進(jìn)行調(diào)試); |
6.4 | Step Over | F6 | -> 單步跳過(guò)(不進(jìn)入行的任何方法調(diào)用中,直接執(zhí)行完當(dāng)前代碼行,并跳到下一行); |
6.4 | Step Return | F7 | -> 單步返回(執(zhí)行完當(dāng)前方法,并從調(diào)用棧中彈出當(dāng)前方法,返回當(dāng)前方法被調(diào)用處); |
6.5 | Resume | F8 | -> 恢復(fù)正常執(zhí)行(直到遇到下一個(gè)斷點(diǎn)); |
7.4 | Run to Line | Ctrl+R | -> 執(zhí)行到當(dāng)前行(將忽略中間所有斷點(diǎn),執(zhí)行到當(dāng)前光標(biāo)所在行); |
6.3 | Drop To Frame | 無(wú) | -> 回退到指定方法開始處執(zhí)行,這個(gè)功能相當(dāng)贊。 在方法調(diào)用棧上的某個(gè)方法右鍵,選擇Drop To Frame就可以從該方法的開始處執(zhí)行 比如重新執(zhí)行本方法,可以在本方法上用Drop To Frame,將從本方法的第一行重新執(zhí)行。 當(dāng)然對(duì)于有副作用的方法,比如數(shù)據(jù)庫(kù)操作,更改傳入?yún)?shù)的對(duì)象內(nèi)容等操作可能重新執(zhí)行就再是你想要的內(nèi)容了。 |
6.1+6.2 | Copy Stack | 無(wú) | -> 拷貝當(dāng)前線程棧信息 |
如果在調(diào)試時(shí),需要排除一些類、包等不需要進(jìn)入調(diào)試,可以使用Edit Step Filters設(shè)置。
A6的properties: Java進(jìn)程啟動(dòng)相關(guān)信息,包括控制臺(tái)啟動(dòng)參數(shù),環(huán)境參數(shù)等。如果參數(shù)啟動(dòng)參數(shù)有問(wèn)題可以先看看這里的實(shí)際啟動(dòng)參數(shù)是不是有誤。另外還可以查看虛擬機(jī)支持調(diào)試的相關(guān)選項(xiàng)。
2、數(shù)據(jù)查看
標(biāo)記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
7.4 | Inspect | ctrl+shift+i | -> 察看選擇的變量、表達(dá)式的值或執(zhí)行結(jié)果, 再次按ctrl+shift+i可以將當(dāng)前表達(dá)式或值添加到Expressions窗口中查看; |
7.4 | Display | ctrl+shift+d | -> 顯示選擇的變量、表達(dá)式的值或執(zhí)行結(jié)果, 再次按ctrl+shift+d可以將當(dāng)前表達(dá)式或值添加到Display窗口中顯示; |
7.4 | Execute | ctrl+u | -> 執(zhí)行選擇表達(dá)式; |
7.4 | Run to Line | ctrl+r | -> 執(zhí)行到當(dāng)前行(將忽略中間所有斷點(diǎn),執(zhí)行到當(dāng)前光標(biāo)所在行); |
7.3 | All Instances | ctrl+shift+n | -> 查看選擇的類的所有對(duì)象,這個(gè)功能超贊; |
7.3 | Instance Count | 無(wú) | -> 查看選擇的類的所有對(duì)象個(gè)數(shù); |
7.4 | Watch | 無(wú) | -> 添加當(dāng)前變量、表達(dá)式到Expressions窗口中; |
3)Variables View (變量視圖)
1.為變量名視圖,顯示當(dāng)前代碼行中所有可以訪問(wèn)的實(shí)例變量和局部變量
2.顯示所有的變量值
3.可以通過(guò)該窗口來(lái)改變變量值
Variables View顯示與Debug View中選定的堆棧幀相關(guān)的變量信息,調(diào)試Java程序時(shí),變量可以選擇將更詳細(xì)的信息顯示在詳細(xì)信息窗格中。此外,Java對(duì)象還可以顯示出其包含的屬性的值。在該窗口中選中變量鼠標(biāo)右鍵點(diǎn)擊可以進(jìn)行許多操作,主要操作有以下這些:
All Instances:打開一個(gè)對(duì)話框來(lái)顯示該java類的所有實(shí)例,使用該功能需要java虛擬機(jī)支持實(shí)例的檢索。
All References::打開一個(gè)對(duì)話框來(lái)顯示所有引用了該變量的java對(duì)象,
Change Value::更改變量的值,該功能可以和Drop to Frame聯(lián)合使用進(jìn)行程序的調(diào)試。使用這兩個(gè)功能就可以代替重新debug
Copy Variables:復(fù)制變量的值,尤其在變量值很長(zhǎng)(比如json數(shù)據(jù))的時(shí)候,這個(gè)功能就派上用場(chǎng)了。
Find:有的時(shí)候一個(gè)類中變量特別多的時(shí)候,可以進(jìn)行查找。
4)Breakpoints View (斷點(diǎn)視圖)
1.顯示所有斷點(diǎn)
2. 將當(dāng)前窗口1中選中的端口失效,再次點(diǎn)擊啟用。
3.異常斷點(diǎn)
Breakpoints View將列出你在當(dāng)前工作區(qū)間里設(shè)置的所有斷點(diǎn),雙擊斷點(diǎn)可以進(jìn)入到程序中該斷點(diǎn)的位置。還可以啟用或禁用斷點(diǎn),刪除,添加新的,根據(jù)工作組或點(diǎn)命中計(jì)數(shù)給他們分組。在使用斷點(diǎn)是有以下兩個(gè)技巧是十分有用的:
Hit Count: 是指定斷點(diǎn)處的代碼段運(yùn)行多少次,最典型的就是循環(huán),如果要讓一個(gè)循環(huán)執(zhí)行10次就線程掛起,則指定Hit Count值為10,那么當(dāng)前的循環(huán)執(zhí)行到第九次的時(shí)候就會(huì)掛掉。
Conditional:顧名思義,就是條件判斷,例如我們需要循環(huán)變量i==10時(shí),線程掛起,則條件設(shè)定為i==10,選擇Suspend when “true”。
那如果上面的Hit Count和Conditional都選擇的話,如果表達(dá)式和值設(shè)置不合理則會(huì)失效。如果選擇Suspend when value changes,那么可能在Conditional在變量值發(fā)生改變的時(shí)候就掛起。
5)Expressions View (表達(dá)式視圖)
1.表達(dá)式
2. 點(diǎn)擊此可以新增一個(gè)表達(dá)式
要在 Debug 透視圖的編輯器中求表達(dá)式的值,選中設(shè)置有斷點(diǎn)的一整行,并在上下文菜單中選擇 Inspect 選項(xiàng)。表達(dá)式是在當(dāng)前堆棧幀的上下文中求值的,其結(jié)果顯示在 Display 窗口的 Expressions 視圖中。 比如我想要計(jì)算變量a+b的值,那么就可以在表達(dá)式視圖中加一個(gè)表達(dá)式:a+b
6)Display View
可以使用這個(gè)視圖,輸入或者演算一些新的代碼。這些代碼在當(dāng)前的調(diào)試位置的上下文環(huán)境中被執(zhí)行,這意味著,你可以使用所有變量甚至是內(nèi)容助手。要執(zhí)行你的代碼的話,只需標(biāo)記它,并使用右鍵菜單或者CTRL+U(執(zhí)行)或者 CTRL+SHIFT+I (檢查)
7)代碼查看輔助窗口
1、代碼視圖:
代碼視圖,用來(lái)顯示具體的代碼。其中綠色部分是指當(dāng)前將要執(zhí)行的代碼
標(biāo)記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
11.1~11.5 | quick type hierarchy | ctrl+t | 查看當(dāng)前類、接口的繼承層次, 默認(rèn)進(jìn)入時(shí),顯示繼承/實(shí)現(xiàn)當(dāng)前類/方法的子類,子接口11.1;再次ctrl+t,將顯示當(dāng)前類、接口繼承/實(shí)現(xiàn)的超類/接口11.2;調(diào)試時(shí),經(jīng)常用該功能,在接口或抽象類的方法調(diào)用處11.3,ctrl+t察看實(shí)現(xiàn)類11.4,直接導(dǎo)航到對(duì)應(yīng)的實(shí)現(xiàn)方法中11.5。 |
quick outline | ctrl+o | 查看當(dāng)前類的大綱,包括方法,屬性等內(nèi)容; 用處不大; | |
open declarations | F3 | 查看變量、屬性、方法定義的地方 |
2、Call Hierarchy窗口:
標(biāo)記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
12.1~12.2 | open call hierarchy | ctrl+alt+h | 查看方法被調(diào)用層次, 可以看當(dāng)前方法被調(diào)用的地方12.1,或者當(dāng)前方法調(diào)用了其他類的方法12.2 |
3、Type Hierarchy窗口:
標(biāo)記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
13.1~13.4 | open type hierarchy | F4 | 查看繼承層次, 可以查看類的繼承層次,包括子類父類13.1, 或者類實(shí)現(xiàn)的接口繼承層次13.2,還會(huì)根據(jù)選擇的類/接口,在右邊顯示該類的大綱13.3、 13.4; 13.3可以選擇是否顯示父類/父接口的屬性、方法等 |
4、Search 窗口:
標(biāo)記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
14.1 | declarations | ctrl+g | 相同的方法簽名在工作空間中及第三方j(luò)ar包中被定義的位置14.1 |
14.2 | references | ctrl+shif+g | 當(dāng)前選中的變量、屬性、方法在工作空間中及第三方j(luò)ar包中被引用的位置14.2 |
14.3 | ctrl+shift+u | 查看變量、屬性 、方法在當(dāng)前類中出現(xiàn)的地方14.3 | |
14.4 | implements | 查看實(shí)現(xiàn)當(dāng)前接口的類14.8 | |
14.4~14.7 | 顯示方式 | 可以選擇不同的顯示方式,具體看圖 |
二、Debug
1.設(shè)置斷點(diǎn)
在源代碼文件中,在想要設(shè)置斷點(diǎn)的代碼行的前面的標(biāo)記行處,雙擊鼠標(biāo)左鍵就可以設(shè)置斷點(diǎn),在相同位置再次雙擊即可取消斷點(diǎn)。有的時(shí)候我們還有這樣的需要,就是我并不想一行一行的執(zhí)行代碼,比如一個(gè)for循環(huán)會(huì)循環(huán)1000多遍,我只想在第500遍的時(shí)候讓線程掛起進(jìn)行調(diào)試,這個(gè)時(shí)候我們可以使用條件斷點(diǎn)。 設(shè)置條件斷點(diǎn):我們可以給該斷點(diǎn)設(shè)置觸發(fā)條件,一旦滿足某條件是才開始調(diào)試,可以在斷點(diǎn)處點(diǎn)擊鼠標(biāo)右鍵,選擇Breakpoint Properties進(jìn)入斷點(diǎn)設(shè)置頁(yè)面,剛剛在講斷點(diǎn)視圖的時(shí)候我們學(xué)到過(guò)Hit Count和Conditional的用法,這里可以設(shè)置條件和執(zhí)行次數(shù)。
1.1)斷點(diǎn)類型及斷點(diǎn)窗口
在調(diào)試中可以設(shè)置的斷點(diǎn)類型有五種:
1.行斷點(diǎn)(line breakpoints) : 條件斷點(diǎn),顧名思義就是一個(gè)有一定條件的斷點(diǎn),只有滿足了用戶設(shè)置的條件,代碼才會(huì)在運(yùn)行到斷點(diǎn)處時(shí)停止。
2.方法斷點(diǎn)(method breakpoints ): 方法斷點(diǎn)的特別之處在于它可以打在 JDK的源碼里,由于 JDK 在編譯時(shí)去掉了調(diào)試信息,所以普通斷點(diǎn)是不能打到里面的,但是方法斷點(diǎn)卻可以,可以通過(guò)這種方法查看方法的調(diào)用棧。
3.觀察斷點(diǎn)(watch breakpoints-成員變量訪問(wèn)變更)
4.異常斷點(diǎn)(exception breakpoints)
5.類加載斷點(diǎn)(class load breakpoints)
每種斷點(diǎn)的設(shè)置有些許不一樣,可以在斷點(diǎn)上右鍵->Breakpoint properties進(jìn)行設(shè)置,但一般在斷點(diǎn)窗口有快速設(shè)置的界面,Breakpoint properties中多了filter, 其實(shí)比較雞肋,用處不大。
斷點(diǎn)相關(guān)的快捷鍵:
快捷鍵 | 說(shuō)明 |
---|---|
ctrl+shift+b | 在光標(biāo)處大斷點(diǎn)/取消斷點(diǎn) |
ctrl+alt+b | 忽略所有斷點(diǎn) |
Alt+shift+q, b | 激活斷點(diǎn)窗口 |
1、行斷點(diǎn): 在方法中的某一行上打斷點(diǎn)1.1、1.4。行斷點(diǎn)可以設(shè)置掛起線程/VM的條件1.3,訪問(wèn)次數(shù)1.2。
1.3中的條件是,spring在注冊(cè)Bean定義(registerBeanDefinition)時(shí),如果是org.springframework.demo.MyBean,就掛起線程,可以開始單步調(diào)試了。
對(duì)于命中次數(shù)(hit count)1.2的使用,一般是在循環(huán)中,第N個(gè)對(duì)象的處理有問(wèn)題,設(shè)置hit count = N, 重調(diào)試時(shí),可以方便到達(dá)需要調(diào)試的循環(huán)次數(shù)時(shí),停下來(lái)調(diào)試。
2、方法斷點(diǎn):在方法上打斷點(diǎn)2.1、2.2。方法斷點(diǎn)的好處是可以從方法方法進(jìn)入或者退出時(shí)2.3,停下來(lái)調(diào)試,類似行斷點(diǎn),而且只有行斷點(diǎn)和方法斷點(diǎn)有條件和訪問(wèn)次數(shù)的設(shè)置功能。
但是方法斷點(diǎn)還有另外一個(gè)好處,如果代碼編譯時(shí),指定不攜帶調(diào)試信息,行斷點(diǎn)是不起作用的,只能打方法斷點(diǎn)。
有興趣的可以通過(guò)A1將Add line number… 前的勾去掉, 調(diào)試下看看。
3、觀察斷點(diǎn): 在成員變量上打的斷點(diǎn)3.1、3.3。只有對(duì)象成員變量有效果,靜態(tài)成員變量不起作用。
可以設(shè)置變量被訪問(wèn)或者設(shè)置的時(shí)候掛起線程/VM 3.2,也就是類似3.4的所有對(duì)成員變量的訪問(wèn)或者設(shè)置的方法都會(huì)被監(jiān)控到
4、異常斷點(diǎn): 異常斷點(diǎn)可以通過(guò)4.6添加,或者點(diǎn)擊日志信息中輸出的異常類信息添加。
異常斷點(diǎn)4.1,系統(tǒng)發(fā)生異常時(shí),在被捕獲異常的拋出位置處或者程序未捕獲的異常拋出處4.2、4.4, 掛起線程/VM, 也可以指定是否包括異常的子類也被檢測(cè)4.3、4.5。
另外除了以上正常設(shè)置的異常掛起,從java->debug中可以設(shè)置掛起執(zhí)行,主要有下面兩個(gè):
1、是否在發(fā)生全局未捕獲時(shí)掛起(suspend execution on uncaught exceptions),調(diào)試時(shí),老是有異常掛起影響調(diào)試,但是沒(méi)有設(shè)置異常斷點(diǎn)的情況,就可以勾選掉這個(gè)選項(xiàng);
2、是否在編譯錯(cuò)誤時(shí)掛起,一般在邊調(diào)試邊改代碼時(shí)會(huì)發(fā)生這種情況;
另外要提一個(gè)的是有main方法啟動(dòng)的應(yīng)用,可以在調(diào)試配置中勾選stop in main A3, 程序進(jìn)入時(shí),會(huì)掛起線程,等待調(diào)試。
5、類加載斷點(diǎn): 在類名上打的斷點(diǎn)5.1。接口上是打不了類加載斷點(diǎn)的,但是抽象類是可以的,只是在調(diào)試的時(shí)候,斷點(diǎn)不會(huì)明顯進(jìn)入classloader中,單步進(jìn)入知會(huì)進(jìn)入到子類的構(gòu)造方法中,非抽象類在掛起線程后單步進(jìn)入就會(huì)到classloader中(如果沒(méi)有filter過(guò)濾掉的話)5.3。類加載斷點(diǎn)不管是打在抽象或者非抽象類上,都會(huì)在類第一次加載或者第一個(gè)子類第一次被加載時(shí),掛起線程/VM5.2。
2.調(diào)試程序
1、調(diào)試本地 Java 語(yǔ)言程序
在所有調(diào)試中,調(diào)試一個(gè)Java程序是最簡(jiǎn)單的,主要有設(shè)置斷點(diǎn)、啟動(dòng)調(diào)試、單步執(zhí)行、結(jié)束調(diào)試幾步。
1)設(shè)置斷點(diǎn):
2)啟動(dòng)調(diào)試:Eclipse提供四種方式來(lái)啟動(dòng)程序(Launch)的調(diào)試,分別是通過(guò)菜單(Run –> Debug)、圖標(biāo)(“綠色臭蟲”)、右鍵->Debug As以及快捷鍵(F11),在這一點(diǎn)上,與其他命令(例如Run)類似。
彈出提示,需要切換到調(diào)試(Debug)工作區(qū),勾選“Remember my decision”,記住選擇,則下次不再提示,然后點(diǎn)擊【Yes】。
3)單步執(zhí)行:主要使用前面講過(guò)的幾個(gè)視圖進(jìn)行調(diào)試,其中debug視圖中的幾個(gè)按鈕有快捷鍵:
Step Retuen(F7)
Step Over (F6)
Step Into (F5)
結(jié)束調(diào)試:通過(guò)Terminate命令終止對(duì)本地程序的調(diào)試。
二、案例
場(chǎng)景一:小明寫了一個(gè)任務(wù)執(zhí)行者,該執(zhí)行者不間斷的執(zhí)行一些任務(wù),在現(xiàn)網(wǎng)上運(yùn)行了一段時(shí)間后,發(fā)現(xiàn)有概率的出現(xiàn)一些故障,發(fā)現(xiàn)運(yùn)行一段時(shí)間后,該任務(wù)者異常退出了,退出的因?yàn)槭强罩羔?,可以小明想要在本地debug,不知道斷點(diǎn)打在哪里,該問(wèn)題是概率事件,不一定會(huì)出現(xiàn),所以小明debug幾遍下來(lái)后,頭暈眼花,連代碼都看不清楚了,小明想要是能有個(gè)斷點(diǎn)每當(dāng)出現(xiàn)空指針異常的時(shí)候就停下來(lái)讓他發(fā)現(xiàn)問(wèn)題,那該多好呀。
異常斷點(diǎn)
異常斷點(diǎn):在定位問(wèn)題的過(guò)程中,常常會(huì)遇到斷點(diǎn)無(wú)法打到合適的位置,以至于和問(wèn)題的觸發(fā)點(diǎn)千差萬(wàn)別,所以這個(gè)時(shí)候不妨試試異常斷點(diǎn),顧名思義,異常斷點(diǎn)是指拋出某種異常后自動(dòng)掛起的斷點(diǎn)。
點(diǎn)擊紅色部位,增加一個(gè)異常斷點(diǎn)
輸入想要定位的異常類型,例如NullPointerException,這樣系統(tǒng)中拋出任何NullPointerException異常后,都會(huì)掛起當(dāng)前線程,給你機(jī)會(huì)去定位問(wèn)題。
場(chǎng)景二:小明寫了一個(gè)巨大的循環(huán),在調(diào)測(cè)代碼時(shí),小明發(fā)現(xiàn)每當(dāng)循環(huán)到第100000次的時(shí)候,就是出現(xiàn)問(wèn)題,沒(méi)有達(dá)到自己的預(yù)期,于是小明在循環(huán)里打了個(gè)斷點(diǎn),想看看到底怎么回事,可小明萬(wàn)萬(wàn)沒(méi)有想到,想要到達(dá)100000次循環(huán)是多么的困難,小明這個(gè)時(shí)候已經(jīng)開始浮想聯(lián)翩,如果能有這樣的斷點(diǎn):
If 循環(huán)次數(shù)== 100000,線程停下來(lái)
條件斷點(diǎn)
如右圖,循環(huán)1000次,如果想要在循環(huán)到500次的時(shí)候停下來(lái),可以創(chuàng)建一個(gè)條件斷點(diǎn),右擊斷點(diǎn)懸著Breakpoint Properties。
選中Enable Condition
在空白處,添加你自己的條件,如果條件返回true,線程會(huì)被掛起,如果為false,則忽略該異常
Hit Count為該斷點(diǎn)經(jīng)過(guò)多少次后,正式掛起線程,如果設(shè)置為500,則表達(dá)前499次,經(jīng)過(guò)該斷點(diǎn)都不會(huì)停下,當(dāng)?shù)?00次,該斷點(diǎn)會(huì)掛起當(dāng)前線程。
表達(dá)式
表達(dá)式可以查看一些在當(dāng)前代碼中沒(méi)有的命令行,方便定位問(wèn)題。
場(chǎng)景三:小明最近遇到一個(gè)難題,在調(diào)用一個(gè)第三方插件時(shí)總是會(huì)有問(wèn)題,小明懷疑是第三方插件的bug,但小明沒(méi)有找到源碼不能進(jìn)行debug,小明該怎么辦呢?
Debug定位第三方插件的問(wèn)題
1.使用反編譯工具將代碼反編譯
2.將反編譯后的源碼進(jìn)行過(guò)濾
3.修復(fù)源碼編譯錯(cuò)誤
4.進(jìn)行debug
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能
這篇文章主要為大家詳細(xì)介紹了JavaWeb實(shí)現(xiàn)用戶登錄與注冊(cè)功能,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08詳解spring mvc對(duì)異步請(qǐng)求的處理
spring mvc3.2及以上版本增加了對(duì)請(qǐng)求的異步處理,是在servlet3的基礎(chǔ)上進(jìn)行封裝的,有興趣的可以了解一下。2017-01-01idea配置springboot熱部署終極解決辦法(解決熱部署失效問(wèn)題)
這篇文章主要介紹了idea配置springboot熱部署終極解決辦法(解決熱部署失效問(wèn)題),本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2020-07-07java基于Socket做一個(gè)簡(jiǎn)單下載器
這篇文章主要為大家詳細(xì)介紹了java如何基于Socket制作一個(gè)簡(jiǎn)單下載器,感興趣的小伙伴們可以參考一下2016-08-08Spring mvc防止數(shù)據(jù)重復(fù)提交的方法
這篇文章主要為大家詳細(xì)介紹了Spring mvc防止數(shù)據(jù)重復(fù)提交的方法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2018-11-11Java的動(dòng)態(tài)綁定與雙分派_動(dòng)力節(jié)點(diǎn)Java學(xué)院整理
這篇文章主要介紹了Java的動(dòng)態(tài)綁定與雙分派,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08詳解使用Spring MVC統(tǒng)一異常處理實(shí)戰(zhàn)
本篇文章主要介紹了詳解使用Spring MVC統(tǒng)一異常處理實(shí)戰(zhàn),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-04-04