2009-07-10 14 views

Respuesta

21

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.

+3

@ hB0 la pregunta original no se refiere a Android. –

2

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

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

que hacer el truco.

acabo de probar 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 inicia sin depuración

mixed mode 

si se ejecuta con el lanzador de depuración


Joachim Sauer comentarios:

Esto es altamente sistema depende.
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 he comprobado con la última jdk1.6b14 que dejar esto como una respuesta CW.)

+0

Estaba pensando que podría haber una propiedad, pero mis pruebas de vueltas completas de propiedades desde un lanzamiento de depuración y un lanzamiento de ejecución (usando Eclipse 3.3, Java 1.6.0_13, Ubuntu 9.04) fueron idénticas. (También probé solo su propiedad, incluida una ejecución de depuración donde pasé por la línea System.out, y los lanzamientos Run y ​​Debug dieron 'modo mixto'. – gojomo

+1

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 desactivarla o desactivarla, por lo que no utilizaría esto para la detección de modo de depuración. –

+1

@Joachim: buen punto (estoy con el último jdk 1.6b14 aquí). Actualizaré mi respuesta y la dejaré para archivar como Community Wiki. – VonC

3

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

Algo así como

-Dxxxx=true 

y se puede utilizar Boolean.getProperty("xxxx") para comprobar esto.

7

No hay una forma aprobada oficialmente para determinar con fiabilidad si una JVM determinada se encuentra en modo de depuración desde el interior de la propia JVM, y confiar en los artefactos solo romperá su código en el futuro.

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

  • Propiedad del sistema.
  • Una variable de entorno (variable de shell como $ HOME o% HOME%)
  • Pregunte la JVM acerca de la ubicación física de un determinado recurso - http://www.exampledepot.com/egs/java.lang/ClassOrigin.html - y en base a ello, tomar su decisión (no el camino contiene la palabra " ¿depurar "? ¿está dentro de un contenedor o un archivo de clase descomprimido? etc).
  • JNDI
  • La existencia o el contenido de un recurso en particular.
+0

Y a veces no le importa el código en el futuro, solo necesita poder depurarlo ahora mismo y el caso normal funcionará perfectamente. – simpleuser

+0

@ user1663987 Aún necesita saber estas cosas para elegir el método más adecuado en cualquier situación. Tenga en cuenta que hay una gran diferencia entre habilitar la depuración (que para todos los propósitos prácticos es invisible para el programa que se está depurando) y cambiar la configuración del registro: esto no es algo que la mayoría de los programadores esperarían se influenciara entre sí. –

42

encontrado la respuesta en how-to-find-out-if-debug-mode-is-enabled

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

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

+10

booleano isDebug = java.lang.management.ManagementFactory.getRuntimeMXBean(). getInputArguments(). ToString(). Contains ("- agentlib: jdwp"); –

+0

@FrankMeulenaar que es muy específico del vendedor. Lo cual está bien, siempre que lo sepas. –

+2

Tenga en cuenta que algunos debuggers aún usan el viejo argumento '-Xrunjdwp', he creado este código para buscar ambos argumentos de JVM. – Brice

Cuestiones relacionadas