Java程序如何判断它是否在调试模式下运行?
应用程序在常规“全速”模式下的行为应该与“调试模式”(在附加调试器时,在调试模式下运行时)有所不同。应用程序通过TCP与另一台计算机,另一个进程或其自身进行通信。我的同事希望我们默认使用Socket.setSoTimeout(1000)
,以便从套接字读取最多可以阻止1秒。调试时,这当然是不够的,应用程序停止工作。因此,解决方案是将SO_TIMEOUT
设置得更高,但只是在调试模式下(例如:无限制)。现在,我并不总是设置断点或者不想使用调试构建,我可以自己设置“debug”属性。有时我会附加调试器(远程调试)。我主要使用Eclipse,所以在那里工作的解决方案没问题。
可能的答案包括:
要了解是否在调试模式下运行,请在java.lang.management.*
或javax.management.*
...
您的同事因X原因错误,默认情况下您不应将SO_TIMEOUT
设置为1秒。
我知道系统属性方法,但我保留问题以解决我原来的问题。
答案 0 :(得分:70)
我现在发现了自己:
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("jdwp") >= 0;
这将检查是否使用了Java Debug Wire Protocol代理。
答案 1 :(得分:10)
使超时可配置。最简单的方法是使用系统属性并使用Integer.getInteger
读取它:
private final static int SOCKET_TIMEOUT =
Integer.getInteger("com.yourapp.module.socketTimeout", 1000); // default 1 sec
然后,在启动应用程序进行调试时,只需从命令行设置属性(或相应的配置文件,具体取决于应用程序运行的环境):
java -Dcom.yourapp.module.socketTimeout=1000000 MainClass
这很好,因为在调试器中激活应用程序时它不会神奇地改变行为,并且您可以在不调试时更改超时(例如,如果您需要在连接速度较慢的地方运行它,一些天)。
(当然,如果您的系统已经使用了配置文件,则可能适合将此值添加为其中的条目。)
关于一秒是否适当超时......这完全取决于应用程序。有时最好给出正确答案最终,其他时候快速失败比等待成功要好。
答案 2 :(得分:5)
你正在解决错误的问题。你的程序不需要知道这个,除非它处理eclipse或jvm内部。
使用具有默认值的系统属性:
int timeout = Integer.parseInt(
System.getProperty("socket.timeout", "1000"));
socket.setSoTimeout(timeout);
在调试启动配置中,只需添加
即可-Dsocket.timeout=20000
调用参数
(如果未指定系统属性,则将使用默认值)