Determine si una aplicación Java está en modo de depuración en Eclipse

Quiero cambiar el nivel de registro dependiendo de si estoy depurando o no, pero no puedo encontrar un fragmento de código para verificar si la aplicación se está ejecutando en modo de depuración.

Estoy usando eclipse para depurar la aplicación, por lo que si la solución solo funciona dentro de Eclipse estará bien.

Puede modificar la configuración de depuración. Por ejemplo, agregue un argumento de VM especial solo en la Configuración de depuración. Puede usar System.getProperties () para leer los argumentos proporcionados.

Mejor aún, modifique las configuraciones (Ejecutar y Depurar) para cargar un archivo de configuración de registro diferente. No es bueno si necesita escribir código para determinar el nivel de registro. Esto solo debería ser una cuestión de configuración.

Se encontró la respuesta sobre cómo-averiguar-salir-si-depurar-modo-está habilitado

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

Esto verificará si se utiliza el agente Java Debug Wire Protocol .

No existe una forma aprobada oficialmente para determinar de manera confiable si una JVM determinada se encuentra en modo de depuración desde dentro de la JVM, y confiar en los artefactos solo romperá su código en algún momento en el futuro.

Por lo tanto, deberá presentar una metodología por su cuenta. Sugerencias:

  • Una propiedad del sistema.
  • Una variable de entorno (variable de shell como $ HOME o% HOME%)
  • Pregúntale a la JVM sobre la ubicación física de un recurso dado – http://www.exampledepot.com/egs/java.lang/ClassOrigin.html – y basándote en ella, toma tu decisión (¿la ruta contiene la palabra “depuración”)? ? ¿Está dentro de un contenedor o un archivo de clase no empaquetado? etc).
  • JNDI
  • La existencia o el contenido de un recurso en particular.

¿Has intentado agregar un argumento vm en la configuración de ejecución de eclipse?

Algo como

 -Dxxxx=true 

y puede usar Boolean.getProperty("xxxx") para verificar esto.

Si está configurando el nivel de depuración desde su propio progtwig, puede ser una línea como:

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

Haría el truco.

Acabo de probarlo en eclipse3.5:

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

mostrará:

 mixed mode, sharing 

si se lanzó sin depuración

 mixed mode 

si se ejecuta con el debug launcher


Joachim Sauer comenta:

Esto depende mucho del sistema.
Supongo que el “compartir” indica que el intercambio de clases entre VM está activo.
Esta es una característica muy nueva y solo está disponible en algunas plataformas.
Además, puede haber muchas razones posibles para activarlo o desactivarlo, por lo que no lo usaría para la detección de modo de depuración.

(Nota: lo probé con la última jdk1.6b14. Lo dejo como una respuesta CW).

Echa un vistazo aquí:

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

Además, creo que no puede saber si su aplicación se ejecuta en modo de depuración. Lo único que puede hacer es pasar un argumento a su JVM cuando depure.

Manu