代码之家  ›  专栏  ›  技术社区  ›  Thomas Mueller

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

  •  39
  • Thomas Mueller  · 技术社区  · 14 年前

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

    应用程序在常规全速模式下的行为应该与在调试模式下的行为有所不同(当附加了调试器时,在调试模式下运行时)。应用程序通过TCP与另一台计算机、另一个进程或自身进行通信。我的同事要我们用 Socket.setSoTimeout(1000) 默认情况下,从套接字读取最多可以阻止1秒。在调试时,这当然是不够的,应用程序会停止正常工作。所以一个解决办法就是 SO_TIMEOUT 更高,但仅处于调试模式(例如:unlimited)。现在,我并不总是设置断点,也不想使用调试构建来自己设置debug属性。有时我附加调试器(远程调试)。我主要使用Eclipse,所以一个在那里工作的解决方案是可以的。

    可能的答案包括:

    1. 要确定是否在调试模式下运行,请在中使用以下方法 java.lang.management.* javax.management.*

    2. 你的同事错了,因为X,你不应该 所以你超时了 默认设置为1秒。

    更新

    3 回复  |  直到 9 年前
        1
  •  73
  •   Thomas Mueller    11 年前

    我自己发现的:

    boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
        getInputArguments().toString().indexOf("jdwp") >= 0;
    

    这将检查 Java Debug Wire Protocol 使用代理。

        2
  •  13
  •   gustafc    7 年前

    使超时可配置。最简单的方法就是使用系统属性并用 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
    

    这很好,因为当你在调试器中启动应用程序时,它不会神奇地改变行为,而且你可以在不调试时更改超时(例如,如果你需要在某个连接速度慢的地方运行它,某天)。

    (当然,如果您的系统已经使用了一个配置文件,那么可以将此值作为条目添加到其中。)

    至于一秒钟是否是合适的超时时间。。。这完全取决于应用程序。有时候最好给出一个正确的答案 最后 其他时候,快速失败总比等待成功好。

        3
  •  5
  •   Sean Patrick Floyd    14 年前

    解决方案

    使用具有默认值的系统属性:

    int timeout = Integer.parseInt( 
        System.getProperty("socket.timeout", "1000"));
    socket.setSoTimeout(timeout);
    

    -Dsocket.timeout=20000
    

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

    工具书类