如何找出是否启用“debugging模式”

Java程序如何发现它是否在debugging模式下运行?

在“全速”模式下,应用程序应该与“debugging模式”(当连接debugging器时,在debugging模式下运行时)有所不同。 应用程序通过TCP与其他计算机,另一个进程或其内部进行通信。 我的同事希望我们默认使用Socket.setSoTimeout(1000) ,以便从套接字读取最多可以阻塞1秒。 当debugging时,这当然是不够的,应用程序停止工作,因为它应该。 所以一个解决scheme是将SO_TIMEOUT更高,但只是在debugging模式下(例如:无限制)。 现在,我不总是设置断点,或者不想使用debugging版本,我可以自己设置“debugging”属性。 有时我附加debugging器(远程debugging)。 我主要使用Eclipse,所以只有在那里工作的解决scheme是好的。

可能的答案包括:

  1. 要查明是否以debugging模式运行,请在java.lang.management.*javax.management.*使用以下方法…

  2. 你的同事是错误的原因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