Forum: PC-Programmierung Watchpoint HW und SW


von Martin (Gast)


Lesenswert?

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? Das würde auch die beschränkte Verfügbarkeit
der hw wpoints erklären.

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. Falls ungleich wird dann die Überprüfungsroutine in einer
Halt Anweisung münden. (wie man es von breakpoints kennt)

Läuft das so ab? Es ist schon etwas länger her, als ich mit 486
experementiert habe, aber ich glaub damals gab es noch diese
halt machinenkodes, extra für den Anwendungsfall breakpoint.
Heute könnte ich mir vorstellen, dass die ganzen IDEs mit eingebauten
Debuggern den Code gar nicht auf der HW Maschine ausführen, sondern
auf einem Emulator .. und dann bräuchte man keine halt instruction mehr.

Das reicht erst mal an Fragen :)

von Karl H. (kbuchegg)


Lesenswert?

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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.