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