working ver oxygen online not how funciona debugger debuggear debug como breakpoint application java eclipse debugging

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:

  1. Para averiguar si se ejecuta en modo de depuración, use el siguiente método en java.lang.management.* O javax.management.* ...

  2. 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


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 .