2009-07-10 6 views
30
ist

Ich möchte die Protokollierungsstufe abhängig ändern, wenn ich debuggen oder nicht, aber ich kann kein Code-Snippet finden, um zu überprüfen, ob die Anwendung im Debug-Modus ausgeführt wird.Ermitteln, ob eine Java-Anwendung im Debug-Modus in Eclipse

Ich benutze Eclipse, um die Anwendung zu debuggen, wenn also die Lösung nur in Eclipse funktioniert, wird es in Ordnung sein.

Antwort

21

Sie könnten die Debug-Konfiguration ändern. Fügen Sie beispielsweise ein spezielles VM-Argument nur in der Debug-Konfiguration hinzu. Sie können System.getProperties() verwenden, um die bereitgestellten Argumente zu lesen.

Noch besser, ändern Sie die Konfigurationen (Run und Debug), um eine andere Logging-Konfigurationsdatei zu laden. Es ist nicht gut, wenn Sie Code schreiben müssen, um die Protokollierungsstufe zu bestimmen. Dies sollte nur eine Frage der Konfiguration sein.

+3

@ hB0 Die ursprüngliche Frage bezieht sich nicht auf Android. –

2

Wenn Sie das Debug-Level aus dem eigenen Programm einstellen, kann eine Linie sein, wie:

public static final boolean DEBUG_MODE = System.getProperty("java.vm.info", "").contains("sharing"); 

den Trick tun würde.

getestet Gerade in eclipse3.5:

package test; 

public class Test 
{ 

    /** 
    * @param args 
    */ 
    public static void main(String[] args) 
    { 
     System.out.println(System.getProperty("java.vm.info", "")); 
    } 

} 

wird angezeigt:

mixed mode, sharing 

gestartet, wenn ohne Debug

mixed mode 

mit Debug Launcher ausgeführt, wenn


Joachim Sauer Kommentare:

Dies ist sehr System abhängig.
Ich nehme an, die "Freigabe" zeigt an, dass Cross-VM-Klassenfreigabe aktiv ist.
Dies ist eine sehr neue Funktion und ist nur auf einigen Plattformen verfügbar.
Darüber hinaus gibt es viele mögliche Gründe, um es zu deaktivieren oder zu deaktivieren, also würde ich dies nicht für die Debug-Modus-Erkennung verwenden.

. (Anmerkung: Ich kann es mit der neuesten jdk1.6b14 getestet Ich lasse dies als CW Antwort.)

+0

Ich dachte, es könnte eine Eigenschaft sein, aber meine Tests von vollständigen Dumps von Eigenschaften von einem Debug-Start und einem Start (mit Eclipse 3.3, Java 1.6.0_13, Ubuntu 9.04) waren identisch. (Ich habe auch nur Ihre Eigenschaft ausprobiert, einschließlich eines Debug-Laufs, bei dem ich über die System.out-Zeile gegangen bin und sowohl der Run als auch der Debug-Start "Mixed-Modus" gegeben haben. – gojomo

+1

Das hängt stark vom System ab. Ich nehme an, die "Freigabe" zeigt das an Die Cross-VM-Klassenfreigabe ist aktiv. Dies ist eine sehr neue Funktion, die nur auf einigen Plattformen verfügbar ist. Außerdem kann es viele Gründe dafür geben, sie zu deaktivieren oder zu deaktivieren. Daher würde ich dies nicht für die Debug-Modus-Erkennung verwenden. –

+1

@Joachim: guter Punkt (Ich bin mit dem neuesten jdk 1.6b14 hier.) Ich werde meine Antwort aktualisieren und es für das Archiv als Community Wiki verlassen – VonC

3

Haben Sie versucht, ein Vm-Argument in der Eclipse-Run-Konfiguration hinzufügen?

So etwas wie

-Dxxxx=true 

und Sie Boolean.getProperty("xxxx") dies überprüfen verwenden können.

7

Es gibt keine offiziell sanktionierte Methode, zuverlässig zu bestimmen, ob sich eine bestimmte JVM im Debug-Modus innerhalb der JVM selbst befindet. Wenn Sie sich auf Artefakte verlassen, wird Ihr Code irgendwann in der Zukunft beschädigt.

Sie müssen daher eine Methodik selbst einführen. Vorschläge:

  • Eine Systemeigenschaft.
  • Eine Umgebungsvariable (Shell-Variable wie $ HOME oder% HOME%)
  • Stellen Sie die JVM über den physischen Speicherort einer bestimmten Ressource - http://www.exampledepot.com/egs/java.lang/ClassOrigin.html - und darauf basierende, machen Sie Ihre Entscheidung (nicht der Pfad enthält das Wort " debuggen "? ist es in einem Jar oder einer entpackten Klassendatei? etc).
  • JNDI
  • Die Existenz oder der Inhalt einer bestimmten Ressource.
+0

Und manchmal interessiert dich der Code in der Zukunft nicht, du musst ihn nur jetzt debuggen können und der normale Fall wird gut funktionieren. – simpleuser

+0

@ user1663987 Sie müssen diese Dinge immer noch wissen, um in jeder Situation die am besten geeignete Methode zu wählen. Bitte beachten Sie, dass es einen großen Unterschied zwischen der Aktivierung des Debugging (was praktisch für das zu überprüfende Programm unsichtbar ist) und der Änderung der Log-Konfiguration gibt - das ist etwas, was die meisten Programmierer nicht erwarten würden, dass sie sich gegenseitig beeinflussen würden. –

42

die Antwort gefunden auf how-to-find-out-if-debug-mode-is-enabled

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

Diese überprüft, ob das Java Debug Wire Protocol Mittel verwendet wird.

+10

boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean(). getInputArguments(). ToString(). Enthält ("- agentlib: jdwp"); –

+0

@FrankMeulenaar, die sehr herstellerspezifisch ist. Was ist in Ordnung, solange Sie wissen. –

+2

Beachten Sie, dass einige debuger immer noch das alte Argument '-Xrunjdwp' verwenden. Ich habe diesen Code für beide JVM-Argumente erstellt. – Brice

Verwandte Themen