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