--- Preliminary _Debugger_ Documentation The debugger is structured as an interaction between the program being debugged and a debugger UI. The program is annotated to produce a stream of debugger "events" (as defined below) and to periodically block on a debugger semaphore. The debugger currently uses the stepper's annotation; changes to the annotation will be the focus of the next stage of the debugger. A simple debugger UI is provided as part of the debugger, but users who want to use the debugger will probably also want to supply their own UI. For this reason, we describe the interface to the UI first, and then the working of the current skeleton UI. Debugger Events: A debugger-event is either: > (make-breakpoint-halt), or : (-> debugger-event?) > (make-normal-breakpoint-info mark-list kind returned-value-list) : (-> (listof mark?) symbol? (listof any?) debugger-event?) > (make-error-breakpoint-info message) : (-> string? debugger-event?) > (make-expression-finished returned-value-list) : (-> (listof any?) debugger-event?) > (make-full-mark location label bindings) : (-> syntax? symbol? (listof identifier?) syntax?) NOTE: there is a mistake here, in the sense that the thing made by 'make-full-mark' is not actually a mark. It's a piece of syntax that represents a lambda expression which when evaluated turns into a mark. A mark is an opaque data type. Its contents can be extracted with the expose-mark function: expose-mark : (-> mark? (list/p syntax? symbol? (listof (list/p identifier? any?)))) Debugger UI (view-controller) signatures: (define-signature debugger-model^ (go-semaphore user-custodian set-breakpoint restart-program)) (define-signature debugger-vc^ (receive-result debugger-output-port)) A debugger UI is a unit which imports signature debugger-model^ (name-change suggestions welcomed) and exports signature debugger-vc^ (ditto). > go-semaphore: when the user's program halts at a breakpoint, it will block on this semaphore. Therefore, the UI can post to this semaphore to allow computation to proceed. > user-custodian: the user-custodian governs the user's program. Therefore, the UI can shut down this custodian to halt debugging. > (set-breakpoint location [name]): (location -> number) set-breakpoint specifies a location at which to set a breakpoint. For the moment, this breakpoint will be active only after restarting the user's program. A location has the following contract: (list/p number? ; line number (union string? false?) ; filename (union number? false?) ; position > (receive-result event) : (event -> void) The user's program calls this procedure whenever a debugger event occurs. Note that a (make-breakpoint-halt) event will occur whenever the user's program blocks at a breakpoint. > debugger-output-port : output from the user's program goes to this port. Existing mini-UI: The debugger starts a graphical read-eval-print loop, with the following bindings: > go-semaphore: passed through from the debugger > (events): returns a list of all events that have occurred during the execution of the program. > user-custodian: passed through from the debugger. In addition, the mini-UI prints a message to the grepl whenever an event occurs (which is cheerfully accepted as input the next time the user presses return...).