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

Akk*_*kku 9 java debugging

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

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

#if DEBUG
    executedCode();
#endif
Run Code Online (Sandbox Code Playgroud)

或类似的东西:

if (Java.isDebugging())
    executeCode();
Run Code Online (Sandbox Code Playgroud)

想法?

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

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

Mic*_*and 2

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

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

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

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

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

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