更新時間:2021-10-08 11:27:20 來源:動力節(jié)點 瀏覽1171次
Java調(diào)試是一個復雜的空間。 調(diào)試器的類型很多,工具也很多。 在此頁面中,我們將介紹7種類型的調(diào)試器之間的區(qū)別,并查看每個類別中的主要工具,以幫助您為正確的工作選擇正確的工具。
以下是我們介紹的調(diào)試器類型:
CLI調(diào)試器
IDE調(diào)試器
構建自己的調(diào)試器
堆轉儲
歷史調(diào)試器
動態(tài)追蹤
生產(chǎn)調(diào)試
塔基皮
使用廣泛的定義,錯誤是實例,其中我們編寫的代碼與我們獲得的輸入不匹配。 這些的不同影響可以大致分為–
意外的流控制 ,導致異常或代碼中我們不希望出現(xiàn)的位置。 在這里,調(diào)試器通常用于檢查代碼和狀態(tài)的相關性。
意外的堆分配 。 在這種情況下,我們要么分配了太多的對象,要么分配了太大的對象。 保留對這些內(nèi)容的長期引用只會增加樂趣。 這就是堆分析器起作用的地方。
延遲流量控制 。 這很可能與我們將錯誤的輸入傳遞給外部調(diào)用(即“ SELECT * FROM everything”)或卡在長循環(huán)或無限循環(huán)中有關。 這是性能分析器通常會出現(xiàn)的地方。
當然,工具和類別之間存在重疊,因為它們本質上都具有相同的目的-讓我們看到我們所期望的狀態(tài),以便我們可以修復代碼,并使其達到期望。

主要工具 :主要參與者是jdb ,它是JDK附帶的,與JVM等效,是gdb。 它具有命令行界面,可以連接到正在運行的JVM。 像gdb一樣,它的功能也很強大,您可以使用jdb進行任何功能,就像使用功能強大的IDE調(diào)試器一樣。 jdb有一個補充-jstack-它使您可以在給定時刻打印實時JVM的線程調(diào)用堆棧。 但是,這不會捕獲變量或堆狀態(tài)。
在以下情況下使用 :jdb的最大優(yōu)點是其可移植性。 您可以相當快地將其安裝到服務器上,而不必遠程連接調(diào)試器。 如果您正在處理服務器上的惡劣環(huán)境,并且有能力讓JVM檢查它,那么jdb是您最好的朋友。
缺點 :jdb和jstack的缺點是,與其他命令行工具一樣,它們在日常使用中效率不高。 這將我們帶入下一個類別。

主要工具 :Eclipse和NetBeans是該類別中的兩個工具。 兩者都使用與jdb類似的技術來附加或啟動新的JVM。 盡管不是很輕便,但您確實會遇到麻煩,這可以使調(diào)試更短,更有趣。
在以下情況下使用 :假設您每天都不是Dexter( 神童 ,而不是連環(huán)殺手)。
缺點 :作為高端桌面應用程序,它們不是您要在生產(chǎn)計算機上運行的東西。 始終存在進行遠程調(diào)試的可能性,但是在復雜的環(huán)境中,解決該問題的可能性很小。

到目前為止,我們已經(jīng)描述的所有調(diào)試器都基于相同的JVM開放調(diào)試體系結構,最常見的是使用JDWP(Java調(diào)試器有線協(xié)議)與正在運行的JVM通信。 JSwat是在此框架之上構建的獨立調(diào)試器的示例。 是否想學習如何構建自己的Java / Scala調(diào)試器? 請點擊這里 。
在以下情況下使用 :構建自定義JVM擴展,或者對JVM的工作方式非常感興趣。
缺點 :這是一件很復雜的事情,尤其是當您不想影響目標JVM的狀態(tài)時,這是非常正確的事情,因此,您需要一個非常有說服力的理由來說明為什么不能使用經(jīng)過考驗的現(xiàn)有工具。

主要工具 :jmap,MAT。 在許多情況下,就像Rick Grimes一樣 ,您正在與死者打交道。 在這些情況下,您正在查看的是JVM堆的快照,而不是已停滯的實時JVM的快照。 JDK附帶的jmap允許您從實時JVM生成堆轉儲。 有很多工具可以讓您瀏覽和分析轉儲。 JDK附帶的jhat和visualVM在這方面做得很好。 Eclipse插件MAT和NetBean的HeapWalker是很好的選擇,因為它們利用了已經(jīng)強大的IDE UI。
在以下情況下使用 :發(fā)生復雜錯誤且無法應用常規(guī)調(diào)試技術(例如,該應用程序在客戶的服務器上運行)。 另一種選擇是通過打開JVM -HeapDumpOnOutOfMemoryError標志來使用堆轉儲來分析內(nèi)存泄漏,以使JVM在堆耗盡后自動轉儲堆的內(nèi)容。
缺點 :使用堆轉儲的最大缺點是它們的重量與堆本身的重量一樣大(這很可能意味著堆在GB中)。 然后必須將其轉回給您進行分析。 在生產(chǎn)中捕獲它們也不是在公園中漫步。

主要工具 :這類工具取決于您是否能夠或不想停止JVM來收集狀態(tài)或進行堆快照。 Chronon DVR是這種方法的一個很好的例子。 在此,調(diào)試器使用字節(jié)碼檢測從代碼本身內(nèi)部記錄數(shù)據(jù)。 這通常包括諸如調(diào)用方法的順序以及傳遞給它們的參數(shù)之類的事情。 這使調(diào)試器可以“重播”代碼,并讓您了解執(zhí)行時的流控制。 重播解決方案(由CA收購)是另一種使用不同方法的示例,其中記錄了對JVM的IO輸入,然后將其“重播”回活動實例–模擬執(zhí)行后的代碼。
在 以下情況下使用 :此類工具的主要途徑通常是在質量檢查期間,通過捕獲實際的運行時狀態(tài),它們可以幫助使錯誤更易于重現(xiàn)。 另一種情況是讓客戶或支持工程師臨時運行該工具,以在應用程序在生產(chǎn)中表現(xiàn)異常時從JVM捕獲狀態(tài)。
缺點 :這些工具的最大缺點是日志記錄會花費您很多,而日志記錄會花費很多。 這意味著歷史悠久的調(diào)試器可以將應用程序的速度降低50%到一個數(shù)量級,從而限制了可以使用這些應用程序的生產(chǎn)方案的數(shù)量。

主要工具 :BTrace。 使用此類別中的工具,您可以從正在運行的JVM中有選擇地打印(“跟蹤”)狀態(tài)信息,而無需暫停它,也不必記錄正在發(fā)生的一切。 可以將它視為動態(tài)編織到一段新代碼中,該新代碼從代碼本身中打印值以供您查看。 BTrace是一個杰出的工具,它引入了自己的語法,可讓您定義要在代碼中跟蹤的位置和內(nèi)容。 該語法還設計為僅支持只讀操作,以防止您實際更改程序的狀態(tài)或引起無限循環(huán)。
在以下情況下使用 :最常用于嘗試針對特定問題調(diào)試服務器(例如,連接池已耗盡)或在不停止JVM執(zhí)行的情況下臨時收集特定統(tǒng)計信息的情況。
缺點 :與調(diào)試器一樣,通常不建議從生產(chǎn)服務器進行動態(tài)跟蹤(并且很多時間是不允許的)。 還有一個小的學習曲線,可以在服務器環(huán)境中有效地使用動態(tài)跟蹤。

主要工具 :用于記錄狀態(tài)的日志記錄框架(log4j,Logback)和用于大規(guī)模分析數(shù)據(jù)的日志分析器(Logstash,Splunk…)。
在以下情況下使用 :這是一個相當困難的區(qū)域,因為當您處理生產(chǎn)系統(tǒng)時,使JVM停頓以查看狀態(tài)或進行堆轉儲通常是很大的禁忌。 那是因為您實際上是要關閉服務器來調(diào)試它,這通常僅在極端情況下才能完成。
我們通常在運行時從JVM中提取狀態(tài)而不停止狀態(tài)的方法是通過有選擇地將變量值記錄到文件中(通常是在Java記錄框架的幫助下)。 稍后,我們可以使用各種工具來解析數(shù)據(jù),從簡單到尾部,一直到可擴展的日志分析器,例如開源Logstash和企業(yè)Splunk。
缺點 :這里最大的缺點是我們當然需要事先知道(并有效地執(zhí)行)登錄。 日志也可以很快被填滿,并且無需開發(fā)團隊的大量紀律,還可能包含很多不必要的數(shù)據(jù)或錯過了一些關鍵數(shù)據(jù)。
科學家觀察到,將日志文件中的數(shù)據(jù)拼湊在一起以了解導致錯誤的變量狀態(tài),這是夜間和假日消遣的一種非常受歡迎的開發(fā)人員。

我們在構建Takipi時考慮了一個簡單的對象。 我們想讓開發(fā)人員輕松知道何時以及為何中斷生產(chǎn)代碼。 這意味著,無論何時開始發(fā)生新的異?;蛉罩惧e誤,我們都會捕獲它并通知您。 第二部分是跟蹤部署,以說明問題從哪個開始以及發(fā)生的頻率。 最后(也是最有趣的部分)是生產(chǎn)調(diào)試部分。 對于每個異?;蝈e誤,Takipi會在錯誤發(fā)生時向您顯示確切的源代碼和變量狀態(tài)(包括本地值和對象值),就像發(fā)生錯誤時您在那兒一樣。
以上就是關于“Java調(diào)試工具介紹”,其他的Java開發(fā)工具還有很多,大家可要多了解一些,這對以后的學習會有很大的幫助。