如何找出是否启用“debugging模式”
Java程序如何发现它是否在debugging模式下运行?
在“全速”模式下,应用程序应该与“debugging模式”(当连接debugging器时,在debugging模式下运行时)有所不同。 应用程序通过TCP与其他计算机,另一个进程或其内部进行通信。 我的同事希望我们默认使用Socket.setSoTimeout(1000)
,以便从套接字读取最多可以阻塞1秒。 当debugging时,这当然是不够的,应用程序停止工作,因为它应该。 所以一个解决scheme是将SO_TIMEOUT
更高,但只是在debugging模式下(例如:无限制)。 现在,我不总是设置断点,或者不想使用debugging版本,我可以自己设置“debugging”属性。 有时我附加debugging器(远程debugging)。 我主要使用Eclipse,所以只有在那里工作的解决scheme是好的。
可能的答案包括:
-
要查明是否以debugging模式运行,请在
java.lang.management.*
或javax.management.*
使用以下方法… -
你的同事是错误的原因X,你不应该默认设置
SO_TIMEOUT
1秒。
更新
我知道系统属性的方法,但我留下了问题,以解决我原来的问题。
我现在自己发现了:
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean(). getInputArguments().toString().indexOf("jdwp") >= 0;
这将检查是否使用了Javadebugging有线协议代理。
使超时可configuration。 最简单的方法就是使用一个系统属性并用Integer.getInteger
读取它:
private final static int SOCKET_TIMEOUT = Integer.getInteger("com.yourapp.module.socketTimeout", 1000); // default 1 sec
然后,当启动您的应用程序进行debugging时,只需从命令行(或适当的configuration文件,根据您的应用程序运行的环境)设置属性:
java -Dcom.yourapp.module.socketTimeout=1000000 MainClass
这很好,因为它不会在debugging器中启动应用程序时奇迹般地改变行为,并且可以在不debugging时更改超时(例如,如果需要在某个连接速度较慢的某个地方某天运行)。
(当然,如果你的系统已经使用了一个configuration文件,那么可以把这个值作为一个入口来代替)。
至于是否有一秒是适当的超时…完全取决于应用程序。 有时最好是最终给出正确的答案,其他时间的失败总比等待成功更好。
你正在解决错误的问题。 你的程序不需要知道这个,除非它处理eclipse或jvm内部。
解
使用具有默认值的系统属性:
int timeout = Integer.parseInt( System.getProperty("socket.timeout", "1000")); socket.setSoTimeout(timeout);
在debugging启动configuration中,只需添加
-Dsocket.timeout=20000
到通话参数
(如果您不指定系统属性,将使用默认值)
参考
- Sun Java教程中的“ 系统属性”部分
- System.getProperty(prop,def) javadocs