9

重複の可能性:
「デバッグモード」が有効になっているかどうかを確認する方法

C#から来ているので、プログラムがデバッグされているときだけJavaがコードを実行する方法がないとは信じられません。どういうわけか、Log4Jはそれを行うことができるようです。誰かがこれの可能性を知っていますか?私はこのようなことを考えています:

#if DEBUG
    executedCode();
#endif

またはこのようなもの:

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

アイデア?

編集:マットボールのおかげで、この可能な重複のコードは機能します:

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

4 に答える 4

2

プログラムのデバッグビルドをデバッガーで実行することと混同していると思います(C#がかなり奇妙でない限り)。

多くのシステム(多くのC / C++ビルド環境を含みます。MicrosoftがこれまでVisualStudioビルドプロセスを設計してきた方法を考えると、C#を期待しています)には、次の2種類のビルドがあります。

  • ビルドをリリースします。情報/エラー/警告ログのみ、デバッグシンボルなし、追加の最適化などが含まれます。
  • 追加のロギングを有効にして、ビルドをデバッグし、シンボルをデバッグし、場合によっては最適化を調整します。

プログラムの開発とデバッグ中にデバッグビルドを使用し、最終的なQAとリリースのためにビルドをリリースします。ただし、デバッグビルドは、デバッガーで実行することとは無関係です。これらは通常のプログラムであり、実行すると、追加のログ情報が出力されます。これは非常に便利です。

デバッガーの下でそれらを実行することは完全に直交しています。リリースビルドはデバッガーで実行できます(ただし、デバッグシンボルがないため、あまり役に立たない場合があります)。実際、デバッガーで実行しているかどうかに基づいてコードを変更したくない場合は、アプリケーションで実際に実行されているコードをデバッグするのがかなり難しくなります。

また、C、C ++、およびC#とは異なり、Javaにはコンパイル時の条件文の機能がないため、プログラムですべてが有効になります。通常、これに対処するには、デバッグメッセージが発行されるかどうかを非常に高速にチェックし、発行されない場合はできるだけ少ない作業を行います。

于 2012-07-17T14:35:38.903 に答える
1

Cは、デバッグ中のみコードを実行しません。表示されているのは条件付きコンパイルディレクティブであり、コードはフラグ値がtrueの場合にのみコンパイルされます。実行中のコードは、いつデバッグされているのかわかりません。同様に、Log4jの場合、使用するレベルを構成から読み取っていますが、いつデバッグされているのかわかりません。

条件付きコンパイルフラグは意図的にJavaから除外されており、複雑さを回避したいと考えていました。C#の哲学は異なります。

于 2012-07-17T14:30:20.757 に答える
0

おそらく、デバッガーを使用するのと同じではないデバッグロギングについて考えています。

あなたが見つける問題は、Javaがロギングに広く使用されている6つ以上のライブラリを持っているということです。

内蔵のロガーがあります。

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

Log4jは広く使用されており、slf4jとLogbackも人気があります。

コモンズロギングなど、実際に使用しているロガーを抽象化するためのライブラリもあります。

于 2012-07-17T14:27:14.953 に答える
0

説明したように、グローバルフラグを使用して実行できます。自動的には検出されないことに注意してください。ただし、デバッグを開始する前に、フラグを自分で変更する必要があります。

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

後で...

if (Globals.debugFlag){...}

これは、デバッグ時に関数型コードを実行する場合にのみ本当に必要です。どこでもオンにするにはどこでもオンにする必要があるため、これは力ずくの解決策でもあります。より細かくする必要がある場合は、メンバーフラグを使用してデバッグする特定のクラスで同様のことを行うことができます。デバッグブロック内でログを記録するだけの場合は、ライブラリのログ記録に関するPeterの回答を参照してください。

于 2012-07-17T14:33:06.280 に答える