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:
-
pour savoir si vous utilisez le mode de débogage, utilisez la méthode suivante dans
java.lang.management.*
oujavax.management.*
... -
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.
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é.
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.
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
- Propriétés Système dans la section de Soleil Java Tutorial
- du Système.getProperty (prop, def) javadocs