| 

.NET C# Java Javascript Exception

7
Da wir heute schonmal eine VS Frage hatten, fällt mir auch gerade was ein: Weiss jemand, wie ich es erreiche, dass VS einen BREAK(POINT) auslöst, sobald der Wert einer bestimmten Variable geändert wird?
Zusatzinfos: VS 2008, Mixed code (native & managed), C++
Danke schonmal!
19.12.2011
Eiger 1,9k 2 9
4 Antworten
2
hi,
einfach Haltepunkt setzen, rechtsklick auf den Bobbel und dann im Kontextmenü auf "Bedingung".

Update
Hier noch ein Screenshot

Tipp: In dem Eingabefeld für die Bedingung kann sogar mit strg + space IntelliSense aufgerufen werden.

Update 2

Geht glaube ich nur für native Code, nicht bei Managed / Mixed: Menüpunk "Debuggen" => "Neuer Haltepunkt" => "Neuer Datenhaltepunkt" => &myVariable

Trick 17: Bau dir ein Singleton, stopfe deine Variable beim initialisieren dort hinein und Wende den Weg so an wie ich ihn zuvor beschrieben habe.

Gruß
19.12.2011
Nicolai Schönberg 2,4k 2 9
Hmmm, das ist schon gut, aber nicht ganz das, was ich eigentlich haben will. Am Liebsten hätte ich es so: Sobald sich eine - sagen wir globale - Variable irgendwo ändert während des Programmablaufs, soll ein STOP/BREAK erfolgen und die Stelle aufgerufen werden, wo es geändert wurde. Bei deiner Version muss man ja die Stelle schon festlegen, die Möglichkeit kannte ich leider schon. Dennoch ist das mit dem IntelliSense sehr interessant!
Eiger 20.12.2011
Zu Update2: Geht leider nicht, da ich Mixed code habe!
Zu Trick 17: Entweder stehe ich auf dem Schlauch, oder ich bin zu doof, zu verstehen, wie mir das weiterhilft...!?
Eiger 20.12.2011
Naja ich stell mir das so vor das du deine Variable die du überwachen willst in einem Globalen Kontext (als Wert im Singleton) verfügbar machst. Dann sollte es doch möglich sein, das du ein normalen Haltepunkt verwenden kannst? Zugegeben war das ein Blitzgedanke von mir - Sorry falls es für deinen Anwendungsfall nicht anwendbar sein sollte. Gruß
Nicolai Schönberg 20.12.2011
Das Problem ist ja, dass normale Haltepunkte an eine bestimmte Position gebunden sind. Das will ich ja nicht, denn wenn ich wüsste, wo die Variable geändert wird, bräuchte ich ja die Änderungsverfolgung gar nicht... ;-)
Eiger 20.12.2011
1
Ne - jetzt hast du mich falsch Verstanden :) Wenn du den Wert in ein Singleton steckst und dann in der Codedatei des Singleton ein Haltepunkt beim getter / setter / Property machst dann wird erst einmal angehalten wenn dieser getter / setter / property aufgerufen wird. Wenn du dann wissen willst WO sich das Teil geändert hast nimmst du einfach die Aufrufliste / Callstack (Debuggen => Fenster => Aufrufliste) Gruß
Nicolai Schönberg 20.12.2011
Hmmm, ok, das ist wirklich Trick17 ;-)
Also wenn sich nicht noch was Besseres findet, versuche ich das evtl. mal! Generell dachte ich eigentlich, dass es so eine Funktion im VS sicher gibt, und ich die einfach noch nicht kenne. Aber dem ist wohl nicht so.
Eiger 20.12.2011
So richtig cool find ich die Lösung ehrlich gesagt auch nicht, aber mir fällt momentan nichts besseres ein
Nicolai Schönberg 20.12.2011
2
Falls du den Resharper einsetzen kannst, gibt es dort die nützliche Funktion Value Tracking . Siehe dazu den Abschnitt To display value destination
Value Tracking helps you determine how a certain incorrect value might have passed to a given point in your program, and where it might be passed next. This helps you investigate possible NullReferenceExceptions, inappropriate behavior and reasons why you get incorrect values.

Hier ein Screenshot, wie das aussehen kann: Screenshot: Value Tracking
Damit sind alle Stellen auffindbar, wo die Variable geändert werden könnte.
Ob das auch mit native code funktioniert kann ich dir nicht sagen.
20.12.2011
Jürgen Luhr 7,1k 2 9
Das ist ja cool! Ich nutze Resharper schon eine weile; Diese Funktion kannte ich bisher nicht. PS: Ja Screenshots gehen nicht, ich verlinke sie immer als link
Nicolai Schönberg 20.12.2011
@Nicolai: Danke für den Hinweis mit den Screenshots.
Jürgen Luhr 20.12.2011
Leider habe ich keinen Resharper zur Verfügung, ausserdem dachte ich, den gibts nicht für C++...
Eiger 20.12.2011
@Eiger: Das habe ich nicht bedacht. :( sorry.
Jürgen Luhr 20.12.2011
1
An Nicolais Lösung hatte ich zuerst auch gedacht. Allerdings auch daran, dass es vermutlich nicht das ist was du willst :-) . Aber anscheinend gibt es die Möglichkeit, im Watch Window Code zu hinterlegen, der ausgeführt wird sobald sich eine (globale) Variable ändert. Damit kannst du (vermutlich) das bewirken was du suchst. Ich muss es auch erst noch ausprobieren.
Hier der Blogeintrag, der das Vorgehen beschreibt.

Nachtrag: einen Breakpoint zu einer globalen Variablen (C/C++) kann man setzen wenn man die Adresse der Variablen kennt. Dazu muss man einen Data Breakpoint erzeugen.

Grüße!
20.12.2011
puls200 3,8k 7
Den Nutzen vom ersten Vorgehen kann ich nicht nachvollziehen. Wo steht da, dass die eingesetzte Funktion aufgerufen wird, sobald sich eine globale Variable ändert...?
Der Nachtrag geht leider nicht, da ich Mixed code habe...
Eiger 20.12.2011
Zu 1.: "If you add a function call to the watch window, that function will be called when debugger refreshes the watch values."
2. Schade. Ich fürchte, dass du dann kein Glück hast.
puls200 20.12.2011
Zu 1. Na ja, die watch values werden ja eigentlich nur refreshed, wenn ich einen step-by-step debug mache. Ich will ja das Programm im debug Modus ausführen und laufen lassen. Das Programm soll nur anhalten, wenn sich die Variable ändert (sprich ein Schreibzugriff darauf stattfindet). Ich befürchte langsam, das geht wohl nicht... Danke dennoch für euere Überlegungen, vielleicht ergibt sich ja noch was.
Eiger 20.12.2011
1
Ich denke, dass es eine Änderungsverfolgung in der von dir gewünschten Art in Visual Studio nicht gibt.
Von Microsoft gibt es einige Hinweise zum Debugging von der "patterns & practices group": Production Debugging for .NET Framework Applications
Sehr vielversprechend sieht das dort verlinkte Tool WinDbg aus. Dazu gibt es auch eine Anleitung Windows Debuggers: Part 1: A WinDbg Tutorial
Das wäre hilfreich, wenn du 1. keinen Einfluss auf den Sourcecode hättest, 2. den Code nicht verändern möchtest, 3. das Tool häufiger einsetzen nöchtest.
Geht es dir nur darum einmalig eine Variable zu beobachten, würde ich es mit der von Nicolai vorgeschlagenen Methode mit dem Singleton machen.
20.12.2011
Jürgen Luhr 7,1k 2 9
Schade eigentlich.
Nun denn, deine links sind dennoch interessant. Auch wenn vielleicht nicht unbedingt für angesprochene Problematik, weil bis ich das alles richtig aufgesetzt habe, habe ich die Änderung auch via step-by-step debugging gefunden... Aber - wie gesagt - sehr interessant und deshalb für dich - wie auch die anderen "Mitstreiter" +1 ;-)
Eiger 20.12.2011

Stelle deine Debugging-Frage jetzt!