如何从Java代码中知道虚拟机是否正在调试?

4
我希望有这样的东西:

我想要类似于这样的:

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

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

有没有API或系统/环境属性可以找到它?


您可以通过 JMX 获取输入参数并检查是否已打开调试。 - Peter Lawrey
我过去所做的是创建一个计时器,每10毫秒将大约10毫秒的时间添加到计时器中。在调试时,这个计时器会因为你需要逐步执行代码而变慢。在大多数情况下,这可能是过度设计了。;) - Peter Lawrey
4个回答

2
这篇帖子的作者找到了这个解决方案:
java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;

一个标准的免责声明似乎是适当的 - 这个方法比较脆弱(因为它在特定情况下才会触发),可能会导致Heisenbugs(在调试时没有出现的错误)。对于许多情况来说,系统属性或环境变量可能更好。

1

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

在那里你会看到:

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

然后您可以检查端口是否正在侦听或是否存在连接。


这仅适用于远程调试会话。 - Ilya Shinkarenko
太好了!至少在Linux上,我们可以从Java应用程序内部执行此操作:ps -A -o pid,ppid,cmd |grep "java.*YourMainPackageName[.]YourMainClassName" -i |tr ' ' '\n' |grep "[-]Xdebug" - Aquarius Power
啊...更好的是,只需要Java,你说的检查JVM参数可以用这个提示完成:https://dev59.com/cXI_5IYBdhLWcg3wHvQ5#1518250,我不知道这是可能的,谢谢! - Aquarius Power

1

您可以创建一个新的运行配置(Run -> Run Configurations),并在其中添加环境变量或系统属性。


谢谢。这正是我们项目目前的工作方式,但我认为可能会有更合理的替代方案。 - Ilya Shinkarenko
1
最大化:尽可能做最简单的事情 - Martin Spamer

1

如果您正在开发RCP应用程序,您可以使用以下内容:

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

谢谢,但由于这是一个“纯”OSGi应用程序,因此我们没有可用的Eclipse核心类。 - Ilya Shinkarenko

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接