Java调试器和超时

在代码中存在超时的情况下如何使用调试器。

我的调试器王国!

因此,您一直忙于编写一个项目,一切顺利,直到出现错误为止。 您可以进入开发人员的工具箱,然后拔出调试器。 很棒–您可以设置断点,可以在发生异常时中断,还可以在运行时检查表达式。 无论等待什么挑战,您都可以肯定,调试器将为您提供帮助!

不幸的是生活并不那么轻松。 许多代码都需要某种超时 -一段时间后发生的事件。 问题在于超时会破坏调试体验。 您坐在那里看着断点,想着“现在为什么x是2而不是1?” of! 超时开始,您将无法继续。 更糟糕的是,JVM本身退出了! 因此,您要经历增加超时,调试和解决问题的过程。 之后,您要么将超时返回到其原始设置,然后必须再次执行相同的繁琐过程,要么将修复意外地提交到源代码树中,从而破坏了测试甚至是生产。 在我看来,这似乎并不理想。

“出于某种原因,这是超时病,不信任任何朋友”

人们引入超时有很多原因。 我在下面列出了一些优点和缺点,而且我敢肯定,您自己还会想到一些。

  • 检查特定时间段内是否响应了异步事件。
  • 避免饿死基于时间的资源,例如线程池。
  • 您的比赛条件需要快速解决。
  • 您正在等待事件发生,并决定对需要多长时间的假设进行硬编码。 (可以在测试中最经常发现)

现在很明显,如果你超时被引入作为一个黑客那么它是一个很好的时间来清洁的童子军的代码。 如果您需要依赖于测试中发生的事件,则应将这些测试视为API的客户端,并能够知道事件何时发生。 这可能涉及注入在事件发生时被调用的模拟程序,或者订阅事件流。 如果您有比赛状况,请解决它! 我知道这很痛苦而且很辛苦,但是您是否真的想让代码库中的定时炸弹准备好在凌晨3点生成支持电话?

管理超时

前面已经说过,我们应该删除超时的不良用法,很显然,超时是完全合法的用法。 它们在事件驱动和异步代码中尤其常见。 能够与他们一起调试仍然会很好。 无论其他因素如何,良好做法都是为了将​​超时标准化为可在运行时设置的配置属性。 这样,当您在本地IDE与生产环境中运行时,可以轻松更改它们。 它还可以帮助管理从不同的硬件设置中遇到的不同性能属性。

将超时从代码中外部化为配置后,您可以检测代码是否在调试器中运行,并在这种情况下将超时设置为明显更长的时间。 这样做的技巧是认识到调试器涉及运行Java代理,该代理会修改运行该程序的程序的命令行参数。 您可以检查这些命令行参数是否包含正确的代理匹配器。 下面的代码片段显示了如何执行此操作,并且已经过测试,可以在Eclipse和Intellij IDEA下工作。

RuntimeMXBean runtimeMXBean = ManagementFactory.getRuntimeMXBean();
String jvmArguments = runtimeMXBean.getInputArguments().toString();
boolean hasDebuggerAttached = jvmArguments.contains("-agentlib:jdwp");

我可以理解为什么有些人也将其视为黑客,您通过查看自己的命令行参数并围绕它进行调整,从而积极地发现有关您环境的某些信息。 从我的角度来看,我发现这是一种有用的技术。 确实可以更容易地在存在超时的情况下进行调试。

翻译自: https://www.javacodegeeks.com/2014/07/java-debuggers-and-timeouts.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值