Added stepping to debugger

This commit is contained in:
Dane Johnson 2025-08-25 17:26:11 -05:00
parent 1c84a9c862
commit 54709e55f8
3 changed files with 31 additions and 9 deletions

View File

@ -10,7 +10,7 @@
;; assembler ;; assembler
assemble assemble
;; debugger ;; debugger
make-debugger debugger-continue make-debugger debugger-continue debugger-step
debugger-vm debugger-vm
debugger-breakpoints debugger-breakpoints-set! debugger-breakpoints debugger-breakpoints-set!
debugger-breakpoint-add! debugger-breakpoint-ref debugger-breakpoint-add! debugger-breakpoint-ref

View File

@ -12,15 +12,16 @@
debugger-breakpoint-add! debugger-breakpoint-ref debugger-breakpoint-add! debugger-breakpoint-ref
debugger-breakpoint-enable! debugger-breakpoint-disable! debugger-breakpoint-enable! debugger-breakpoint-disable!
debugger-breakpoint-delete! debugger-breakpoint-delete!
debugger-continue)) debugger-step debugger-continue))
(define-record-type <debugger> (define-record-type <debugger>
(make-debugger vm source breakpoints continuation) (make-debugger vm source breakpoints continuation stepping)
debugger? debugger?
(vm debugger-vm) (vm debugger-vm)
(source debugger-source) (source debugger-source)
(breakpoints debugger-breakpoints) (breakpoints debugger-breakpoints)
(continuation debugger-continuation debugger-continuation-set!)) (continuation debugger-continuation debugger-continuation-set!)
(stepping debugger-stepping? debugger-stepping-set!))
(define (make-breakpoints labels) (define (make-breakpoints labels)
(define the-breakpoints '()) (define the-breakpoints '())
@ -51,17 +52,23 @@
(define the-debugger #f) (define the-debugger #f)
(define (debug) (define (debug)
(shift k (shift k
(if (((debugger-breakpoints the-debugger) 'ref) (vm-pc (debugger-vm the-debugger))) (if (or (debugger-stepping? the-debugger)
(debugger-continuation-set! the-debugger k) (((debugger-breakpoints the-debugger) 'ref) (vm-pc (debugger-vm the-debugger))))
(k)))) (debugger-continuation-set! the-debugger k)
(k))))
(define vm (make-vm #:debugger debug)) (define vm (make-vm #:debugger debug))
(vm-load-program! vm prgm) (vm-load-program! vm prgm)
(set! the-debugger (make-debugger vm source (make-breakpoints symbols) #f)) (set! the-debugger (make-debugger vm source (make-breakpoints symbols) #f #f))
(debugger-breakpoint-add! the-debugger 1) (debugger-breakpoint-add! the-debugger 1)
(reset (run-vm vm)) (reset (run-vm vm))
the-debugger) the-debugger)
(define (debugger-continue debugger) (define (debugger-continue debugger)
(debugger-stepping-set! debugger #f)
((debugger-continuation debugger)))
(define (debugger-step debugger)
(debugger-stepping-set! debugger #t)
((debugger-continuation debugger))) ((debugger-continuation debugger)))
(define (debugger-breakpoint-add! debugger breakpoint) (define (debugger-breakpoint-add! debugger breakpoint)

View File

@ -144,4 +144,19 @@
(stack-pop my-data) (stack-pop my-data)
(stack-push my-data 1) (stack-push my-data 1)
(debugger-continue my-debugger) (debugger-continue my-debugger)
(assert-equal 1 (vm-memory-ref my-vm 1)))) (assert-equal 1 (vm-memory-ref my-vm 1)))
(define-test "stepping"
(define my-debugger (make-debugger fib-program-asm))
(define my-vm (debugger-vm my-debugger))
(vm-memory-set! my-vm 1 10)
(vm-pc-set! my-vm 5)
(debugger-breakpoint-add! my-debugger 'fib)
(debugger-continue my-debugger)
(assert-equal 23 (vm-pc my-vm))
(debugger-step my-debugger)
(assert-equal 24 (vm-pc my-vm)) ;; dup is a 1 byte instruction
(debugger-step my-debugger)
(assert-equal 29 (vm-pc my-vm)) ;; push is a 5 byte instruction
(debugger-continue my-debugger)
(assert-equal 23 (vm-pc my-vm)) ;; continue stops stepping
))