一、舉例java
場景一:小明寫了一個任務執行者,該執行者不間斷的執行一些任務,在現網上運行了一段時間後,發現有機率的出現一些故障,發現運行一段時間後,該任務者異常退出了,退出的由於是空指針,能夠小明想要在本地debug,不知道斷點打在哪裏,該問題是機率事件,不必定會出現,因此小明debug幾遍下來後,頭暈眼花,連代碼都看不清楚了,小明想要是能有個斷點每當出現空指針異常的時候就停下來讓他發現問題,那該多好呀。spring
異常斷點數據庫
異常斷點:在定位問題的過程當中,經常會遇到斷點沒法打到合適的位置,以致於和問題的觸發點千差萬別,因此這個時候不妨試試異常斷點,顧名思義,異常斷點是指拋出某種異常後自動掛起的斷點。
點擊紅色部位,增長一個異常斷點express
輸入想要定位的異常類型,例如NullPointerException,這樣系統中拋出任何NullPointerException異常後,都會掛起當前線程,給你機會去定位問題。json
場景二:小明寫了一個巨大的循環,在調測代碼時,小明發現每當循環到第100000次的時候,就是出現問題,沒有達到本身的預期,因而小明在循環裏打了個斷點,想看看到底怎麼回事,可小明萬萬沒有想到,想要到達100000次循環是多麼的困難,小明這個時候已經開始浮想聯翩,若是能有這樣的斷點:
If 循環次數== 100000,線程停下來多線程
條件斷點socket
如右圖,循環1000次,若是想要在循環到500次的時候停下來,能夠建立一個條件斷點,右擊斷點懸着Breakpoint Properties。編輯器
選中Enable Condition
在空白處,添加你本身的條件,若是條件返回true,線程會被掛起,若是爲false,則忽略該異常
Hit Count爲該斷點通過多少次後,正式掛起線程,若是設置爲500,則表達前499次,通過該斷點都不會停下,當第500次,該斷點會掛起當前線程。函數
表達式工具
表達式能夠查看一些在當前代碼中沒有的命令行,方便定位問題。
場景三:小明最近遇到一個難題,在調用一個第三方插件時老是會有問題,小明懷疑是第三方插件的bug,但小明沒有找到源碼不能進行debug,小明該怎麼辦呢?
Debug定位第三方插件的問題
1.使用反編譯工具將代碼反編譯
2.將反編譯後的源碼進行過濾
3.修復源碼編譯錯誤
4.進行debug
2、Debug視圖
調試中最經常使用的窗口是:
窗口 | 說明 |
---|---|
Debug窗口 | 主要顯示當前線程方法調用棧, 以及代碼行數(有調試信息的代碼) |
斷點Breakpoints窗口 | => 斷點列表窗口,能夠方便增長斷點,設置斷點條件,刪除斷點等 |
變量Variables窗口 | => 顯示當前方法的本地變量,非static方法,包含this應用,能夠修改變量值 |
代碼編輯窗口 | => 這個不用多說了 |
輸出Console窗口 | => 日誌等輸出內容,調試時,能夠將關注的組件級別設置低一點,以便得到跟多輸出信息 |
另外輔助的窗口有:
窗口 | 說明 |
---|---|
表達式expression窗口 | => 寫上本身須要觀察的數據的表達式,或者修改變量值 |
Display窗口 | => 能夠在display中執行代碼塊,輸出內容等 |
大綱Outline窗口 | => 查看當前類的方法,變量等 |
類型層級Type hierarchy窗口 | => 查看當前所在類的繼承層次,包括實現接口,類繼承層次 |
方法調用關係Call hierarchy窗口 | => 查看當前方法被哪些方法調用,調用方法在哪些類中、第幾行,能夠直接打開對應的方法 |
搜索結果Search窗口 | => 結合快捷鍵能夠查看變量、方法等在工做空間、項目、工做集中被引用或定義的代碼位置 |
1)窗口全覽:
2)Debug View(線程堆棧視圖):
debug視圖容許您在工做臺上管理正在調試和運行的程序,他顯示了你正在調試的程序中掛起的線程的堆棧幀,程序中的每一個線程做爲樹的節點出現。他展現了正在運行的每一個目標的進程。若是線程被掛起,它的堆棧幀以子元素的形式展現。如下是一些經常使用的debug按鈕:
1.表示當前實現繼續運行直到下一個斷點,快捷鍵爲F8。
2.表示打斷整個進程
3.表示進入當前方法,快捷鍵爲F5。
4.表示運行下一行代碼,快捷鍵爲F6。
5.表示退出當前方法,返回到調用層,快捷鍵爲F7。
6.表示當前線程的堆棧,從中能夠看出在運行哪些代碼,而且整個調用過程,以及代碼行號
詳細介紹:
Skip All Breakpoints : 將全部斷點設置爲被跳過的,設置了Skip All Breakpoints以後,全部斷點上都會有一個斜線,表示斷點將被跳過,線程不會在該斷點處被掛起。
Drop to Frame : 這個命令可讓程序回到當前方法的開頭第一行從新開始執行,能夠從新執行這個java堆棧幀,能夠選擇一個指定的堆棧幀,而後點擊 Drop to Frame,這樣就能夠從新進入指定的堆棧幀。使用Drop to Frame時候須要注意:
1.不能drop到已經執行過的方法棧中的方法中。
2.drop到stack frame中時,不會改變全局數據原有的值,好比,一個包含元素的vertor並不會被清空。
Step Filters : 這個功能比較簡單,就是當咱們在debug的時候想要忽略一些咱們不關注的類時,能夠開啓Step Filters進行過濾,程序會一直執行直到遇到未通過濾的位置或斷點。Step Filters功能由Use Step Filters,Edit Step Filters,Filter Type,Filter Package四項組成。具體操做以下:
步驟 1: Windows -> Preferences -> Java -> Debug -> Step Filtering.
步驟 2:選擇‘Use Step Filters’
步驟 3:在屏幕上選中所需的選項。你能夠添加你本身代碼庫中的部分代碼。
步驟 4:點擊‘Apply’
原理上,Edit Step Filter命令用於配置Step Filter規則,而Filter Type與Filter Package分別指的是過濾的Java類型與Java Package。
Step Return : 跳出當前方法,在被調用方法的執行過程當中,使用Step Return會在執行完當前方法的所有代碼後跳出該方法返回到調用該方法的方法中。
Step Over : 在單步執行時,在函數內遇到子函數時不會進入子函數內單步執行,而是將子函數整個執行完在中止,也就是把子函數整個做爲一步。
Step Into:單步執行,遇到子函數就進入而且繼續單步執行
Resume:恢復暫停的線程,直接從當前位置跳到下一個斷點位置。
Suspend:暫停選定的線程,這個時候能夠進行瀏覽或者修改代碼,檢查數據等。
Eclipse經過Suspend與Resume來支持線程的暫掛與恢復。通常來說,Suspend適用於多線程程序的調試,當須要查看某一個線程的堆棧幀及變量值時,咱們能夠經過Suspend命令將該線程暫掛。Resume用於恢復。
有兩種Resume須要注意:
第一是當在調試過程當中修改程序代碼,而後保存,點擊Resume,此時程序會暫掛於斷點。
第二是當程序拋出異常時,運行Resume,程序也會暫掛於斷點。
Terminate : Eclipse經過Terminate命令終止對本地程序的調試。
Disconnect:Eclipse使用Disconnect命令來終止與遠程JVM的socket鏈接。
一、調試執行
標記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
6.4 | Step Info | F5 | -> 單步進入(若是有方法調用,將進入調用方法中進行調試); |
6.4 | Step Over | F6 | -> 單步跳過(不進入行的任何方法調用中,直接執行完當前代碼行,並跳到下一行); |
6.4 | Step Return | F7 | -> 單步返回(執行完當前方法,並從調用棧中彈出當前方法,返回當前方法被調用處); |
6.5 | Resume | F8 | -> 恢復正常執行(直到遇到下一個斷點); |
7.4 | Run to Line | Ctrl+R | -> 執行到當前行(將忽略中間全部斷點,執行到當前光標所在行); |
6.3 | Drop To Frame | 無 | -> 回退到指定方法開始處執行,這個功能至關贊。 在方法調用棧上的某個方法右鍵,選擇Drop To Frame就能夠從該方法的開始處執行 好比從新執行本方法,能夠在本方法上用Drop To Frame,將從本方法的第一行從新執行。 固然對於有反作用的方法,好比數據庫操做,更改傳入參數的對象內容等操做可能從新執行就再是你想要的內容了。 |
6.1+6.2 | Copy Stack | 無 | -> 拷貝當前線程棧信息 |
若是在調試時,須要排除一些類、包等不須要進入調試,可使用Edit Step Filters設置。
A6的properties: Java進程啓動相關信息,包括控制檯啓動參數,環境參數等。若是參數啓動參數有問題能夠先看看這裏的實際啓動參數是否是有誤。另外還能夠查看虛擬機支持調試的相關選項。
二、數據查看
標記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
7.4 | Inspect | ctrl+shift+i | -> 察看選擇的變量、表達式的值或執行結果, 再次按ctrl+shift+i能夠將當前表達式或值添加到Expressions窗口中查看; |
7.4 | Display | ctrl+shift+d | -> 顯示選擇的變量、表達式的值或執行結果, 再次按ctrl+shift+d能夠將當前表達式或值添加到Display窗口中顯示; |
7.4 | Execute | ctrl+u | -> 執行選擇表達式; |
7.4 | Run to Line | ctrl+r | -> 執行到當前行(將忽略中間全部斷點,執行到當前光標所在行); |
7.3 | All Instances | ctrl+shift+n | -> 查看選擇的類的全部對象,這個功能超讚; |
7.3 | Instance Count | 無 | -> 查看選擇的類的全部對象個數; |
7.4 | Watch | 無 | -> 添加當前變量、表達式到Expressions窗口中; |
3)Variables View (變量視圖)
1.爲變量名視圖,顯示當前代碼行中全部能夠訪問的實例變量和局部變量
2.顯示全部的變量值
3.能夠經過該窗口來改變變量值
Variables View顯示與Debug View中選定的堆棧幀相關的變量信息,調試Java程序時,變量能夠選擇將更詳細的信息顯示在詳細信息窗格中。此外,Java對象還能夠顯示出其包含的屬性的值。在該窗口中選中變量鼠標右鍵點擊能夠進行許多操做,主要操做有如下這些:
All Instances:打開一個對話框來顯示該java類的全部實例,使用該功能須要java虛擬機支持實例的檢索。
All References::打開一個對話框來顯示全部引用了該變量的java對象,
Change Value::更改變量的值,該功能能夠和Drop to Frame聯合使用進行程序的調試。使用這兩個功能就能夠代替從新debug
Copy Variables:複製變量的值,尤爲在變量值很長(好比json數據)的時候,這個功能就派上用場了。
Find:有的時候一個類中變量特別多的時候,能夠進行查找。
4)Breakpoints View (斷點視圖)
1.顯示全部斷點
2. 將當前窗口1中選中的端口失效,再次點擊啓用。
3.異常斷點
Breakpoints View將列出你在當前工做區間裏設置的全部斷點,雙擊斷點能夠進入到程序中該斷點的位置。還能夠啓用或禁用斷點,刪除,添加新的,根據工做組或點命中計數給他們分組。在使用斷點是有如下兩個技巧是十分有用的:
Hit Count: 是指定斷點處的代碼段運行多少次,最典型的就是循環,若是要讓一個循環執行10次就線程掛起,則指定Hit Count值爲10,那麼當前的循環執行到第九次的時候就會掛掉。
Conditional:顧名思義,就是條件判斷,例如咱們須要循環變量i==10時,線程掛起,則條件設定爲i==10,選擇Suspend when 「true」。
那若是上面的Hit Count和Conditional都選擇的話,若是表達式和值設置不合理則會失效。若是選擇Suspend when value changes,那麼可能在Conditional在變量值發生改變的時候就掛起。
5)Expressions View (表達式視圖)
1.表達式
2. 點擊此能夠新增一個表達式
要在 Debug 透視圖的編輯器中求表達式的值,選中設置有斷點的一整行,並在上下文菜單中選擇 Inspect 選項。表達式是在當前堆棧幀的上下文中求值的,其結果顯示在 Display 窗口的 Expressions 視圖中。 好比我想要計算變量a+b的值,那麼就能夠在表達式視圖中加一個表達式:a+b
6)Display View
可使用這個視圖,輸入或者演算一些新的代碼。這些代碼在當前的調試位置的上下文環境中被執行,這意味着,你可使用全部變量甚至是內容助手。要執行你的代碼的話,只需標記它,並使用右鍵菜單或者CTRL+U(執行)或者 CTRL+SHIFT+I (檢查)
7)代碼查看輔助窗口
一、代碼視圖:
代碼視圖,用來顯示具體的代碼。其中綠色部分是指當前將要執行的代碼
標記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
11.1~11.5 | quick type hierarchy | ctrl+t | 查看當前類、接口的繼承層次, 默認進入時,顯示繼承/實現當前類/方法的子類,子接口11.1;再次ctrl+t,將顯示當前類、接口繼承/實現的超類/接口11.2;調試時,常常用該功能,在接口或抽象類的方法調用處11.3,ctrl+t察看實現類11.4,直接導航到對應的實現方法中11.5。 |
quick outline | ctrl+o | 查看當前類的大綱,包括方法,屬性等內容; 用處不大; | |
open declarations | F3 | 查看變量、屬性、方法定義的地方 |
二、Call Hierarchy窗口:
標記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
12.1~12.2 | open call hierarchy | ctrl+alt+h | 查看方法被調用層次, 能夠看當前方法被調用的地方12.1,或者當前方法調用了其餘類的方法12.2 |
三、Type Hierarchy窗口:
標記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
13.1~13.4 | open type hierarchy | F4 | 查看繼承層次, 能夠查看類的繼承層次,包括子類父類13.1, 或者類實現的接口繼承層次13.2,還會根據選擇的類/接口,在右邊顯示該類的大綱13.三、 13.4; 13.3能夠選擇是否顯示父類/父接口的屬性、方法等 |
四、Search 窗口:
標記 | 功能 | 快捷鍵 | 描述 |
---|---|---|---|
14.1 | declarations | ctrl+g | 相同的方法簽名在工做空間中及第三方jar包中被定義的位置14.1 |
14.2 | references | ctrl+shif+g | 當前選中的變量、屬性、方法在工做空間中及第三方jar包中被引用的位置14.2 |
14.3 | ctrl+shift+u | 查看變量、屬性 、方法在當前類中出現的地方14.3 | |
14.4 | implements | 查看實現當前接口的類14.8 | |
14.4~14.7 | 顯示方式 | 能夠選擇不一樣的顯示方式,具體看圖 |
2、Debug
1.設置斷點
在源代碼文件中,在想要設置斷點的代碼行的前面的標記行處,雙擊鼠標左鍵就能夠設置斷點,在相同位置再次雙擊便可取消斷點。有的時候咱們還有這樣的須要,就是我並不想一行一行的執行代碼,好比一個for循環會循環1000多遍,我只想在第500遍的時候讓線程掛起進行調試,這個時候咱們可使用條件斷點。 設置條件斷點:咱們能夠給該斷點設置觸發條件,一旦知足某條件是纔開始調試,能夠在斷點處點擊鼠標右鍵,選擇Breakpoint Properties進入斷點設置頁面,剛剛在講斷點視圖的時候咱們學到過Hit Count和Conditional的用法,這裏能夠設置條件和執行次數。
1.1)斷點類型及斷點窗口
在調試中能夠設置的斷點類型有五種:
1.行斷點(line breakpoints) : 條件斷點,顧名思義就是一個有必定條件的斷點,只有知足了用戶設置的條件,代碼纔會在運行到斷點處時中止。
2.方法斷點(method breakpoints ): 方法斷點的特別之處在於它能夠打在 JDK的源碼裏,因爲 JDK 在編譯時去掉了調試信息,因此普通斷點是不能打到裏面的,可是方法斷點卻能夠,能夠經過這種方法查看方法的調用棧。
3.觀察斷點(watch breakpoints-成員變量訪問變動)
4.異常斷點(exception breakpoints)
5.類加載斷點(class load breakpoints)
每種斷點的設置有些許不同,能夠在斷點上右鍵->Breakpoint properties進行設置,但通常在斷點窗口有快速設置的界面,Breakpoint properties中多了filter, 其實比較雞肋,用處不大。
斷點相關的快捷鍵:
快捷鍵 | 說明 |
---|---|
ctrl+shift+b | 在光標處大斷點/取消斷點 |
ctrl+alt+b | 忽略全部斷點 |
Alt+shift+q, b | 激活斷點窗口 |
一、行斷點: 在方法中的某一行上打斷點1.一、1.4。行斷點能夠設置掛起線程/VM的條件1.3,訪問次數1.2。
1.3中的條件是,spring在註冊Bean定義(registerBeanDefinition)時,若是是org.springframework.demo.MyBean,就掛起線程,能夠開始單步調試了。
對於命中次數(hit count)1.2的使用,通常是在循環中,第N個對象的處理有問題,設置hit count = N, 重調試時,能夠方便到達須要調試的循環次數時,停下來調試。
二、方法斷點:在方法上打斷點2.一、2.2。方法斷點的好處是能夠從方法方法進入或者退出時2.3,停下來調試,相似行斷點,並且只有行斷點和方法斷點有條件和訪問次數的設置功能。
可是方法斷點還有另一個好處,若是代碼編譯時,指定不攜帶調試信息,行斷點是不起做用的,只能打方法斷點。
有興趣的能夠經過A1將Add line number… 前的勾去掉, 調試下看看。
三、觀察斷點: 在成員變量上打的斷點3.一、3.3。只有對象成員變量有效果,靜態成員變量不起做用。
能夠設置變量被訪問或者設置的時候掛起線程/VM 3.2,也就是相似3.4的全部對成員變量的訪問或者設置的方法都會被監控到
四、異常斷點: 異常斷點能夠經過4.6添加,或者點擊日誌信息中輸出的異常類信息添加。
異常斷點4.1,系統發生異常時,在被捕獲異常的拋出位置處或者程序未捕獲的異常拋出處4.二、4.4, 掛起線程/VM, 也能夠指定是否包括異常的子類也被檢測4.三、4.5。
另外除了以上正常設置的異常掛起,從java->debug中能夠設置掛起執行,主要有下面兩個:
一、是否在發生全局未捕獲時掛起(suspend execution on uncaught exceptions),調試時,總是有異常掛起影響調試,可是沒有設置異常斷點的狀況,就能夠勾選掉這個選項;
二、是否在編譯錯誤時掛起,通常在邊調試邊改代碼時會發生這種狀況;
另外要提一個的是有main方法啓動的應用,能夠在調試配置中勾選stop in main A3, 程序進入時,會掛起線程,等待調試。
五、類加載斷點: 在類名上打的斷點5.1。接口上是打不了類加載斷點的,可是抽象類是能夠的,只是在調試的時候,斷點不會明顯進入classloader中,單步進入知會進入到子類的構造方法中,非抽象類在掛起線程後單步進入就會到classloader中(若是沒有filter過濾掉的話)5.3。類加載斷點不論是打在抽象或者非抽象類上,都會在類第一次加載或者第一個子類第一次被加載時,掛起線程/VM5.2。
2.調試程序
一、調試本地 Java 語言程序
在全部調試中,調試一個Java程序是最簡單的,主要有設置斷點、啓動調試、單步執行、結束調試幾步。
1)設置斷點:
2)啓動調試:Eclipse提供四種方式來啓動程序(Launch)的調試,分別是經過菜單(Run –> Debug)、圖標(「綠色臭蟲」)、右鍵->Debug As以及快捷鍵(F11),在這一點上,與其餘命令(例如Run)相似。
彈出提示,須要切換到調試(Debug)工做區,勾選「Remember my decision」,記住選擇,則下次再也不提示,而後點擊【Yes】。
3)單步執行:主要使用前面講過的幾個視圖進行調試,其中debug視圖中的幾個按鈕有快捷鍵:
Step Retuen(F7)
Step Over (F6)
Step Into (F5)
結束調試:經過Terminate命令終止對本地程序的調試。