9

可能重复:
如何确定是否启用了“调试模式”

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

#if DEBUG
    executedCode();
#endif

或者是这样的:

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

想法?

编辑:感谢 Matt Ball,这个可能重复的代码可以工作:

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

4 回答 4

2

我认为您将程序的调试版本与在调试器下运行(除非 C# 相当奇怪)混为一谈。

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

  • 发布版本,只有信息/错误/警告日志,没有调试符号,额外的优化等。
  • 调试构建,启用额外的日志记录,调试符号,可能调整优化。

您在开发和调试程序时使用调试版本,并为最终的 QA 和发布发布版本。然而,调试版本独立于在调试器下运行——它们是普通程序,如果你运行它们,运行仍然会输出它们额外的日志信息。这可能非常有用。

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

与 C、C++ 和 C# 不同,Java 没有编译时条件的功能,因此程序中的所有内容都已启用。您通常通过一种非常快速的方法来检查是否要发出调试消息,并在没有发出的情况下做尽可能少的工作来处理这个问题。

于 2012-07-17T14:35:38.903 回答
1

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

条件编译标志被故意排除在 Java 之外,他们想要避免复杂性。C# 有不同的哲学。

于 2012-07-17T14:30:20.757 回答
0

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

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

之后...

if (Globals.debugFlag){...}

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

于 2012-07-17T14:33:06.280 回答
0

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

您会发现的问题是,Java 有六个以上广泛用于日志记录的库。

有内置的记录器。

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

Log4j 应用广泛,slf4j 和 Logback 也很流行。

甚至还有用于抽象出您实际使用的记录器的库,例如公共日志记录。

于 2012-07-17T14:27:14.953 回答