Comment savoir si le mode "debug" est activé

comment un programme Java peut-il savoir s'il fonctionne en mode debug?

l'application doit se comporter un peu différemment en mode régulier" full speed "qu'en" debug mode " (lorsqu'un débogueur est attaché, lorsqu'il est exécuté en mode debug). L'application communique via TCP avec un autre ordinateur, un autre processus ou en elle-même. Mon collègue veut que nous utilisions Socket.setSoTimeout(1000) par défaut, de sorte que les lectures à partir de la socket peuvent bloquer pendant au plus 1 seconde. Lors du débogage, ce n'est évidemment pas suffisant, et l'application cesse de fonctionner comme il se doit. Donc une solution serait de définir le SO_TIMEOUT plus haut, mais juste en mode de débogage (par exemple: illimité). Maintenant, je ne fixe pas toujours les points de rupture ou Je ne veux pas utiliser une construction de débogage où je pourrais définir la propriété "debug" moi-même. Parfois j'attache le débogueur (déboguage à distance). J'utilise principalement Eclipse donc une solution qui fonctionne juste là est OK.

réponses possibles:

  1. pour savoir si vous utilisez le mode de débogage, utilisez la méthode suivante dans java.lang.management.* ou javax.management.* ...

  2. votre collègue a tort pour la raison X, vous ne devriez pas mettre SO_TIMEOUT à 1 seconde par défaut.

mise à Jour

je sais À propos de l'approche de propriété du système, mais je laisse la question ouverte pour résoudre ma question originale.

38
demandé sur David Foerster 2010-09-23 11:30:20

3 réponses

Je l'ai découvert moi-même maintenant:

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

ceci vérifiera si L'agent Java Debug Wire Protocol est utilisé.

67
répondu Thomas Mueller 2013-06-28 09:47:06

rend le timeout configurable. La manière la plus simple est d'utiliser une propriété du système et de la lire avec Integer.getInteger :

private final static int SOCKET_TIMEOUT =
  Integer.getInteger("com.yourapp.module.socketTimeout", 1000); // default 1 sec

ensuite, lors du démarrage de votre application pour le débogage, définissez simplement la propriété à partir de la ligne de commande (ou un fichier de configuration approprié, selon l'environnement dans lequel votre application s'exécute):

java -Dcom.yourapp.module.socketTimeout=1000000 MainClass

c'est bien parce que cela ne modifie pas magiquement le comportement lorsque vous lancez l'application dans un Débogueur, et vous pouvez changer le temps d'arrêt quand vous ne déboguez pas (par exemple, si vous avez besoin de l'exécuter quelque part avec une connexion lente, un jour).

(bien sûr, si votre système utilise déjà un fichier de configuration, il peut être approprié d'ajouter cette valeur comme entrée.)

si la seconde est un délai approprié... qui dépend entièrement de l'application. Parfois, il est préférable de donner une réponse correcte éventuellement , d'autres fois, échouer rapidement est mieux que d'attendre le succès.

10
répondu gustafc 2017-01-20 17:53:18

vous résolvez le mauvais problème. Votre programme n'a pas besoin de le savoir à moins de traiter avec eclipse ou jvm internes.

Solution

utiliser une propriété du système avec une valeur par défaut:

int timeout = Integer.parseInt( 
    System.getProperty("socket.timeout", "1000"));
socket.setSoTimeout(timeout);

et dans la configuration de lancement de debug, il suffit d'ajouter

-Dsocket.timeout=20000

aux paramètres d'appel

(si vous ne spécifiez pas la propriété du système, la valeur par défaut sera utilisé)

Références

5
répondu Sean Patrick Floyd 2010-09-23 07:36:10