Tho*_*ler 39 java eclipse debugging
Java程序如何确定它是否在调试模式下运行?
应用程序在常规"全速"模式下的行为应与"调试模式"(在附加调试器时,在调试模式下运行时)略有不同.应用程序通过TCP与另一台计算机,另一个进程或其自身进行通信.我的同事希望我们Socket.setSoTimeout(1000)默认使用,以便从套接字读取最多可以阻止1秒钟.调试时,这当然是不够的,应用程序停止工作.所以解决方案是设置SO_TIMEOUT更高,但只是在调试模式(例如:无限制).现在,我并不总是设置断点或者不想使用调试构建,我可以自己设置"debug"属性.有时我会附加调试器(远程调试).我主要使用Eclipse,所以在那里工作的解决方案是可以的.
可能的答案包括:
要确定是否在调试模式下运行,请使用以下方法java.lang.management.*或javax.management.*...
您的同事因X原因错误SO_TIMEOUT,默认情况下您不应设置为1秒.
我知道系统属性方法,但我将问题留待解决我原来的问题.
Tho*_*ler 71
我现在发现了自己:
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
    getInputArguments().toString().indexOf("jdwp") >= 0;
这将检查是否使用了Java Debug Wire Protocol代理.
gus*_*afc 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
这很好,因为在调试器中激活应用程序时它不会神奇地改变行为,并且您可以在不调试时更改超时(例如,如果您需要在某些地方以慢速连接运行它,某天).
(当然,如果您的系统已经使用了配置文件,则可能适合将此值添加为其中的条目.)
至于一秒钟是否适当超时......这完全取决于应用程序.有时,最好给出一个正确的答案最终,其他时间没有很快是不是等待成功更好.
你正在解决错误的问题.你的程序不需要知道这个,除非它处理eclipse或jvm内部.
使用具有默认值的系统属性:
int timeout = Integer.parseInt( 
    System.getProperty("socket.timeout", "1000"));
socket.setSoTimeout(timeout);
在调试启动配置中,只需添加即可
-Dsocket.timeout=20000
到调用参数
(如果未指定系统属性,则将使用默认值)