Eventpoints

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 .

previous    contents     next

Peter Junglas 18.10.1993