Implement and archive Phase 5 debugger

This commit is contained in:
2026-09-06 21:24:38 +02:00
parent ce97700a98
commit e236306657
25 changed files with 3102 additions and 52 deletions

View File

@@ -127,7 +127,7 @@ Library-Symbole/Aufrufvertrag und der native Verbraucher-Nachweis stehen
explizit in [PLAN.md, Phase 6](../PLAN.md). Ein umbenanntes TBC erfüllt
keines der beiden Exportziele.
## Befehlsabdeckung nach Change 05
## Befehlsabdeckung nach Change 06
Alle Referenzbefehle sind in ihrer Menüfolge vorhanden. Fachbefehle der
folgenden Changes sind sichtbar deaktiviert und zeigen einen
@@ -139,16 +139,16 @@ Output-Fokus unterbricht Ctrl+C sofort die Sitzung, ohne eine BASIC-Taste einzur
| --- | --- | --- |
| File | New/Open/Save Project, New Form/Module, Add/Remove File, Save File/As, Load/Save Text, Print (UTF-8-Datei), Shell, Exit | — |
| Edit | Undo, Cut/Copy/Paste/Clear, New Sub/Function, Event Procedures | — |
| View | Code/Form-Auswahl, Prozedurauswahl, Included File/Lines, Diagnostics, Designer Menu Bar/Value-Fokus, Grid Lines, Output Screen | Next Statement: 06 |
| View | Code/Form-Auswahl, Prozedurauswahl, Included File/Lines, Diagnostics, Designer Menu Bar/Value-Fokus, Grid Lines, Output Screen, Next Statement | — |
| Search | Find, Selected Text, Repeat Last Find, Change | — |
| Run | Start/Restart/Continue/Pause, COMMAND$, wirksame Startdatei und beide Make-Dialoge | Native Erzeugung: Phase 6 |
| Debug | Vollständiges Menü und Kürzelzuordnung, einschließlich F7/F8/F9/F10 und History | Watches, Watchpoints, Trace, History, Breakpoints, Break on Errors, Set Next Statement: 06 |
| Debug | Breakpoints, Schritte, Calls, Watches/Watchpoints, Direktfenster, Trace/History, Break on Errors und Set Next Statement | — |
| Options | Display, Set Paths, Right Mouse, Save, Syntax Checking einschließlich Zeilenprüfung | Kontext-Hilfe: 07 |
| Window | New Window, Arrange All, Calls/Debug/Help/Immediate/Output/Project, aktive Codeliste, alle Fensterkürzel | Debug/Calls/Immediate-Inhalte: 06; Hilfeinhalt: 07 |
| Window | New Window, Arrange All, Calls/Debug/Help/Immediate/Output/Project, aktive Codeliste, alle Fensterkürzel | Hilfeinhalt: 07 |
| Designer Tools/Window | Vollständige Toolbox einschließlich Spin, Formliste, Color Palette, Menu Design Window | — |
| Help | Vollständiges Menü, About und Help-Fensterrahmen | Index, Contents, Keyboard, Topic, Using Help, Tutorial: 07 |
Editor, inkrementelle Übersetzung, Ausführung und Formulardesigner sind umgesetzt. Die gesamte
Editor, inkrementelle Übersetzung, Ausführung, Formulardesigner und Debugger sind umgesetzt. Die gesamte
Phase-5-Abnahme erfolgt in Change 08.
## Programme ausführen
@@ -384,3 +384,88 @@ benötigen weiter ein separates Textziel. Die Designer-Tests prüfen alle
Klassen, Geometrie, Properties, Maus/Tastatur, Transaktionen, Ereignisse und
Speicher-Roundtrips. Der CLI-Integrationstest erzeugt eine FRM über dieselben
Designeraktionen und übersetzt sie mit dem echten `tbc build`-Prozess.
## Debugger und Direktfenster
F9 setzt oder entfernt eine Haltepunktmarke in der physischen Quelldatei.
Für Includes zuerst **View → Included File** öffnen; die schreibgeschützte
Gesamtansicht Included Lines ist kein eindeutiger Haltepunktort. Bei mehrfach
verwendeten Includes gehört die Marke zum ausgewählten Projektmodul.
**●** am Fensterrand bezeichnet einen gebundenen Haltepunkt, **○** eine
inaktive Marke. Textänderungen führen die Marken mit; eine gelöschte
Anweisung deaktiviert ihre Marke. Beim Start werden nur ausführbare Grenzen
der neuen Kompilatrevision gebunden. **Clear All Breakpoints** entfernt alle.
Ein Zeilenbreakpoint hält vor der ersten ausgeführten Anweisung der Zeile;
mehrere durch Doppelpunkt getrennte Anweisungen können einzeln geschritten werden.
| Aktion | Taste / Menü | Verhalten |
| --- | --- | --- |
| Continue | F5 | Führt die angehaltene Anweisung einmal aus; ein späterer Schleifendurchlauf kann erneut halten. |
| Single Step | F8 | Nächste BASIC-Anweisungsgrenze, auch innerhalb eines Aufrufs. |
| Procedure Step | F10 | Nächste Anweisung im ursprünglichen Frame nach dem Aufruf, einschließlich Rekursion und GOSUB; Breakpoints und Fehlerhalte haben Vorrang. |
| Run to Cursor | F7 | Temporäres Laufziel; ein anderer Halt oder das Ende beendet den Cursorlauf. |
| Next Statement | View → Next Statement | Zeigt den tatsächlichen aktuellen Ausführungsort. |
| Calls | Window → Calls | Aufrufkette mit Prozedur und Quelldatei/-zeile. Maus oder Pfeile wählen einen Inspektionsrahmen; der aktive VM-Frame bleibt unverändert. |
**Add Watch**, **Instant Watch / Shift+F9** und **Watchpoint** nehmen einen
BASIC-Ausdruck entgegen. **Window → Debug** zeigt Werte mit Typen und
Diagnosen pro Eintrag. Delete Watch/Delete All Watch löschen Definitionen;
das Debug-Fenster bearbeitet keinen Quelltext. Lokale Variablen, Arrays und
UDT-Felder beziehen sich auf den in Calls gewählten erreichbaren Frame.
`Modul!Variable` qualifiziert einen globalen Namen, beispielsweise
`Daten!satz.Preis` oder `Daten!preise(2)`. Arithmetik und Konvertierungen
stammen aus demselben Frontend und Bytecode wie normale BASIC-Anweisungen.
Automatische Watches sind nebenwirkungsfrei: Literale, Operatoren, vorhandene
Variablen, Array-/Feldzugriffe, String-/Mathematik-Intrinsics, FORMAT$, Arraygrenzen
sowie ERR/ERL sind erlaubt. Benutzerprozeduren, RND, Eingabe-/Datei-/Uhrfunktionen
und andere nicht als rein nachgewiesene Aufrufe liefern eine Diagnose.
Ein noch nicht initialisiertes Array wird durch einen Watch nicht angelegt.
Solche Aufrufe sind über das Direktfenster möglich. Watchpoints benötigen eine
numerische BASIC-Bedingung und halten an der nächsten Anweisungsgrenze, an der
sie wahr ist. Continue überspringt die aktuelle Prüfung einmal; bleibt die
Bedingung wahr, kann die folgende Grenze erneut halten. Ein fehlerhafter
Eintrag löst keinen Halt aus.
**Window → Immediate** öffnet das Direktfenster. Im Break-Modus führt Enter
PRINT, Zuweisungen, Prozeduraufrufe und ERROR aus; Doppelpunkte verbinden
mehrere Anweisungen. Vor der Ausführung wird das gesamte Kommando übersetzt.
Syntax-/Typfehler verändern weder Variablen noch Fortsetzungspunkt.
Erfolgreiche Kommandos kehren zur ursprünglichen Pause zurück. PRINT ist im
Direktfenster und im gemeinsamen Programmbildschirm sichtbar. Zuweisungen,
BYREF-Aufrufe und normale Laufzeitnebenwirkungen bleiben wirksam. Laufzeitfehler
nutzen die bestehenden Handler und RESUME-Regeln; unbehandelte Direktfehler
werden angezeigt, während die ursprüngliche Pause erhalten bleibt.
Run → Pause/Ctrl+Break unterbricht auch ein laufendes Direktkommando. Ein
wartender Prozeduraufruf bleibt fortsetzbar; seine Programmeingaben werden über
Window → Output zugestellt. F5 setzt zunächst das noch aktive Kommando fort;
nach dessen Abschluss setzt ein weiteres F5 das ursprüngliche Programm fort.
END/SYSTEM beenden die Sitzung, RUN startet über den normalen Sitzungsreset.
Direktcode hat den Quellort `<Immediate>` und wird nie im Projekt gespeichert.
**Trace On** verfolgt die aktuelle Quellstelle. **History On** hält höchstens
1.024 tatsächlich begonnene Anweisungen; die ältesten Einträge fallen heraus.
Shift+F8/Shift+F10 navigieren zurück/vorwärts. Die Meldung **HISTORIE** bezeichnet
nur eine historische Quellstelle: Watchwerte gehören weiterhin zum aktuellen
Halt. Variablen, Dateien, Uhr und andere Nebenwirkungen werden nicht zurückgesetzt.
Ein Neustart verwirft Frameauswahl, Verlauf, Instant-Watch und alte Werte,
erhält Watchdefinitionen und bindet Breakpoints neu.
**Break on Errors** hält nach der Handlerwahl und nötigem Stack-Unwinding vor
der ersten Handleranweisung. Die Anzeige nennt Fehlernummer, Ursache und
Handlerziel; Continue führt den Handler einmal aus. ERR/ERL und RESUME behalten
ihren normalen Vertrag. Unbehandelte Programmfehler beenden die Sitzung mit
Fehlerdiagnose; unbehandelte Direktfehler sind ausdrücklich als solche sichtbar.
**Set Next Statement** ist nur an einer freien Anweisungsgrenze im aktiven
Frame zulässig. Das Ziel muss ausführbar sein und denselben Kontroll- und
Schleifenkontext besitzen. Fremde Frames, Eintritt in Handler/GOSUB-Bereiche,
aktive GOSUB-/Fehlerbehandlung, Warteoperationen und ein aktives Direktkommando
werden mit Begründung abgewiesen. Die Prüfung erfolgt vor jeder Änderung.
Ein erlaubter Sprung führt keine übersprungenen Anweisungen aus.
Cursorziele setzen den unveränderten Quellstand der pausierten Sitzung voraus;
nach Änderungen zuerst neu starten. F5 kann weiterhin nach ausdrücklicher
Auswahl das gekennzeichnete alte Kompilat fortsetzen; seine Watches verwenden
die ursprünglichen Symbole und Slots.