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

2022-09-01 02:23:39

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

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

可能的答案包括:

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

  2. 您的同事由于原因X而出错,默认情况下不应将其设置为1秒。SO_TIMEOUT

更新

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


答案 1

我现在自己发现了这一点:

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

这将检查是否使用了 Java 调试连线协议代理。


答案 2

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

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

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

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