2009-08-25 5 views
13

Y at-il un moyen de détecter qu'un débogueur s'exécute en mémoire?Modification du flux de programme lors de l'exécution sous un débogueur

et voici le pseudo-code de chargement de formulaire.

if debugger.IsRunning then 
Application.exit 
end if 

Edit: Le titre original était « la détection d'un débogueur de mémoire »

+1

La plupart des débogueurs peuvent être attachés à un processus en cours d'exécution. Dans ce cas, la vérification du débogueur sur statrup n'aidera pas beaucoup. –

Répondre

29

Effectuez les opérations suivantes

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

Deux choses à garder à l'esprit avant d'utiliser cette touche pour fermer une application ouverte dans le débogueur:

  1. J'ai utilisé un débogueur pour tirer ca trace d'éruption à partir d'une application .NET commerciale et l'envoyer à la société où il a ensuite été fixé avec un merci de le rendre facile et
  2. Cette vérification peut être trivialement vaincu.

Maintenant, plus d'utilisation, voici comment utiliser cette détection pour être de garder func eval dans le débogueur de changer votre état de programme si vous avez un cache une propriété évaluée paresseusement pour des raisons de performance.

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; 
    } 
} 

J'ai aussi utilisé cette variante parfois pour assurer mon débogueur étape par ne saute pas l'évaluation:

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

C'est une bonne idée - mais cela change le flux de votre programme quand il s'exécute sous un débogueur, donc vous ne déboguez plus le code que vous utilisez dans la version. À mon humble avis, il serait préférable dans la plupart des cas de fournir une variante non mise en cache de la propriété (à l'intérieur de #if DEBUG afin qu'elle ne soit pas intégrée aux versions) que vous pouvez utiliser dans le débogueur pour examiner la valeur. de la même manière dans les versions de débogage et de publication. –

+0

@Jason: oui et non. Dans ce cas, toutes les méthodes appelées pour évaluer la propriété sont pures (pas d'effets secondaires, même lorsqu'elles sont appelées), donc je m'assurais que cela soit vrai pour les propriétés aussi bien du point de vue de l'application. –

Questions connexes