除了編寫高效的代碼外,掌握調(diào)試技巧也是Java程序員可以使他們的生活更輕松的最有用的事情之一。這在當(dāng)今的開發(fā)環(huán)境中尤其重要,在當(dāng)今的開發(fā)環(huán)境中,軟件世界越來(lái)越多地轉(zhuǎn)向分布式體系結(jié)構(gòu)和更多異步代碼。盡管不可避免地會(huì)出現(xiàn)軟件錯(cuò)誤,但發(fā)現(xiàn)并修復(fù)復(fù)雜的應(yīng)用程序構(gòu)建中的錯(cuò)誤變得越來(lái)越困難。當(dāng)我們轉(zhuǎn)向生產(chǎn)環(huán)境時(shí),調(diào)試過(guò)程會(huì)更加痛苦。不幸的是,沒有辦法解決-您必須調(diào)試。那么,Java開發(fā)人員如何才能找到軟件錯(cuò)誤的根本原因并更快地解決它們?這篇文章匯集了在開發(fā)和生產(chǎn)環(huán)境中調(diào)試Java應(yīng)用程序的一些最有效的技巧。
充分利用斷點(diǎn)
讓我們從斷點(diǎn)開始- 斷點(diǎn)是一項(xiàng)顯而易見的重要功能,它為調(diào)試過(guò)程奠定了基礎(chǔ)。斷點(diǎn)使您可以暫停應(yīng)用程序的執(zhí)行,以便您可以分析程序的狀態(tài)并查找代碼行為異常的原因。
每個(gè)調(diào)試器都提供幾種類型的斷點(diǎn),包括條件斷點(diǎn),異常斷點(diǎn),監(jiān)視點(diǎn)和跟蹤點(diǎn)。
學(xué)習(xí)如何以及何時(shí)應(yīng)用不同類型的斷點(diǎn)可以使您的調(diào)試過(guò)程更加流暢。值得一提的是,一些現(xiàn)代工具支持不間斷的斷點(diǎn)。這些使您可以在代碼上放置斷點(diǎn)并收集調(diào)試數(shù)據(jù),而無(wú)需停止程序執(zhí)行。
這是Rookout Web IDE上的示例斷點(diǎn),該斷點(diǎn)設(shè)置在第41行。
顯示邏輯結(jié)構(gòu)
通常在變量視圖中可用的“顯示邏輯結(jié)構(gòu)”功能在監(jiān)視代碼中Java類內(nèi)的內(nèi)容時(shí)非常有用。啟用此功能后,變量列表將顯示一個(gè)數(shù)組,該數(shù)組在調(diào)試的情況下更為有用。
這特別方便,如果您的代碼缺少對(duì)象的toString()方法。
這是快照的快照,顯示了調(diào)試透視圖的Eclipse IDE“變量視圖”上的功能。
變量視圖還允許您在調(diào)試期間直接修改變量的值。由于您不必使用更改后的輸入數(shù)據(jù)重新啟動(dòng)調(diào)試會(huì)話,因此可以節(jié)省大量時(shí)間。
掌握在代碼庫(kù)中導(dǎo)航的技巧
每個(gè)Java調(diào)試器都提供許多功能,這些功能允許開發(fā)人員在調(diào)試時(shí)瀏覽其代碼的不同部分。其中一些包括逐行,跨步,跨步和逐行返回,可以安全地假設(shè)每個(gè)人都知道并使用它們。
除這些之外,請(qǐng)考慮合并以下內(nèi)容:
1.拖放到框架 -此功能用于跳回到堆棧框架中的某個(gè)點(diǎn)。如果您錯(cuò)過(guò)了某個(gè)時(shí)間點(diǎn)并需要回到過(guò)去,則只需使用逐幀顯示功能。
2.逐步篩選 -逐步篩選允許您在調(diào)試過(guò)程中跳過(guò)某些軟件包。當(dāng)您只需過(guò)濾掉不需要的類型時(shí),就不必瀏覽JDK系統(tǒng)的所有類。
為了提高瀏覽代碼的速度,您應(yīng)該掌握最重要的功能鍵的快捷方式。這些包括:
1.F5進(jìn)入
2.F6越過(guò)
3.F7步進(jìn)返回
4.F8運(yùn)行直到到達(dá)下一個(gè)斷點(diǎn)
盡管調(diào)試快捷方式可能因一個(gè)IDE的不同而有所不同,但記住它們將消除您不時(shí)使用鼠標(biāo)的需要。
了解如何解決死鎖
形成循環(huán)依賴關(guān)系后,如果永久阻塞兩個(gè)或多個(gè)線程,則會(huì)發(fā)生死鎖情況,如下所示。
一組Java線程通常正在等待另一個(gè)線程擁有的資源,這種情況可能導(dǎo)致應(yīng)用程序完全停止。調(diào)試jstack死鎖可能非常具有挑戰(zhàn)性,因?yàn)樗鼈儾粫?huì)表現(xiàn)出諸如內(nèi)存,CPU或其他操作系統(tǒng)指標(biāo)突然增加的癥狀。
此外,它們往往表現(xiàn)在最惡劣的條件下,例如繁重的生產(chǎn)負(fù)載條件,這些條件很難復(fù)制。
解決jstack 死鎖情況有多種方法。首先,您可以在JVM集群中捕獲多個(gè)線程轉(zhuǎn)儲(chǔ),以推斷線程模式。在這種情況下,僅分析靜態(tài)線程轉(zhuǎn)儲(chǔ)可能是不夠的。
根據(jù)JVM集群的大小,您可能需要拖曳多個(gè)文件,這通常很費(fèi)力且費(fèi)時(shí)。
更好的方法是使用應(yīng)用程序監(jiān)視解決方案,該解決方案提供隔離線程死鎖所需的JV級(jí)和代碼級(jí)可見性。幸運(yùn)的是,有一些創(chuàng)新工具可以幫助您解決這一問題,包括一些現(xiàn)代的高級(jí)調(diào)試器以及商業(yè)化的APM工具。
使用這些工具來(lái)獲得對(duì)Java代碼的可視性并隔離錯(cuò)誤,可以減少本可以花費(fèi)在手動(dòng)分析和預(yù)后上的時(shí)間。
利用生產(chǎn)調(diào)試器的力量
大多數(shù)開發(fā)人員通常遵循的典型調(diào)試流程包括復(fù)制環(huán)境,隔離錯(cuò)誤,然后應(yīng)用修復(fù)程序。
但是,這并非總是在每種生產(chǎn)環(huán)境中都可行。在這種情況下,開發(fā)人員可以依靠快速的生產(chǎn)調(diào)試器來(lái)獲得無(wú)縫的體驗(yàn)。
退出功能是一種功能強(qiáng)大的工具,可讓您從實(shí)時(shí)應(yīng)用程序中收集調(diào)試數(shù)據(jù),而無(wú)需更改應(yīng)用程序的狀態(tài)或流控制。
使用Rookout,您可以設(shè)置不間斷的斷點(diǎn)來(lái)獲取完整的堆棧跟蹤,捕獲實(shí)時(shí)變量或調(diào)試所需的任何其他應(yīng)用程序數(shù)據(jù)。
因此,與其使用高過(guò)載監(jiān)視解決方案進(jìn)行生產(chǎn)調(diào)試,不如使用Rookout之類的工具,這些工具可提供調(diào)試實(shí)時(shí)應(yīng)用程序所需的一切,而無(wú)需重新部署或編寫新代碼。
無(wú)論您是在無(wú)服務(wù)器應(yīng)用程序還是在容器化應(yīng)用程序上工作,Rookout都將是您調(diào)試庫(kù)中的絕佳選擇。
不要忘了遠(yuǎn)程調(diào)試
NetBeans,Eclipse,Intellij IDEA和Visual Studio等絕大多數(shù)頂級(jí)IDE支持遠(yuǎn)程調(diào)試,該技術(shù)允許您調(diào)試在另一臺(tái)計(jì)算機(jī)上運(yùn)行的Java代碼。
在目標(biāo)系統(tǒng)不支持本地調(diào)試的情況下,或者在缺乏足夠資源來(lái)運(yùn)行調(diào)試器的系統(tǒng)上,這尤其重要。
要執(zhí)行遠(yuǎn)程調(diào)試,必須提供調(diào)試器將用于連接到遠(yuǎn)程端口的配置詳細(xì)信息。例如,如果您使用的是Eclipse,則應(yīng)提供以下配置以成功啟動(dòng)遠(yuǎn)程調(diào)試會(huì)話。
對(duì)生產(chǎn)環(huán)境中的錯(cuò)誤進(jìn)行故障排除時(shí),遠(yuǎn)程調(diào)試也很方便,在這種情況下,開發(fā)人員需要連接到應(yīng)用程序并遠(yuǎn)程修復(fù)錯(cuò)誤。
最后,請(qǐng)記住,調(diào)試有時(shí)可能比實(shí)際實(shí)現(xiàn)花費(fèi)更多時(shí)間。在磨練Java調(diào)試技能時(shí),請(qǐng)始終努力編寫干凈,高效的代碼-在進(jìn)行調(diào)試時(shí)會(huì)有所收獲。
當(dāng)事情似乎失控時(shí),總是值得休息一下。錯(cuò)誤是編程難題,許多程序員已經(jīng)解決了這些難題,而又沒有靠近計(jì)算機(jī)。
使用以上策略可以減輕您的Java調(diào)試經(jīng)驗(yàn)。以上即是關(guān)于加快Java調(diào)試的技巧的全部?jī)?nèi)容介紹,想了解更多關(guān)于加快Java開發(fā)的信息,請(qǐng)繼續(xù)關(guān)注中培偉業(yè)。