1
Fork 0
mirror of https://git.savannah.gnu.org/git/guile.git synced 2025-06-10 22:10:21 +02:00

More relevant VM backtrace

* module/system/repl/repl.scm: Remove a useless print in the backtrace
  handler.

* module/system/vm/debug.scm (vm-backtrace): s/reverse!/reverse/

* module/system/vm/frame.scm (bootstrap-frame?): A heuristic to see if a
  frame is a bootstrap frame, the one allocated on the stack in
  vm_engine.c; need to have a better solution for this.
  (make-frame-chain): Don't include bootstrap frames, they add no
  information.
  (print-frame-chain-as-backtrace): Remove a pk.

* src/vm_engine.c (vm_run): Add a fixme about the bootstrap prograp.
This commit is contained in:
Andy Wingo 2008-08-08 13:19:49 +02:00
parent d0168f3da8
commit e15f47740b
4 changed files with 24 additions and 16 deletions

View file

@ -66,7 +66,6 @@
(vm-backtrace (the-vm))
(newline))
((,key ,subr ,msg ,args . ,rest)
(display "This backtrace for free: ")
(vm-backtrace (the-vm))
(newline)
(let ((cep (current-error-port)))

View file

@ -59,4 +59,4 @@
(define (vm-backtrace vm)
(print-frame-chain-as-backtrace
(reverse! (vm-last-frame-chain vm))))
(reverse (vm-last-frame-chain vm))))

View file

@ -21,6 +21,7 @@
(define-module (system vm frame)
:use-module (system vm program)
:use-module (system vm instruction)
:use-module ((srfi srfi-1) :select (fold))
:export (frame-number frame-address
make-frame-chain
@ -42,17 +43,27 @@
(define frame-number (make-object-property))
(define frame-address (make-object-property))
(define (bootstrap-frame? frame)
(let ((code (program-bytecode (frame-program frame))))
;; XXX: need to fix the bootstrap prog, its code is on the C stack
(and (= (uniform-vector-length code) 3))))
(define (make-frame-chain frame addr)
(let* ((link (frame-dynamic-link frame))
(chain (cons frame
(if (eq? link #t)
'()
(make-frame-chain
link (frame-return-address frame))))))
(set! (frame-number frame) (1- (length chain)))
(set! (frame-address frame)
(- addr (program-base (frame-program frame))))
chain))
(define (make-rest)
(make-frame-chain (frame-dynamic-link frame)
(frame-return-address frame)))
(cond
((or (eq? frame #t) (eq? frame #f))
;; handle #f or #t dynamic links
'())
((bootstrap-frame? frame)
(make-rest))
(else
(let ((chain (make-rest)))
(set! (frame-number frame) (length chain))
(set! (frame-address frame)
(- addr (program-base (frame-program frame))))
(cons frame chain)))))
;;;
@ -97,10 +108,7 @@
(if (null? frames)
(format #t "No backtrace available.\n")
(begin
(format #t "Backtrace:\n")
(pk frames (map frame-program frames)
(map frame-address frames)
)
(format #t "VM backtrace:\n")
(fold (lambda (frame file)
(let ((new-file (frame-file frame file)))
(if (not (eqv? new-file file))

View file

@ -100,6 +100,7 @@ vm_run (SCM vm, SCM program, SCM args)
SCM prog = program;
/* Boot program */
/* FIXME: heap program object points to objcode on the stack. Badness! */
scm_byte_t bytes[3] = {scm_op_call, 0, scm_op_halt};
bytes[1] = scm_ilength (args); /* FIXME: argument overflow */
program = scm_c_make_program (bytes, 3, SCM_BOOL_T);