Java程序如何确定它是否在调试模式下运行?
应用程序在常规"全速"模式下的行为应与"调试模式"(在附加调试器时,在调试模式下运行时)略有不同.应用程序通过TCP与另一台计算机,另一个进程或其自身进行通信.我的同事希望我们Socket.setSoTimeout(1000)默认使用,以便从套接字读取最多可以阻止1秒钟.调试时,这当然是不够的,应用程序停止工作.所以解决方案是设置SO_TIMEOUT更高,但只是在调试模式(例如:无限制).现在,我并不总是设置断点或者不想使用调试构建,我可以自己设置"debug"属性.有时我会附加调试器(远程调试).我主要使用Eclipse,所以在那里工作的解决方案是可以的.
可能的答案包括:
要确定是否在调试模式下运行,请使用以下方法java.lang.management.*或javax.management.*...
您的同事因X原因错误SO_TIMEOUT,默认情况下您不应设置为1秒.
我知道系统属性方法,但我将问题留待解决我原来的问题.
我知道(jvm)启动选项让jvm等到调试器连接 - 这不是我的意思.
是否有可能从Java代码中检测调试器的附件,以便我可以编写一个"脚本"来做一些事情,然后在某一点使我的应用程序等待调试器?
如何在"运行"模式下编写在"调试"模式下运行时不同的代码(例如在eclipse中调用为"Debug As Java Application")(例如在eclipse中调用为"Run as Java Application") )?例如,代码可以在"Debug As Java Application"时打印"Haha,您正在调试",但在"Run As Java Application"时不打印任何内容(我不想在调用main时附加任何args)有没有任何通用的方法可以在任何IDE下工作,比如eclipse,IntelliJ等?
我可以将我的应用程序作为独立应用程序(例如从命令行)或一种特定方式启动 - 它直接来自"源代码",即使用IntelliJ.
有没有办法检测应用程序是否从IntelliJ启动?只有这个,二元决定.
解决方法很多,在启动时添加了额外的选项,但是我正在寻找直接解决方案,对于C#这样 如何知道应用程序是由调试器启动的(VisualStudio)C#
该解决方案可以对任何IDE有效,但必须至少对IntelliJ有效.
对于那些(包括我)寻求准备使用代码(Scala代码):
object ProgramInfo
{
val isStandaloneApp = sun.management.ManagementFactory.getRuntimeMXBean().getInputArguments.isEmpty
val isDebugMode = scala.collection.JavaConversions.iterableAsScalaIterable(sun.management.ManagementFactory.getRuntimeMXBean().getInputArguments).exists(it => it.startsWith("-agentlib"))
}
Run Code Online (Sandbox Code Playgroud)
它不适用于复杂的情况,但是如果你没有将大量参数传递给JVM,那就没关系了.
在我的 Gradle 脚本中,我想检查测试是否由 Intellij Idea 在调试模式下启动。
我已经尝试过以下方法:
Test#getDebug() 总是返回假
ManagementFactory#getRuntimeMXBean()... 为运行和调试执行返回相同的参数(因为 Gradle 本身在调试模式下不是 startet,只有测试)
检测 --debug总是返回 false
如何确定 Intellij 是否在调试模式下启动测试?
这可能类似于检测是否--debug-jvmisset,但截至目前,我找不到启动任务的进程。(我试过类似的东西ps aux | grep test,但没有结果)
我想根据--debug交换机是否存在来修改我的应用程序的工作方式.我在我的@Configuration文件中试过这个:
@Value("\${debug}")
lateinit var debug: String
Run Code Online (Sandbox Code Playgroud)
但是春天说
无法在值"$ {debug}"中解析占位符'debug'
如何查询--debug选项的状态?
有没有办法从运行/调试的 Java 代码中检查我们是否正在 Intellij IDEA 调试器中运行?