如何确定是否启用了“调试模式”

时间:2010-09-23 07:30:20

标签: java eclipse debugging

Java程序如何判断它是否在调试模式下运行?

应用程序在常规“全速”模式下的行为应该与“调试模式”(在附加调试器时,在调试模式下运行时)有所不同。应用程序通过TCP与另一台计算机,另一个进程或其自身进行通信。我的同事希望我们默认使用Socket.setSoTimeout(1000),以便从套接字读取最多可以阻止1秒。调试时,这当然是不够的,应用程序停止工作。因此,解决方案是将SO_TIMEOUT设置得更高,但只是在调试模式下(例如:无限制)。现在,我并不总是设置断点或者不想使用调试构建,我可以自己设置“debug”属性。有时我会附加调试器(远程调试)。我主要使用Eclipse,所以在那里工作的解决方案没问题。

可能的答案包括:

  1. 要了解是否在调试模式下运行,请在java.lang.management.*javax.management.* ...

  2. 中使用以下方法
  3. 您的同事因X原因错误,默认情况下您不应将SO_TIMEOUT设置为1秒。

  4. 更新

    我知道系统属性方法,但我保留问题以解决我原来的问题。

3 个答案:

答案 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

调用参数

(如果未指定系统属性,则将使用默认值)

参考