Determina se un’applicazione java è in modalità di debug in Eclipse

Voglio cambiare il livello di registrazione a seconda che io sia in ritardo o meno, ma non riesco a trovare uno snippet di codice per verificare se l’applicazione è in esecuzione in modalità di debug.

Sto usando eclipse per eseguire il debug dell’applicazione, quindi se la soluzione funziona solo all’interno di Eclipse andrà bene.

È ansible modificare la configurazione di debug. Ad esempio, aggiungi un argomento VM speciale solo nella configurazione di debug. È ansible utilizzare System.getProperties () per leggere gli argomenti forniti.

Ancora meglio, modifica le configurazioni (Esegui e Debug) per caricare un file di configurazione di registrazione diverso. Non va bene se è necessario scrivere codice per determinare il livello di registrazione. Questo dovrebbe essere solo una questione di configurazione.

Trovato la risposta su how-to-find-out-if-debug-mode-is-enabled

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

Questo controllerà se viene utilizzato l’agente Java Debug Wire Protocol .

Non esiste un modo ufficialmente sancito per determinare in modo affidabile se una determinata JVM è in modalità di debug all’interno della JVM stessa, e basarsi su artefatti infrange il codice in futuro.

Sarà quindi necessario presentare una metologia da soli. suggerimenti:

  • Una proprietà di sistema.
  • Una variabile di ambiente (variabile di shell come $ HOME o% HOME%)
  • Chiedi alla JVM quale sia la posizione fisica di una determinata risorsa – http://www.exampledepot.com/egs/java.lang/ClassOrigin.html – e, in base ad essa, prendi la tua decisione (il percorso contiene la parola “debug”) ? è all’interno di un jar o di un file di class decompresso? etc).
  • JNDI
  • L’esistenza o il contenuto di una particolare risorsa.

Hai provato ad aggiungere un argomento vm in eclipse run config?

Qualcosa di simile a

 -Dxxxx=true 

ed è ansible utilizzare Boolean.getProperty("xxxx") per verificare questo.

Se stai impostando il livello di debug dal tuo programma, potrebbe essere una riga come:

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

farebbe il trucco

Appena testato in eclipse3.5:

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

mostrerà:

 mixed mode, sharing 

se lanciato senza debug

 mixed mode 

se eseguito con debug launcher


Joachim Sauer commenta:

Questo è altamente dipendente dal sistema.
Presumo che la “condivisione” indichi che la condivisione della class cross-VM è triggers.
Questa è una funzionalità molto nuova ed è disponibile solo su alcune piattaforms.
Inoltre ci possono essere molti possibili motivi per en- o disabilitarlo, quindi non lo userei per il rilevamento in modalità debug.

(Nota: l’ho provato con l’ultimo jdk1.6b14. Lascio questo come risposta CW.)

Dai un’occhiata qui:

http://wiki.eclipse.org/FAQ_How_do_I_use_the_platform_debug_tracing_facility%3F

Inoltre, penso che non puoi sapere se la tua app viene eseguita in modalità di debug. L’unica cosa che puoi fare è passare un argomento alla tua JVM quando esegui il debug.

Manu