9.4 KiB
9.4 KiB
Verification Report: phase-5-06-debugger-und-direktfenster
Stand: 2026-09-06. Proposal, Design, alle 16 Aufgaben und alle sieben Anforderungen mit elf Szenarien wurden gegen die Implementierung geprüft.
Ergebnis
| Dimension | Ergebnis |
|---|---|
| Completeness | 16/16 Aufgaben, 7/7 Anforderungen |
| Correctness | 11/11 Spec-Szenarien durch ausführbare Prüfungen abgedeckt |
| Coherence | Gemeinsamer Compiler, dieselbe VM, vorhandene Dokument-/Sitzungspfade |
| Offene Befunde | 0 CRITICAL, 0 WARNING, 0 SUGGESTION |
Anforderungen und Szenarien
VM-Nachweise: crates/tb-vm/tests/debugger.rs (14 Integrationstests).
IDE-Nachweise: crates/tb-ide/tests/debugger.rs (6 Integrationstests mit
App-Kommandos, Tastatur/Maus, TestBackend und tatsächlicher Sitzung).
| Requirement / Scenario | Implementierung | Ausführbarer Nachweis |
|---|---|---|
| Dateigenaue Breakpoints / Zwei Includes mit gleicher Zeile | Vm::add_source_breakpoint, statement_locations, debug_boundary; IDE-Marken mit Dokument-/Ursprungsmodul-ID |
VM include_identity_qualified_globals_udts_and_older_frames; IDE includes_and_deleted_marks_do_not_bind_to_foreign_statements: nur zweites Include, richtiger Quellort und unveränderter Wert vor der Anweisung. |
| Dateigenaue Breakpoints / Einfügen oberhalb einer Marke | documents::remap_breakpoints, gemeinsame Edit-/Undo-Transaktionen, bind_debug_breakpoints |
IDE dispatcher_marks_edits_rebind_and_readonly_watches und includes_and_deleted_marks_do_not_bind_to_foreign_statements: Verschieben, Neubinden, Kommentarzeile, Löschen und Undo; inaktive Marken sind sichtbar. |
| Schrittsteuerung und Calls / Rekursion und Prozedurschritt | step_over mit Frame-ID und GOSUB-Tiefe; debug_frames, select_debug_frame; F8/F10 |
VM step_over_recursive_frames_history_and_safe_jump, gosub_step_over_breakpoint_priority_and_temporary_target_cleanup, form_event_breakpoint_and_step_over_keep_the_event_frame; IDE calls_procedure_step_cursor_history_and_restart, calls_mouse_inspection_instant_key_delete_and_error_window, form_handler_keys_and_old_revision_cursor_guard. |
| Schrittsteuerung und Calls / Temporäres Laufziel | run_to_cursor, cancel_motion, IDE-Pause und Sitzungsende |
VM gosub_step_over_breakpoint_priority_and_temporary_target_cleanup; IDE F7 in calls_procedure_step_cursor_history_and_restart. Dauerhafte Breakpoints bleiben erhalten; der unterbrochene Cursorlauf wird nicht später erneut wirksam. |
| Watches und Watchpoints / Beobachtung im lokalen Kontext | sema::lower_debug, DebugCompiler, evaluate_watch; ursprüngliche Slots und Link-Mappings, getrennte Frameauswahl |
VM watches_immediate_byref_and_errors_preserve_continuation, include_identity_qualified_globals_udts_and_older_frames, watches_never_initialize_arrays_or_run_user_functions_and_keep_selected_context: CINT, lokale Arrays, UDT-Felder, qualifizierte Globals, ältere rekursive Frames, keine Auto-DIM-/Funktions-/ERR-Nebenwirkungen. IDE Calls-Mausauswahl, Shift+F9, Watchfehler und Löschdialog. |
| Watches und Watchpoints / Watchpoint wird wahr | evaluate_condition, check_watchpoints, gebundener erreichbarer Inspektionsframe; nur aktive Einträge werden ausgewertet |
VM watchpoint_history_ring_and_error_differential; IDE immediate_wait_run_transition_watchpoint_and_trace_are_session_owned: Halt direkt hinter der Zuweisung, aktualisierter Wert. Nicht numerische oder fehlerhafte Bedingungen lösen keinen Halt aus. |
| Direktfenster / Wert ändern und fortsetzen | start_immediate, temporärer Frame mit referenzierten Originalslots, gemeinsame VM-Ausführung und finish_immediate |
VM watches_immediate_byref_and_errors_preserve_continuation: lokale Zuweisung, BYREF-Aufruf, PRINT, Original-PC und fortgesetzter geänderter Wert. IDE dispatcher_marks_edits_rebind_and_readonly_watches bedient den tatsächlichen Eingabepfad. |
| Direktfenster / Fehler im Direktfenster | Bestehendes handle_error, abgegrenzter Debug-Eintritt, Handler-/RESUME-Rückkehr und Quellort <Immediate> |
VM immediate_handler_resume_and_break_on_errors, immediate_wait_interrupt_nested_error_end_and_run, immediate_handler_exit_and_cached_new_imports_are_safe: ERROR, lokaler/geerbter Handler, RESUME NEXT, Handlerende, INPUT/Warten, Interrupt, END und RUN. IDE Direktfehleranzeige, Warte-/F5-Folge und echter RUN-Sitzungsreset. |
| Trace und Ausführungshistorie / Historie betrachten | record_debug_execution, 1.024-Einträge-Ring, Trace-Quellnavigation, H-/I-/Ausführungsmarken |
VM watchpoint_history_ring_and_error_differential, same_line_calls_and_immediate_do_not_retrigger_a_line_breakpoint; IDE calls_procedure_step_cursor_history_and_restart: zweimal zurück, vorwärts, unveränderter PC und unveränderte aktuelle Watchwerte, Reset. History führt nur Quellorte, keine rückspielbaren Zustände. |
| Break on Errors / Behandelter Fehler | Halt nach Handlerwahl/Unwinding an dessen erster Statement-Grenze; gesicherte Ursache, ERR/ERL und RESUME-PC | VM watchpoint_history_ring_and_error_differential vergleicht den Lauf mit und ohne Halt; immediate_handler_resume_and_break_on_errors und immediate_wait_interrupt_nested_error_end_and_run prüfen geerbte/lokale Handler und Fortsetzungsrahmen. |
| Sicheres Set Next Statement / Gültiger und ungültiger Sprung | Statement-Tabelle, strukturierte AST-Kontrollpfade und Bytecode-Schleifenbereiche; vollständige Prüfung vor PC-Änderung | VM step_over_recursive_frames_history_and_safe_jump, set_next_rejects_loop_gosub_handler_and_pending_operations_atomically, set_next_rejects_else_and_case_entry_but_allows_peer_statements: gleichrangiger Sprung wirksam; fremde Prozedur, Schleife, ELSE/CASE und GOSUB abgewiesen ohne Teiländerung. IDE form_handler_keys_and_old_revision_cursor_guard prüft den Revisionsschutz. |
Coherence
- Ein Interpreter: Watches benutzen den regulären Lexer/Parser, Sema, Codegen und die vorhandenen VM-Instruktionen. Es gibt keine zweite Arithmetik oder Konvertierungsschicht. Reinheit wird vor Ausführung am erzeugten Bytecode geprüft; automatische Beobachtung startet weder Host-Polling noch Fehlerhandler.
- Originale Modul-/Zeilen-Breakpoint-APIs bleiben erhalten. Neue Debuggerpfade sind opt-in; der CLI-Runtimepfad, das TBC-Format und seine Quelldaten bleiben unverändert. IDE-Compiler behalten vollständige Importkontexte für spätere Direktaufrufe auch nach inkrementeller Übersetzung.
- Dokumentmarken verwenden dieselben Edits und Undo-Einheiten wie der Editor. Formularname und Dateiname dürfen verschieden sein. Cursorziele werden nur gegen die unveränderte pausierte Kompilatrevision akzeptiert.
- Direktkommandos benutzen den bestehenden kooperativen Poll-/Warte-/RUN-Pfad. Handlerende entfernt keine Locals eines pausierten Frames. Syntaxfehler mutieren nichts; Laufzeitnebenwirkungen bleiben ausdrücklich wirksam.
- Die Grenzen für reine Watches, History ohne Zeitreise sowie konservatives
Set Next Statement sind in
docs/ide-bedienung.mddokumentiert. Die gemeinsame Phase-5-Abnahme bleibt Change 08; native Erzeugung bleibt Phase 6.
Behobene Verifikationsbefunde
- Zeilenbreakpoints merken ihren letzten Eintritt pro Frame. Ein zurückkehrender Aufruf oder Direktcode löst keinen zweiten Halt auf derselben Doppelpunktzeile aus; spätere Schleifendurchläufe halten weiterhin.
- History nimmt eine Grenze erst beim tatsächlichen Ausführen auf. Die vor einem Direktkommando noch nicht ausgeführte Grenze bleibt danach erhalten.
- Break on Errors markiert den ersten Handler-Einstieg, nicht einen veralteten Fehler-PC nach dem Unwinding. Ereigniszustellung verschiebt diesen Halt nicht.
- Direktfehler benutzen eine gesicherte Kommando-Rückkehr; auch Handlerende ohne RESUME erhält die ursprünglichen Frame-Slots und den Fortsetzungspunkt.
- ELSE-/CASE-Arme bekommen eigene Kontrollkontexte. Ein gleicher Frame allein reicht nicht zur Freigabe von Set Next Statement.
- Include-Marken behalten ihr Ursprungsmodul; Formularmarken benutzen die Dokumentidentität statt der Annahme, Formularname und Dateiname seien gleich.
- Automatische Watches führen kein Auto-DIM oder Benutzerfunktionen aus; Fehler verändern ERR nicht. Watchpoints berücksichtigen ihren ausgewählten erreichbaren Frame und zeigen Fehler pro Eintrag.
- Gewöhnliches STOP/Pause erhält den bisherigen Output-Fokus. Spezifische Debuggerhalte navigieren zum Quelltext; die vorhandenen Ausgabetests bleiben unverändert. Die alte Platzhalter-Erwartung „folgt in 06“ wurde durch die Verfügbarkeit des implementierten Kommandos ersetzt.
Abschlussprüfungen
cargo test --workspace: 587 bestanden, 0 fehlgeschlagen, 2 bestehende Ignore-Fälle (Golden-Output-Generator und externe VBDOS-Referenzsuite). Enthalten sind alle VM-/Fehlerhandler-/CLI-/IDE-Regressionen sowie die 20 neuen Debugger-Integrationstests.cargo clippy --workspace --all-targets -- -D warnings: bestanden.cargo fmt --all -- --check: bestanden.git diff --check: bestanden.openspec validate --all --strict: 23/23 gültig; bestehende INFO-Hinweise zur Länge von Requirement-Texten sind keine Validierungsfehler.
Keine angeforderte Prüfdimension wurde ausgelassen. Die Prüfungen sind reproduzierbar und headless; Maus-/Tasten- und Renderingpfade wurden über App-Ereignisse und TestBackend geprüft. Es bestehen keine offenen Befunde. Der Change ist vollständig umgesetzt und zur separaten Synchronisierung und Archivierung bereit.