web-dev-qa-db-fra.com

Déterminer si une application Java est en mode débogage dans Eclipse

Je souhaite modifier le niveau de journalisation en fonction du débogage ou non, mais je ne trouve pas d'extrait de code pour vérifier si l'application s'exécute en mode débogage.

J'utilise Eclipse pour déboguer l'application, donc si la solution ne fonctionne que dans Eclipse, tout ira bien.

37
Serxipc

Vous pouvez modifier la configuration de débogage. Par exemple, ajoutez un argument spécial VM uniquement dans la configuration de débogage. Vous pouvez utiliser System.getProperties() pour lire les arguments fournis.

Encore mieux, modifiez les configurations (Run et Debug) pour charger un fichier de configuration de journalisation différent. Ce n'est pas bon si vous devez écrire du code pour déterminer le niveau de journalisation. Cela ne devrait être qu'une question de configuration.

21
kgiannakakis

Trouvé la réponse sur comment-savoir-si-le mode de débogage est activé

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

Cela vérifiera si l'agent Java Debug Wire Protocol est utilisé.

53
topgun_ivard

Il n'y a pas de moyen officiellement approuvé pour déterminer de manière fiable si une JVM donnée est en mode débogage depuis l'intérieur de la JVM elle-même, et s'appuyer sur des artefacts ne fera que casser votre code dans le futur.

Vous devrez donc introduire vous-même une méthologie. Suggestions:

  • Une propriété système.
  • Une variable d'environnement (variable Shell comme $ HOME ou% HOME%)
  • Demandez à la machine virtuelle Java l'emplacement physique d'une ressource donnée - http://www.exampledepot.com/egs/Java.lang/ClassOrigin.html - et sur cette base, prenez votre décision (le chemin contient le mot "debug"? est-ce à l'intérieur d'un bocal ou d'un fichier de classe décompressé? etc).
  • JNDI
  • L'existence ou le contenu d'une ressource particulière.
7

Avez-vous essayé d'ajouter un argument vm dans la configuration d'exécution d'Eclipse?

Passez ceci comme un argument VM

-Ddebug=true

alors vous pouvez faire Boolean.getBoolean("debug") pour vérifier cela.

3
J-16 SDiZ

Si vous définissez le niveau de débogage à partir de votre propre programme, il peut s'agir d'une ligne comme:

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

ferait l'affaire.

Je viens de le tester dans Eclipse3.5:

package test;

public class Test
{

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

}

affichera:

mixed mode, sharing

si lancé sans débogage

mixed mode

s'il est exécuté avec le lanceur de débogage


Joachim Sauer commentaires:

Cela dépend fortement du système.
Je suppose que le "partage" indique que le partage de classes entre VM est actif.
Ceci est une toute nouvelle fonctionnalité et n'est disponible que sur certaines plates-formes.
De plus, il peut y avoir de nombreuses raisons possibles pour l'activer ou le désactiver, donc je ne l'utiliserais pas pour la détection en mode débogage.

(Remarque: je l'ai testé avec le dernier jdk1.6b14. Je laisse cela comme une réponse CW.)

2
VonC

Jetez un œil ici:

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

De plus, je pense que vous ne pouvez pas savoir si votre application est exécutée en mode débogage. La seule chose que vous pouvez faire est de passer un argument à votre machine virtuelle Java lorsque vous déboguez.

Manu

0
Manuel Selva