Gibt es eine Möglichkeit, eine Variable zu überwachen und Visual Studio nur dann zu unterbrechen, wenn sich dieser Wert ändert?
Es würde es so viel einfacher machen, knifflige staatliche Probleme zu finden.
Kann das gemacht werden?
Für Haltepunktbedingungen muss noch ein Haltepunkt festgelegt werden. Ich möchte lieber eine Überwachung festlegen und Visual Studio die Haltepunkte bei Statusänderungen festlegen lassen.
Antworten:
Im Visual Studio 2005-Menü:
Debug -> Neuer Haltepunkt -> Neuer Daten-Haltepunkt
Eingeben:
quelle
Sie können auch festlegen, dass der Code explizit unterbrochen wird:
Von MSDN:
Dies ist jedoch nur ein Fallback. Das Festlegen eines bedingten Haltepunkts in Visual Studio, wie in anderen Kommentaren beschrieben, ist die bessere Wahl.
quelle
Wirklich alter Beitrag, aber falls jemand nichts davon weiß ...
In Visual Studio 2015 können Sie einen Haltepunkt auf dem
set
Accessor einer automatisch implementierten Eigenschaft platzieren. Der Debugger wird unterbrochen, wenn die Eigenschaft aktualisiert wirdAktualisieren
Alternative; @AbdulRaufMujahid hat in den Kommentaren darauf hingewiesen, dass Sie, wenn sich die automatisch implementierte Eigenschaft in einer einzelnen Zeile befindet, Ihren Cursor auf das
get;
oderset;
und drücken könnenF9
und ein Haltepunkt entsprechend platziert wird. Nett!quelle
Stellen Sie sich vor, Sie haben eine Klasse namens A mit der folgenden Deklaration.
Sie möchten, dass das Programm beendet wird, wenn jemand den Wert von "m_value" ändert.
Gehen Sie zur Klassendefinition und setzen Sie einen Haltepunkt in den Konstruktor von A.
Sobald wir das Programm gestoppt haben:
Debug -> Neuer Haltepunkt -> Neuer Daten-Haltepunkt ...
Adresse: & (this-> m_value) Byteanzahl
: 4 (Weil int 4 Bytes hat)
Jetzt können wir das Programm fortsetzen. Der Debugger stoppt, wenn der Wert geändert wird.
Sie können dasselbe mit geerbten Klassen oder zusammengesetzten Klassen tun.
Adresse: & (this-> m_a.m_value)
Wenn Sie die Anzahl der Bytes der Variablen, die Sie untersuchen möchten, nicht kennen, können Sie den Operator sizeof verwenden.
Beispielsweise:
Wenn Sie sich den "Aufrufstapel" ansehen, sehen Sie die Funktion, die den Wert der Variablen geändert hat.
quelle
Ändern Sie die Variable in eine Eigenschaft und fügen Sie der set-Methode einen Haltepunkt hinzu. Beispiel:
quelle
Wenn Sie WPF verwenden, gibt es ein großartiges Tool: WPF Inspector .
Es hängt sich an eine WPF-App an und zeigt den vollständigen Steuerelementbaum mit allen Eigenschaften an. Außerdem können Sie (unter anderem) bei jeder Änderung von Eigenschaften eine Unterbrechung vornehmen.
Leider habe ich kein Tool gefunden, mit dem Sie dasselbe mit JEDER Eigenschaft oder Variablen tun können.
quelle
Ich erinnere mich an die Art und Weise, wie Sie es mit Visual Basic 6.0 beschrieben haben . In Visual Studio habe ich bisher nur eine Haltepunktbedingung angegeben .
quelle
Ein Rechtsklick auf den Haltepunkt funktioniert für mich einwandfrei (obwohl ich ihn meistens für bedingte Haltepunkte für bestimmte Variablenwerte verwende. Auch das Brechen von Ausdrücken mit einem Threadnamen funktioniert, was sehr nützlich ist, wenn Sie versuchen, Threading-Probleme zu erkennen).
quelle
Wie Peter Mortensen schrieb:
Zusätzliche Information:
Offensichtlich muss das System wissen, welche Adresse im Speicher überwacht werden soll. Setzen Sie also einen normalen Haltepunkt auf die Initialisierung von
myVariable
(odermyClass.m_Variable
) - führen Sie das System aus und warten Sie, bis es an diesem Haltepunkt stoppt. - Jetzt ist der Menüeintrag aktiviert und Sie können die Variable durch Eingabe&myVariable
oder die Instanz durch Eingabe beobachten&myClass.m_Variable
. Jetzt sind die Adressen gut definiert.Es tut mir leid, wenn ich etwas falsch gemacht habe, indem ich eine bereits gegebene Lösung erklärt habe. Aber ich konnte keinen Kommentar hinzufügen, und es gab einige Kommentare dazu.
quelle
Sie können einen Speicherüberwachungspunkt in nicht verwaltetem Code verwenden. Ich bin mir nicht sicher, ob diese im verwalteten Code verfügbar sind.
quelle
Sie können die Funktion DebugBreak () wahrscheinlich geschickt einsetzen .
quelle
myVariable
und ihre Werte nach der Verwendung in einer Hilfsvariablen speichernpreviousValue
und dann DebugBreak () aufrufen, wennmyVariable!=previousValue
; dann würden Sie wissen, zwischen welchen CodeblöckenmyVariable
sich geändert hat. Aber ich stimme zu, dass AShellys Lösung die beste ist.Sie können optional den Operator = für die Variable überladen und den Haltepunkt innerhalb der überladenen Funktion unter bestimmten Bedingungen setzen.
quelle
Update im Jahr 2019:
Dies wird jetzt offiziell in Visual Studio 2019 Preview 2 für .Net Core 3.0 oder höher unterstützt. Natürlich müssen Sie möglicherweise einige Überlegungen zu potenziellen Risiken bei der Verwendung einer Vorschau-Version von IDE anstellen. Ich kann mir vorstellen, dass dies in naher Zukunft im offiziellen Visual Studio enthalten sein wird.
https://blogs.msdn.microsoft.com/visualstudio/2019/02/12/break-when-value-changes-data-breakpoints-for-net-core-in-visual-studio-2019/
quelle