【问题标题】:How to know from Java code if VM is debugging? [duplicate]如何从 Java 代码中知道 VM 是否正在调试? [复制]
【发布时间】:2012-09-23 01:55:18
【问题描述】:

我想要这样的东西:

long timeout = isDebugModeActive() ? Long.MAX_VALUE : 10000;

这样当调试器在断点处停止时,不会发生超时。

是否有任何 API 或系统/环境属性可以找到它?

【问题讨论】:

  • 您可以通过JMX获取输入参数并检查是否打开了调试。
  • 我过去所做的是创建一个计时器,每 10 毫秒增加 10 毫秒(大约)时间。调试时,此计时器会根据您正在执行的单步执行代码减慢速度。在大多数情况下,这可能是矫枉过正。 ;)

标签: java debugging


【解决方案1】:

您可以进行新的运行配置(运行 -> 运行配置)并在那里添加环境变量或系统属性。

【讨论】:

【解决方案2】:

如果您开发 RCP 应用程序,您可能会使用:

if(Platform.inDevelopmentMode()) {
   // ....
}

【讨论】:

  • 谢谢,但由于这是一个“普通”的 OSGi 应用程序,所以我们没有可用的 Eclipse 核心类
【解决方案3】:

可以通过检查启动程序的JVM 参数来实现。

你会看到:

-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=n,address=[port]

然后你检查端口是监听还是有连接。

【讨论】:

  • 这仅适用于远程调试会话..
  • 好主意!至少在 linux 上,我们可以在 java 应用程序中做到这一点ps -A -o pid,ppid,cmd |grep "java.*YourMainPackageName[.]YourMainClassName" -i |tr ' ' '\n' |grep "[-]Xdebug"
  • 啊...更好,只是java,你说的检查JVM args可以用这个技巧来完成:stackoverflow.com/a/1518250/1422630,我不知道这是可能的,谢谢!
【解决方案4】:

this thread的作者找到了这个解决方案:

java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;

不过,一个标准的免责声明似乎是合适的——这非常脆弱(因为它在触发时非常具体)并且可能导致Heisenbugs(尝试调试时不会出现的错误) .对于许多情况,系统属性或环境变量可能更好。

【讨论】:

  • 谢谢你,成功了
猜你喜欢
  • 1970-01-01
  • 2012-01-04
  • 2014-07-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-06
  • 1970-01-01
相关资源
最近更新 更多