2016-04-17 9 views
2

ich folgenden Code haben:C# Wie man bricht, wenn privates Feld geändert wird?

private int a; 

public int A 
{ 
    get{return a;} 
    set{a = value;} 
} 

Mein Problem ist, dass der Wert des Feldes ‚a‘ der Laufzeit geändert wird, und ich versuche, zu debuggen, die den Wert der IT verändert sich. Es gibt keine Verweise auf Feld 'a' neben dem Setter von A. Ich debuggen mit Visual Studio 2015 und haben einen Haltepunkt, wo A festgelegt ist, aber der Haltepunkt wird nie getroffen.

Aus diesem Grund denke ich, dass es möglich ist, dass jemand den Wert von "a" über Reflexion setzt. Gibt es Optionen, um die App zu brechen, wenn der Wert des privaten Felds "a" geändert wird?

+0

Führen Sie den Debug-Build aus? Ich könnte mir vorstellen, dass die Release-Version das triviale 'Set' optimiert. – MicroVirus

+1

Ich habe das Problem gelöst, aber die Lösung war nicht auf die ursprüngliche Frage bezogen. Ich hatte die umschließende Klasse mit Singleton-Muster implementiert, aber aufgrund eines Fehlers im Code gab es mehrere Instanzen meiner Singleton-Klasse. –

Antwort

4

Sie können einen anderen Ansatz versuchen. Wenn du dir sicher bist, dass nichts anderes eine Einstellung setzt und du denkst, dass jemand es über Reflektion setzt, ändere seinen Namen. Machen Sie stattdessen "_a". Das wird die Reflexion vereiteln, und Sie können sicher sein, dass der Wert nur von Ihrer Eigenschaft erneut festgelegt wird. An diesem Punkt, wenn die App abstürzt (vorausgesetzt, dass jemand tatsächlich Reflektion verwendet), wird es in der Stack-Ablaufverfolgung angezeigt.

2

Es gibt andere Möglichkeiten wie verwaltete Heap-Korruption, die auch das gleiche Symptom zeigen können. Wenn Ihre Anwendung mit einer ExecutionEngineException abstürzt, müssen Sie nach unsicherem und nicht verwaltetem Code suchen, der den verwalteten Heap beschädigen kann.

Windbg kann eine Hilfe sein, die den ba (break on access) Befehl unterstützt. Dort können Sie einen Haltepunkt definieren, der beim Schreiben in einen bestimmten Speicherort betroffen ist. Dies ist nicht so einfach wie es klingen mag, da der verwaltete Haufen häufig komprimiert wird, was dazu führt, dass sich Ihr Objekt häufig bewegt. Wenn Sie das Objekt irgendwie anheften können, dann könnte dies ein brauchbarer Debugging-Ansatz sein.

Visual Studio unterstützt diese Funktion. Es heißt Data Breakpoints, aber dies wird nur aus den oben genannten Gründen für nicht verwalteten Code unterstützt.

Verwandte Themen