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

Tho*_*ler 39 java eclipse debugging

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

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

可能的答案包括:

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

  2. 您的同事因X原因错误SO_TIMEOUT,默认情况下您不应设置为1秒.

更新

我知道系统属性方法,但我将问题留待解决我原来的问题.

Tho*_*ler 71

我现在发现了自己:

boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
    getInputArguments().toString().indexOf("jdwp") >= 0;
Run Code Online (Sandbox Code Playgroud)

这将检查是否使用了Java Debug Wire Protocol代理.

  • 这是一个黑客,因为没有官方的API来查明是否在调试模式下运行.系统属性会很好.但在上述情况下,程序*应该在调试模式下表现不同.这完全是故意的.我只是在调试时不想手动设置系统属性*. (3认同)
  • Java 8:`java.lang.management.ManagementFactory.getRuntimeMXBean().getInputArguments().stream().anyMatch(s -> s.contains("jdwp"))` (3认同)

gus*_*afc 10

使超时可配置.最简单的方法是只使用系统属性并使用以下内容读取Integer.getInteger:

private final static int SOCKET_TIMEOUT =
  Integer.getInteger("com.yourapp.module.socketTimeout", 1000); // default 1 sec
Run Code Online (Sandbox Code Playgroud)

然后,在启动应用程序进行调试时,只需从命令行设置属性(或根据应用程序运行的环境,设置相应的配置文件):

java -Dcom.yourapp.module.socketTimeout=1000000 MainClass
Run Code Online (Sandbox Code Playgroud)

这很好,因为在调试器中激活应用程序时它不会神奇地改变行为,并且您可以在不调试时更改超时(例如,如果您需要在某些地方以慢速连接运行它,某天).

(当然,如果您的系统已经使用了配置文件,则可能适合将此值添加为其中的条目.)

至于一秒钟是否适当超时......这完全取决于应用程序.有时,最好给出一个正确的答案最终,其他时间没有很快是不是等待成功更好.

  • `Integer.getInteger(..)`?Darn,我不知道那一个.酷(+1) (3认同)
  • @ThomasMueller 如果在调试模式下运行,只需设置一个 `com.yourapp.debug=true` 系统属性并让您的应用程序检查它。如果它是默认值,那么您不是在调试模式下运行。这可以在 Eclipse Debug 配置中完成,这意味着您不需要在每次要调试程序时都输入它。 (2认同)

Sea*_*oyd 5

你正在解决错误的问题.你的程序不需要知道这个,除非它处理eclipse或jvm内部.

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

int timeout = Integer.parseInt( 
    System.getProperty("socket.timeout", "1000"));
socket.setSoTimeout(timeout);
Run Code Online (Sandbox Code Playgroud)

在调试启动配置中,只需添加即可

-Dsocket.timeout=20000
Run Code Online (Sandbox Code Playgroud)

到调用参数

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

参考