2009-08-25 12 views
13

¿Hay alguna forma de detectar que un depurador se está ejecutando en la memoria?Cambiar el flujo de programa cuando se ejecuta bajo un depurador

y aquí aparece el pseudocódigo Form Load.

if debugger.IsRunning then 
Application.exit 
end if 

Editar: El título original fue "la detección de un depurador de memoria"

+1

La mayoría de los depuradores se puede conectar a un proceso en tiempo de ejecución. En ese caso, verificar el depurador en statrup no ayudará mucho. –

Respuesta

29

Prueba las siguientes

if (System.Diagnostics.Debugger.IsAttached) { 
    ... 
} 
5

Dos cosas a tener en cuenta antes de usar este para cerrar una aplicación ejecutándose en el depurador:

  1. He utilizado un depurador para extraer CA. rash trace de una aplicación .NET comercial y enviarlo a la compañía donde se corrigió con un agradecimiento por facilitarlo y
  2. Ese cheque puede ser trivial derrotado.

Ahora, para ser más útil, aquí está la manera de utilizar esta detección para mantener func eval en el depurador de cambiar su estado del programa si tiene un caché de una propiedad evaluada perezosamente por razones de rendimiento.

private object _calculatedProperty; 

public object SomeCalculatedProperty 
{ 
    get 
    { 
     if (_calculatedProperty == null) 
     { 
      object property = /*calculate property*/; 
      if (System.Diagnostics.Debugger.IsAttached) 
       return property; 

      _calculatedProperty = property; 
     } 

     return _calculatedProperty; 
    } 
} 

También he utilizado esta variante a veces para asegurar mi depurador paso a través de no omitir la evaluación:

private object _calculatedProperty; 

public object SomeCalculatedProperty 
{ 
    get 
    { 
     bool debuggerAttached = System.Diagnostics.Debugger.IsAttached; 

     if (_calculatedProperty == null || debuggerAttached) 
     { 
      object property = /*calculate property*/; 
      if (debuggerAttached) 
       return property; 

      _calculatedProperty = property; 
     } 

     return _calculatedProperty; 
    } 
} 
+0

Esa es una buena idea, pero cambia el flujo de su programa cuando se ejecuta bajo un depurador, por lo que ya no está depurando el código que usa en la versión. En mi humilde opinión, sería mejor en la mayoría de los casos proporcionar una variante no almacenada en caché de la propiedad (dentro de #if DEBUG para que no esté integrada en las versiones) que pueda usar en el depurador para examinar el valor, dejando que la propiedad "real" funcione. De la misma manera en las versiones de depuración y liberación. –

+0

@Jason: sí y no. En este caso, todos los métodos llamados para evaluar la propiedad son puros (sin efectos secundarios, independientemente de cuándo se los haya llamado), así que en realidad me aseguré de que esto también se mantuviera para las propiedades desde la perspectiva de la aplicación. –

Cuestiones relacionadas