Martin schrieb:
> Wenn ich es richtig verstanden habe, muss die CPU HW watchpoints
> unterstüzen. Es muss Onchip eine Architektur vorhanden sein, die
> eine Variablenveränderung mitbekommen, während die Instruktion noch
> läuft. Richtig so?
Ich denke du meinst schon das richtige. Zumindest so ungefähr.
Wenn eine MMU im System vorhanden ist, dann bietet die normalerweise
auch die Möglichkeit auf bestimmte Speicherseiten Zugriffsberechtigungen
zu vergeben. Das sieht dann so aus, dass die MMU zb. bei einem
Schreibzugriff in den Speicher eine Exception auslöst, die die CPU in
eine spezielle Behandlungsroutine zwingt. In dieser Routine wird die
Adresse gegen die Liste der Watchpoints gegengeprüft und wenn es eine
überwachte Adresse ist eine entsprechende Aktion ausgelöst.
> Was ist dann mit den SW Watchpoints? Wie wird das abgewickelt?
> Ich hab mir überlegt, dass der Compiler nach der Analyse weiss,
> von welchen Stellen auf eine bestimtme Variable geschrieben wird.
> Also könnte er eine davor und danach einen call zu einer
> Speicher/Überprüfungsroutine ausführen und danach auf Gleichheit
> prüfen.
Der Compiler hat damit so gut wie gar nichts zu tun.
Der Compiler hat lediglich die Aufgabe für den Debugger
Synchronisationspunkte in den Code einzubauen, damit zb im Debugger ein
Single Step Betrieb möglich ist. Das ist aber nicht spezifisch für
SW-Watchpoints sondern gibt einfach nur dem Debugger die Möglichkeit
einzelne Maschinencodeabschnitte wieder einzelnen Source Code
Anweisungen zuordnen zu können.
Tja. Und da klinkt sich jetzt der SW Watchpoint ein.
Der Debugger führt eine Anweisung aus, genauso wie er es auch im Single
Step Betrieb tun würde. Danach klappert er seine Watchpoints ab und
vergleicht den aktuellen Memory Inhalt mit dem was sich der Debugger
zuvor weggespeichert hat. Stimmen sie überein, dann löst der Watchpoint
nicht aus und führt die nächste Anweisung aus. Gibt es eine Änderung,
dann hält der Debugger das Programm an, indem er aus dem 'automatischen
Single Step' ausbricht und dem Benutzer wieder die Kontrolle übergibt.
Was mir an deinen Erklärungen nicht gefällt ist, dass du immer von
Variablen sprichst. Watchpoints operieren auf Speicherzellen und
Variablen kommen nur deshalb ins Spiel, weil sie eine für den Benutzer
einfache Möglichkeit darstellen eine bestimmte Speicherstelle zu
identifzieren. Aber dann ist auch schon Schluss. Muss auch Schluss sein,
denn Watchpoints würden viel von ihrer Mächtigkeit verlieren, wenn sie
auf Variablenebene operieren würden. Watchpoints sind besonders dann
nützlich, wenn Speicherzellen auf irgendwelchen dunklen Kanälen ihren
Wert ändern, weil zb. ein Array Overflow stattgefunden hat. Dazu muss
aber auf Byte oder Word Ebene direkt im Speicher geprüft werden.