确定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答案。)

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

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传递一个参数

Manu

看看这里:

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


手动

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


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

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


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

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

将其作为VM参数传递

-Ddebug=true

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

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

将其作为VM参数传递

-Ddebug=true

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

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

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

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

没有一种官方认可的方法可以从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());
      
      然后在标准输出中扫描127.0.0.1:9999.*已建立

      如果使用套接字(例如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平台/插件跟踪,而不是正常调试。我想可能有一个属性,但是我对调试启动和运行启动的属性的完全转储的测试(使用Eclipse 3.3、Java 1.6.0_13、Ubuntu 9.04)都是相同的。(我还尝试了你的属性,包括一次调试运行,我跳过System.out行,运行和调试启动都给出了“混合模式”。这高度依赖于系统。我假设“共享”表示跨VM类共享处于活动状态。这是一项非常新的功能,仅在某些平台上可用。此外,可能有许多原因需要启用或禁用它,因此我不会将其用于调试模式检测。@Joachim:这一点很好(我在这里使用最新的jdk 1.6b14)。我将更新我的答案并将其作为社区Wiki存档。依赖字符串属性缩进的内容