java - ver - how to debug in eclipse oxygen
Cómo saber si el "modo de depuración" está habilitado (3)
¿Cómo puede un programa Java descubrir si se está ejecutando en modo de depuración?
La aplicación debe comportarse de forma un poco diferente en el modo normal de "velocidad completa" que en "modo de depuración" (cuando se conecta un depurador, cuando se ejecuta en modo de depuración). La aplicación se comunica a través de TCP con otra computadora, otro proceso o dentro de sí misma. Mi compañero de trabajo quiere que usemos Socket.setSoTimeout(1000)
de forma predeterminada, de modo que las lecturas del socket puedan bloquearse durante un máximo de 1 segundo. Al depurar, esto no es suficiente, por supuesto, y la aplicación deja de funcionar como debería. Entonces una solución sería establecer SO_TIMEOUT
más alto, pero solo en modo de depuración (por ejemplo: ilimitado). Ahora, no siempre configuro puntos de interrupción o no quiero usar una compilación de depuración en la que pueda establecer yo mismo la propiedad "depuración". A veces adjunto el depurador (depuración remota). Principalmente uso Eclipse, por lo que una solución que simplemente funcione allí está bien.
Las posibles respuestas incluyen:
Para averiguar si se ejecuta en modo de depuración, use el siguiente método en
java.lang.management.*
Ojavax.management.*
...Su compañero de trabajo está equivocado por razón X, no debe establecer
SO_TIMEOUT
en 1 segundo de forma predeterminada.
Actualizar
Sé sobre el enfoque de propiedad del sistema, pero dejo la pregunta abierta para resolver mi pregunta original.
Estás resolviendo el problema equivocado. Su programa no necesita saber esto a menos que se trate de componentes internos de eclipse o jvm.
Solución
Use una propiedad del sistema con un valor predeterminado:
int timeout = Integer.parseInt(
System.getProperty("socket.timeout", "1000"));
socket.setSoTimeout(timeout);
Y en la configuración de inicio de depuración, simplemente agregue
-Dsocket.timeout=20000
a los parámetros de llamada
(Si no especificas la propiedad del sistema, se usará el valor predeterminado)
Referencias
- Sección de propiedades del sistema en Sun Java Tutorial
- System.getProperty (prop, def) javadocs
Haga que el tiempo de espera sea configurable. La forma más simple es simplemente usar una propiedad del sistema y leerla con Integer.getInteger
:
private final static int SOCKET_TIMEOUT =
Integer.getInteger("com.yourapp.module.socketTimeout", 1000); // default 1 sec
Luego, cuando inicie su aplicación para la depuración, simplemente configure la propiedad desde la línea de comando (o un archivo de configuración apropiado, dependiendo del entorno en que se ejecute su aplicación):
java -Dcom.yourapp.module.socketTimeout=1000000 MainClass
Esto es bueno porque no altera mágicamente el comportamiento cuando activa la aplicación en un depurador, y puede cambiar el tiempo de espera cuando no está depurando (por ejemplo, si necesita ejecutarlo en algún lugar con una conexión lenta, algún día).
(Por supuesto, si su sistema ya usa un archivo de configuración, puede ser apropiado agregar este valor como una entrada allí).
En cuanto a si un segundo es un tiempo de espera apropiado ... eso depende completamente de la aplicación. A veces es mejor dar una respuesta correcta eventualmente , otras veces fallar rápidamente es mejor que esperar el éxito.
Lo descubrí ahora mismo:
boolean isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean().
getInputArguments().toString().indexOf("jdwp") >= 0;
Esto verificará si se utiliza el agente Java Debug Wire Protocol .