您是否可以在Java中检测代码是否正在调试?

时间:2012-07-17 14:22:34

标签: java debugging

  

可能重复:
  How to find out if “debug mode” is enabled

来自C#,我无法相信Java只有在调试程序时才能执行代码。不知何故,Log4J似乎能够做到这一点。有谁知道这种可能性?我在考虑这样的事情:

#if DEBUG
    executedCode();
#endif

或类似的东西:

if (Java.isDebugging())
    executeCode();

想法?

编辑:感谢Matt Ball,this中的代码可能重复:

public static boolean debugging = java.lang.management.ManagementFactory.getRuntimeMXBean().
        getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;

4 个答案:

答案 0 :(得分:2)

我认为你正在将一个程序的 debug build 与在调试器下运行混淆(除非C#相当奇怪)。

许多系统 - 包括许多C / C ++构建环境,我希望C#,考虑到Microsoft历史上设计Visual Studio构建过程的方式 - 有两种不同类型的构建:

  • 发布版本,仅包含信息/错误/警告日志记录,无调试符号,额外优化等。
  • 调试版本,启用了额外的日志记录,调试符号,可能还有调优的优化。

您在开发和调试程序时使用调试版本,并发布版本以进行最终的QA和发布。但是,调试版本与在调试器下运行无关 - 它们是普通程序,如果运行它们,它们仍会输出额外的日志记录信息。这非常有用。

在调试器下运行它们是完全正交的。您可以在调试器下运行发布版本(尽管缺少调试符号,它可能不是很有用)。实际上,我会提出您不希望代码根据您是否在调试器下运行而更改 - 这使得调试实际在应用程序中运行的代码变得相当困难。

与C,C ++和C#不同,Java没有编译时条件的功能,所以在程序中启用了所有内容。您通常可以通过非常快速的方式来检查是否要发出调试消息,并在不发生调试消息的情况下尽可能少地进行处理。

答案 1 :(得分:1)

C仅在调试时才执行代码,您显示的是条件编译指令,仅当标志值为true时才编译代码。运行代码不知道何时进行调试。与Log4j一样,它正在从其配置中读取要使用的级别,它不知道何时进行调试。

条件编译标志故意不在Java之外,他们希望避免复杂性。 C#有不同的理念。

答案 2 :(得分:0)

也许您正在考虑调试日志记录,这与使用调试器不同。

你会发现问题是Java有超过6个被广泛用于日志记录的库。

内置记录器。

http://docs.oracle.com/javase/1.4.2/docs/guide/util/logging/overview.html

Log4j被广泛使用,slf4j和Logback也很受欢迎。

甚至还有一些库可用于抽象出您实际使用的记录器,例如:公共伐木。

答案 3 :(得分:0)

您可以按照描述使用全局标记执行此操作。虽然它应该注意它不会自动检测,但您必须在开始调试之前自己更改标志。

public class Globals
{
    public static final boolean debugFlag = false;
}

...后

if (Globals.debugFlag){...}

如果您想在调试时执行功能代码,则只需要这样做。它也是一种强力解决方案,因为你必须在任何地方打开它才能打开它。如果需要更多粒度,可以在要使用成员标志调试的特定类中执行类似操作。如果你想要的只是在调试块中记录,请参阅Peter关于记录库的答案。