Java调试器和超时
在代碼中存在超時的情況下如何使用調(diào)試器。
我的調(diào)試器王國!
因此,您一直忙于編寫一個項目,一切順利,直到出現(xiàn)錯誤為止。 您可以進(jìn)入開發(fā)人員的工具箱,然后拔出調(diào)試器。 很棒–您可以設(shè)置斷點,可以在發(fā)生異常時中斷,還可以在運行時檢查表達(dá)式。 無論等待什么挑戰(zhàn),您都可以肯定,調(diào)試器將為您提供幫助!
不幸的是生活并不那么輕松。 許多代碼都需要某種超時 -一段時間后發(fā)生的事件。 問題在于超時會破壞調(diào)試體驗。 您坐在那里看著斷點,想著“現(xiàn)在為什么x是2而不是1?” of! 超時開始,您將無法繼續(xù)。 更糟糕的是,JVM本身退出了! 因此,您要經(jīng)歷增加超時,調(diào)試和解決問題的過程。 之后,您要么將超時返回到其原始設(shè)置,然后必須再次執(zhí)行相同的繁瑣過程,要么將修復(fù)意外地提交到源代碼樹中,從而破壞了測試甚至是生產(chǎn)。 在我看來,這似乎并不理想。
“出于某種原因,這是超時病,不信任任何朋友”
人們引入超時有很多原因。 我在下面列出了一些優(yōu)點和缺點,而且我敢肯定,您自己還會想到一些。
- 檢查特定時間段內(nèi)是否響應(yīng)了異步事件。
- 避免餓死基于時間的資源,例如線程池。
- 您的比賽條件需要快速解決。
- 您正在等待事件發(fā)生,并決定對需要多長時間的假設(shè)進(jìn)行硬編碼。 (可以在測試中最經(jīng)常發(fā)現(xiàn))
現(xiàn)在很明顯,如果你超時被引入作為一個黑客那么它是一個很好的時間來清潔的童子軍的代碼。 如果您需要依賴于測試中發(fā)生的事件,則應(yīng)將這些測試視為API的客戶端,并能夠知道事件何時發(fā)生。 這可能涉及注入在事件發(fā)生時被調(diào)用的模擬程序,或者訂閱事件流。 如果您有比賽狀況,請解決它! 我知道這很痛苦而且很辛苦,但是您是否真的想讓代碼庫中的定時炸彈準(zhǔn)備好在凌晨3點生成支持電話?
管理超時
前面已經(jīng)說過,我們應(yīng)該刪除超時的不良用法,很顯然,超時是完全合法的用法。 它們在事件驅(qū)動和異步代碼中尤其常見。 能夠與他們一起調(diào)試仍然會很好。 無論其他因素如何,良好做法都是為了將??超時標(biāo)準(zhǔn)化為可在運行時設(shè)置的配置屬性。 這樣,當(dāng)您在本地IDE與生產(chǎn)環(huán)境中運行時,可以輕松更改它們。 它還可以幫助管理從不同的硬件設(shè)置中遇到的不同性能屬性。
將超時從代碼中外部化為配置后,您可以檢測代碼是否在調(diào)試器中運行,并在這種情況下將超時設(shè)置為明顯更長的時間。 這樣做的技巧是認(rèn)識到調(diào)試器涉及運行Java代理,該代理會修改運行該程序的程序的命令行參數(shù)。 您可以檢查這些命令行參數(shù)是否包含正確的代理匹配器。 下面的代碼片段顯示了如何執(zhí)行此操作,并且已經(jīng)過測試,可以在Eclipse和Intellij IDEA下工作。
RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean(); String jvmArguments = runtimeMXBean.getInputArguments().toString(); boolean hasDebuggerAttached = jvmArguments.contains("-agentlib:jdwp");我可以理解為什么有些人也將其視為黑客,您通過查看自己的命令行參數(shù)并圍繞它進(jìn)行調(diào)整,從而積極地發(fā)現(xiàn)有關(guān)您環(huán)境的某些信息。 從我的角度來看,我發(fā)現(xiàn)這是一種有用的技術(shù)。 確實可以更容易地在存在超時的情況下進(jìn)行調(diào)試。
翻譯自: https://www.javacodegeeks.com/2014/07/java-debuggers-and-timeouts.html
總結(jié)
以上是生活随笔為你收集整理的Java调试器和超时的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Java中避免空检查
- 下一篇: Java数字格式