2009-08-25 6 views
13

Gibt es eine Möglichkeit, zu erkennen, dass ein Debugger im Speicher ausgeführt wird?Ändern des Programmablaufs beim Ausführen unter einem Debugger

und hier kommt der Form Load Pseudocode.

if debugger.IsRunning then 
Application.exit 
end if 

Edit: Der ursprüngliche Titel war „Erkennen einer im Speicher-Debugger“

+1

Die meisten Debugger an einen Prozess zur Laufzeit gebunden sein. In diesem Fall hilft die Überprüfung auf Debugger auf statrup nicht viel. –

Antwort

29

Probieren Sie die folgenden

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

Zwei Dinge im Auge zu behalten, bevor diese mit Ausführen einer Anwendung schließen im Debugger:

  1. Ich habe einen Debugger verwendet, um AC zu ziehen Rash Trace von einer kommerziellen .NET-Anwendung und senden Sie es an die Firma, wo es nachträglich mit einem Dankeschön für die Herstellung es einfach und
  2. behoben wurde Diese Überprüfung kann trivial besiegt werden.

Nun, mehr Nutzen zu sein, hier ist, wie diese Erkennung verwenden func eval im Debugger zu halten von Ihrem Programmzustand zu ändern, wenn Sie einen Cache eine träge ausgewertete Eigenschaft aus Performance-Gründen haben.

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

habe ich auch diese Variante manchmal verwendet meine Debugger Schritt-durch, um sicherzustellen, ist die Auswertung nicht überspringen:

kann
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

Das ist eine coole Idee - aber es ändert den Ablauf Ihres Programms, wenn es unter einem Debugger läuft, so dass Sie nicht mehr den Code debuggen, den Sie in der Version verwenden. IMHO wäre es in den meisten Fällen besser, eine nicht zwischengespeicherte Variante der Eigenschaft (innerhalb von #if DEBUG, so dass sie nicht in Releases enthalten ist) zur Verfügung zu stellen, die Sie im Debugger verwenden können, um den Wert zu untersuchen und die "echte" Eigenschaft zu belassen Dies gilt auch für Debug- und Release-Builds. –

+0

@Jason: ja und nein. In diesem Fall sind alle Methoden, die zum Auswerten der Eigenschaft aufgerufen werden, rein (keine Nebenwirkungen, unabhängig davon, wann sie aufgerufen werden). Daher stellte ich tatsächlich sicher, dass dies auch für Eigenschaften aus Sicht der Anwendung gilt. –