【问题标题】:Check if a debugger is attached during the execution of a unit test在执行单元测试期间检查是否附加了调试器
【发布时间】:2014-09-23 08:13:13
【问题描述】:

如果调试器附加到当前的测试执行,有没有办法检查 JUnit 代码?
在 .NET/C# 中,我知道 Debugger.IsAttached 可以做到这一点。

用例是在附加调试器时更改或完全禁用测试超时,因为如果您只有大约 15 秒(定义的超时)来调试测试,这会很烦人。

【问题讨论】:

  • 作为一个快速的技巧,当你第一次遇到断点时(并且在 15 秒内),你总是可以使用“评估”来设置一些特定的属性......但我也很想知道是否有是做到这一点的正确方法。最坏的情况,使用命令行参数或系统属性来禁用超时...

标签: java debugging junit


【解决方案1】:

这不是 100% 故障安全的方法,但您可以检查 Java Debug Wire Protocol (JDWP) 是否处于活动状态,调试器使用它来连接到 JVM。这可以通过检查 JVM 的输入参数来完成,例如:

boolean isDebug() {
  for(String arg : ManagementFactory.getRuntimeMXBean().getInputArguments()) {
    if(arg.contains("jdwp=")) {
      return true;
    }
  }
  return false;
}

但是,如果其他人将某些东西命名为 jdwp,或者如果该协议用于其他东西,它可能会返回误报。此外,该命令将来可能会发生变化,这使得它几乎不会发生故障。这种方法当然不是 JUnit 特定的,但由于 JUnit 在 JVM 中没有任何特权,这是很自然的。

【讨论】:

  • 这不是说参数是否被传递——独立于连接的调试器吗?对于连接,它也许还应该检查是否 suspend=y ?
  • 你就在这里。大多数人在他们的 IDE 之外运行调试,通常两者都会出现,但上述检查并不能保证,这是真的。
【解决方案2】:

基于拉斐尔的回答:

    private static boolean isDebug() {
        return ManagementFactory.getRuntimeMXBean().getInputArguments().stream().anyMatch(arg->arg.contains("jdwp=") && arg.contains("suspend=y"));
    }

【讨论】:

  • 赞成,但suspend=y 是默认值。因此,最好检查 suspend=n 是否不存在。
猜你喜欢
  • 2023-03-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-22
  • 2013-08-22
  • 2021-12-30
相关资源
最近更新 更多