Können Sie in Java erkennen, ob der Code debuggt wird? [Duplikat]

9

Da ich von C # komme, kann ich nicht glauben, dass Java keine Möglichkeit hat, Code nur auszuführen, wenn das Programm debuggt wird. Log4J scheint irgendwie dazu in der Lage zu sein. Kennt jemand eine Möglichkeit dafür? Ich denke an so etwas:

%Vor%

Oder so etwas:

%Vor%

Ideen?

EDIT: Dank Matt Ball, der Code in dies mögliche doppelte Werke:

%Vor%     
Akku 17.07.2012, 14:22
quelle

4 Antworten

2

Ich denke, dass Sie einen Debug-Build eines Programms mit laufendem Debugger zusammenführen (es sei denn, C # ist ziemlich seltsam).

Viele Systeme - einschließlich vieler C / C ++ - Buildumgebungen und ich erwarte, dass C # angesichts der von Microsoft historisch entworfenen Build-Prozesse von Visual Studio - zwei verschiedene Typen von Builds haben kann:

  • Release-Build, mit nur Info / Fehler / Warnung Protokollierung, keine Debug-Symbole, zusätzliche Optimierungen, etc.
  • Debug-Build, mit zusätzlicher Protokollierung aktiviert, Debug-Symbole, möglicherweise optimierte Optimierungen.

Sie verwenden Debug-Builds beim Entwickeln und Debuggen Ihres Programms und veröffentlichen Builds für die abschließende QS und Freigabe. Die Debug-Builds sind jedoch unabhängig von der Ausführung unter einem Debugger - sie sind normale Programme, und wenn Sie sie ausführen, geben Sie ihre zusätzlichen Protokollierungsinformationen aus. Dies kann sehr nützlich sein.

Das Ausführen unter einem Debugger ist vollständig orthogonal. Sie können den Release-Build unter einem Debugger ausführen (obwohl es keine Debug-Symbole gibt, ist es möglicherweise nicht sehr nützlich). In der Tat würde ich vorschlagen, dass Code nicht geändert werden soll, je nachdem, ob Sie unter einem Debugger laufen - es macht es ziemlich schwierig, den Code zu debuggen, der tatsächlich in der Anwendung ausgeführt wird.

Und im Gegensatz zu C, C ++ und C # hat Java keine Möglichkeit für Kompilierungsbedingungen, so dass alles im Programm aktiviert ist. In der Regel behandeln Sie dies mit einer sehr schnellen Methode, um zu überprüfen, ob die Debugging-Meldung ausgegeben werden soll, und in dem Fall, in dem dies nicht der Fall ist, so wenig wie möglich zu tun.

    
Michael Ekstrand 17.07.2012, 14:35
quelle
1

C führt Code nur beim Debuggen nicht aus, was Sie zeigen, ist eine bedingte Kompilierungsanweisung, der Code wird nur kompiliert, wenn der Flagwert wahr ist. Der laufende Code hat keine Ahnung, wann er debuggt wird. Ähnlich wie bei Log4j liest es aus seiner Konfiguration, welche Ebene zu verwenden ist, es hat keine Ahnung, wann es debuggt wird.

Bedingte Compile-Flags wurden bewusst aus Java heraus gelassen, sie wollten Komplexität vermeiden. C # hat eine andere Philosophie.

    
Nathan Hughes 17.07.2012 14:30
quelle
0

Vielleicht denken Sie über die Debug-Protokollierung nach, die nicht mit der Verwendung des Debuggers identisch ist.

Das Problem, das Sie finden werden, ist, dass Java mehr als ein halbes Dutzend Bibliotheken zum Protokollieren verwendet.

Da ist der eingebaute Logger.

Ссылка

Log4j ist weit verbreitet, und slf4j und Logback sind ebenfalls beliebt.

Es gibt sogar Bibliotheken, die abstrahieren, welchen Logger Sie tatsächlich verwenden, z. commons Protokollierung.

    
Peter Lawrey 17.07.2012 14:27
quelle
0

Sie können es wie beschrieben mit einer globalen Flagge tun. Obwohl es beachten sollte, dass es nicht automatisch erkannt wird, müssten Sie die Flagge selbst ändern, bevor Sie mit dem Debuggen beginnen.

%Vor%

später ...

%Vor%

Dies ist nur dann wirklich erforderlich, wenn Sie beim Debugging funktionalen Code ausführen wollen. Es ist auch eine Brute-Force-Lösung, da Sie es überall anschalten müssen, um es überall einzuschalten. Sie könnten etwas ähnliches in einer bestimmten Klasse tun, die Sie mit einem Mitglied-Flag debuggen möchten, wenn Sie mehr Granularität benötigen. Wenn Sie sich nur im Debugblock anmelden möchten, lesen Sie Peters Antwort zum Protokollieren von Bibliotheken.

    
Thomas 17.07.2012 14:33
quelle

Tags und Links