确定java应用程序在Eclipse中是否处于调试模式

确定java应用程序在Eclipse中是否处于调试模式,java,eclipse,debugging,logging,Java,Eclipse,Debugging,Logging,我想根据是否进行调试来更改日志记录级别,但找不到代码片段来检查应用程序是否在调试模式下运行 我正在使用eclipse调试应用程序,因此,如果该解决方案仅在eclipse中工作,那么就可以了。如果您是从自己的程序中设置调试级别,则可能是这样一行: public static final boolean DEBUG_MODE = System.getProperty("java.vm.info", "").contains("sharing"); 我会成功的 刚刚在eclipse3.5中进行了测试

我想根据是否进行调试来更改日志记录级别,但找不到代码片段来检查应用程序是否在调试模式下运行


我正在使用eclipse调试应用程序,因此,如果该解决方案仅在eclipse中工作,那么就可以了。

如果您是从自己的程序中设置调试级别,则可能是这样一行:

public static final boolean DEBUG_MODE = System.getProperty("java.vm.info", "").contains("sharing");
我会成功的

刚刚在eclipse3.5中进行了测试:

package test;

public class Test
{

    /**
     * @param args
     */
    public static void main(String[] args)
    {
        System.out.println(System.getProperty("java.vm.info", ""));
    }

}
将显示:

mixed mode, sharing
如果在没有调试的情况下启动

mixed mode
如果使用调试启动器执行


评论:


这高度依赖于系统。
我假设“共享”表示跨VM类共享处于活动状态。
这是一项非常新的功能,仅在某些平台上可用。
此外,有许多可能的原因来启用或禁用它,所以我不会将其用于调试模式检测

(注意:我用最新的jdk1.6b14测试了它。我将此作为CW答案。)

看看这里:

此外,我认为你不知道你的应用程序是否在调试模式下运行。您唯一能做的就是在调试时向JVM传递一个参数


手动

您可以修改调试配置。例如,仅在调试配置中添加一个特殊的VM参数。您可以使用
System.getProperties()
读取提供的参数


更好的是,修改配置(运行和调试)以加载不同的日志配置文件。如果您需要编写代码来确定日志记录级别,这是不好的。这应该只是配置问题。

您是否尝试在eclipse运行配置中添加vm参数

将其作为VM参数传递

-Ddebug=true

然后您可以执行
Boolean.getBoolean(“调试”)
来检查这一点。

没有一种官方认可的方法可以从JVM本身内部可靠地确定任何给定JVM是否处于调试模式,依赖工件只会在将来某个时候破坏您的代码

因此,您需要自己介绍一种方法学。建议:

  • 系统属性
  • 环境变量(外壳变量,如$HOME或%HOME%)
  • 向JVM询问给定资源的物理位置——并根据它做出决定(路径中是否包含“debug”一词?它是在jar中还是在未打包的类文件中?等等)
  • JNDI
  • 特定资源的存在或内容
    • 在上找到了答案

      这将检查是否使用了代理。

      如果使用套接字(例如9999),您可以调用netstat检查是否建立了连接:

      Process p = new ProcessBuilder("netstat", "-n").start();
      String stdout = IOUtils.toString(p.getInputStream(), Charset.defaultCharset());
      

      然后在stdout中扫描127.0.0.1:9999.*已建立

      用于eclipse平台/插件跟踪,而不是正常调试。我想可能有一个属性,但我对调试启动和运行启动(使用eclipse 3.3、Java 1.6.0_13、Ubuntu 9.04)的属性完全转储的测试是相同的。(我还尝试了你的属性,包括一次调试运行,我跳过System.out行,运行和调试启动都提供了“混合模式”。这在很大程度上取决于系统。我简化了“共享”表示跨VM类共享处于活动状态。这是一项非常新的功能,仅在某些平台上可用。此外,可能有许多原因需要启用或禁用它,因此我不会将其用于调试模式检测。@Joachim:这一点很好(我在这里使用最新的jdk 1.6b14)。我将更新我的答案,并将其作为社区维基存档。依靠缩进的字符串属性内容供人类阅读,充其量是脆弱的。@ThorbjørnRavnAndersen我同意(并对你的答案进行了投票)。这是我5年前发现的。为我辩护,当时(2010年7月),另一种产品被“字符串属性”咬了一口更改:和,对于“
      java.vendor
      ”布尔值isDebug=java.lang.management.ManagementFactory.getRuntimeMXBean().getInputArguments().toString().contains(“-agentlib:jdwp”)@FrankMeulenaar,这是非常特定于供应商的。这很好,只要您知道。请注意,一些调试程序仍然使用旧参数
      -Xrunjdwp
      ,我编写此代码是为了查找两个JVM参数。如果禁用JMX呢?boolean isDebug=ManagementFactory.getRuntimeMXBean().getInputArguments().stream().anyMatch(arg->.arg.StartWith(“-agentlib:jdwp”))有时您不关心将来的代码,您只需要现在就能够调试它,正常情况下会很好地工作。@user1663987您仍然需要了解这些情况,以便在任何给定情况下选择最合适的方法。请注意,启用调试之间存在巨大差异(对于所有实际目的来说,被调试的程序是看不见的)和更改日志配置-这并不是大多数程序员所期望的相互影响的事情。Boolean.getBoolean(“debug”)是愚蠢的,因为它试图转换字符串“debug”“to bool,这会导致false always。@Daniel正如JavaDocs所说的那样,这是一种误导:当且仅当由参数命名的系统属性存在且等于字符串“true”时,才返回true。因此,只要设置了此属性,此解决方案就有效。
      Process p = new ProcessBuilder("netstat", "-n").start();
      String stdout = IOUtils.toString(p.getInputStream(), Charset.defaultCharset());