Break-, Trace- und Watchpoints sind Spezialfälle des allgemeineren
Eventpoints. Ein Eventpoint wartet auf ein Ereignis und führt bei dessen
Eintreffen eine Menge von Aktionen, den sogenannten ''Eventpoint Handler'',
aus. Je nachdem, auf welche Art von Ereignis gewartet werden soll, gibt es
verschiedene Typen von Eventpoints, darunter
Typ |
Ereignis |
reached line |
Zeile erreicht |
reached routine |
Routine erreicht |
modify |
Speicherbereichs ändert sich |
relation |
relationaler Ausdruck wird wahr |
signal |
Signal trifft ein |
(eine vollständige Liste mit ''help eventpoints''). Eventpoints können
gesetzt werden mit dem Kommando
event TYP [PARAMETER ...],
wobei die Parameter gegebenenfalls das Ereignis näher spezifizieren
(Zeilennummer, Adressbereich, Signalnummer, logischer Ausdruck, ...).
Zu jedem Typ von Eventpoints gibt es einen Standard-Handler, man kann aber
für jeden Eventpoint auch selbst auf zwei Weisen einen Handler definieren.
Um z.B. in der Routine LUDCMP jeweils das Pivot-Element anzuzeigen, könnte
man folgenden Eventpoint setzen:
event reached line ludcmp.f:42 \
{echo/n ''Pivotelement in Spalte ''; print I; print AAMAX; resume;}
Genausogut kann man den Handler - die Anweisungsfolge in { } - nachträglich
definieren mit dem Kommando
set handler NR HANDLER ,
wobei NR die Nummer des bereits gesetzten Eventpoints ist. Einen gesetzten
Handler kann man wieder löschen mit
clear handler NR .
In einem Handler können alle CXdb-Befehle vorkommen außer solchen, die
die Programmausführung fortsetzen (continue, next, ...). Dafür wird das
Kommando ''resume'' verwendet. Außerdem gibt es zur Ausgabe von Strings
- wahlweise ohne abschließendes Newline - noch den Befehl ''echo[/n]''.
Nachdem man einen Eventpoint mühsam definiert hat, möchte man ihn nicht
immer gleich löschen, wenn man ihn gerade nicht braucht. Dafür kann man
einen Eventpoint auch abschalten mit
disable event NR
und später mit
enable event NR
wieder ''scharf'' machen.
Manchmal soll ein Eventhandler nicht gleich beim ersten Mal ansprechen,
wenn das gewünschte Ereignis eintritt, sondern erst beim N. Mal (besonders
bei Schleifen nützlich). Zu diesem Zweck führt jeder Eventpoint einen
Zähler mit, den sogenannten Ignore-Counter, der jedesmal, wenn das
Ereignis eintritt, um eins erniedrigt wird. Erst, wenn dieser Zähler 0
wird, wird der Handler ausgeführt. Man setzt ihn auf COUNT für den
Eventpoint NR mit
set ignore COUNT NR .
Eine Liste aller Eventpoints mit zusätzlichen Informationen wie dem
aktuellen Stand des Ignore-Zählers und dem Status (disabled/enabled)
erhält man mit
info event .
Peter Junglas 18.10.1993