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

Add new debug meta-command ,error-message

* module/system/repl/error-handling.scm: use the error string to
  construct the <debug> instance.

* module/system/repl/command.scm: new debug command `error-message'
  that extracts the new <debug> field, available to stack commands as
  `message'.

* doc/ref/scheme-using.texi: documentation for new command.

* module/system/repl/debug.scm: <debug> stores the error string in a
  new field.
This commit is contained in:
Jose A. Ortega Ruiz 2010-08-30 06:37:24 +02:00
parent 5cc987760b
commit 54d9a994b1
4 changed files with 45 additions and 21 deletions

View file

@ -311,6 +311,14 @@ Show local variables.
Show locally-bound variables in the selected frame. Show locally-bound variables in the selected frame.
@end deffn @end deffn
@deffn {REPL Command} error-message
@deffnx {REPL Command} error
Show error message.
Display the message associated with the error that started the current
debugging REPL.
@end deffn
@c FIXME: whenever we regain support for stepping, here are the docs.. @c FIXME: whenever we regain support for stepping, here are the docs..
@c The commands in this subsection all apply only when the stack is @c The commands in this subsection all apply only when the stack is

View file

@ -6,12 +6,12 @@
;; modify it under the terms of the GNU Lesser General Public ;; modify it under the terms of the GNU Lesser General Public
;; License as published by the Free Software Foundation; either ;; License as published by the Free Software Foundation; either
;; version 3 of the License, or (at your option) any later version. ;; version 3 of the License, or (at your option) any later version.
;; ;;
;; This library is distributed in the hope that it will be useful, ;; This library is distributed in the hope that it will be useful,
;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; but WITHOUT ANY WARRANTY; without even the implied warranty of
;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
;; Lesser General Public License for more details. ;; Lesser General Public License for more details.
;; ;;
;; You should have received a copy of the GNU Lesser General Public ;; You should have received a copy of the GNU Lesser General Public
;; License along with this library; if not, write to the Free Software ;; License along with this library; if not, write to the Free Software
;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
@ -55,7 +55,7 @@
(disassemble x) (disassemble-file xx)) (disassemble x) (disassemble-file xx))
(profile (time t) (profile pr) (trace tr)) (profile (time t) (profile pr) (trace tr))
(debug (backtrace bt) (up) (down) (frame fr) (debug (backtrace bt) (up) (down) (frame fr)
(procedure proc) (locals)) (procedure proc) (locals) (error-message error))
(inspect (inspect i) (pretty-print pp)) (inspect (inspect i) (pretty-print pp))
(system (gc) (statistics stat) (option o) (system (gc) (statistics stat) (option o)
(quit q continue cont)))) (quit q continue cont))))
@ -171,7 +171,7 @@
(format #t "Throw to key `~a' with args `~s' while reading ~@[ argument `~A' of ~]command `~A'.\n" (format #t "Throw to key `~a' with args `~s' while reading ~@[ argument `~A' of ~]command `~A'.\n"
key args form-name 'name))) key args form-name 'name)))
(abort)) (abort))
(% (let* ((expression0 (% (let* ((expression0
(catch #t (catch #t
(lambda () (lambda ()
@ -463,6 +463,8 @@ Trace execution."
(letrec-syntax (letrec-syntax
((#,(datum->syntax #'repl 'frames) ((#,(datum->syntax #'repl 'frames)
(identifier-syntax (debug-frames debug))) (identifier-syntax (debug-frames debug)))
(#,(datum->syntax #'repl 'message)
(identifier-syntax (debug-error-message debug)))
(#,(datum->syntax #'repl 'index) (#,(datum->syntax #'repl 'index)
(identifier-syntax (identifier-syntax
(id (debug-index debug)) (id (debug-index debug))
@ -474,6 +476,14 @@ Trace execution."
body body* ...) body body* ...)
(format #t "Nothing to debug.~%")))))))) (format #t "Nothing to debug.~%"))))))))
(define-stack-command (error-message repl)
"error-message
Show error message.
Display the message associated with the error that started the current
debugging REPL."
(format #t "~a~%" (if (string? message) message "No error message")))
(define-stack-command (backtrace repl #:optional count (define-stack-command (backtrace repl #:optional count
#:key (width 72) full?) #:key (width 72) full?)
"backtrace [COUNT] [#:width W] [#:full? F] "backtrace [COUNT] [#:width W] [#:full? F]
@ -481,11 +491,11 @@ Print a backtrace.
Print a backtrace of all stack frames, or innermost COUNT frames. Print a backtrace of all stack frames, or innermost COUNT frames.
If COUNT is negative, the last COUNT frames will be shown." If COUNT is negative, the last COUNT frames will be shown."
(print-frames frames (print-frames frames
#:count count #:count count
#:width width #:width width
#:full? full?)) #:full? full?))
(define-stack-command (up repl #:optional (count 1)) (define-stack-command (up repl #:optional (count 1))
"up [COUNT] "up [COUNT]
Select a calling stack frame. Select a calling stack frame.
@ -548,14 +558,14 @@ With an argument, select a frame by index, then show it."
"procedure "procedure
Print the procedure for the selected frame." Print the procedure for the selected frame."
(repl-print repl (frame-procedure cur))) (repl-print repl (frame-procedure cur)))
(define-stack-command (locals repl) (define-stack-command (locals repl)
"locals "locals
Show local variables. Show local variables.
Show locally-bound variables in the selected frame." Show locally-bound variables in the selected frame."
(print-locals cur)) (print-locals cur))
;;; ;;;
;;; Inspection commands ;;; Inspection commands
@ -581,7 +591,7 @@ Pretty-print the result(s) of evaluating EXP."
;;; ;;;
;;; System commands ;;; System commands
;;; ;;;
(define guile:gc gc) (define guile:gc gc)

View file

@ -30,7 +30,7 @@
#:use-module ((system vm inspect) #:select ((inspect . %inspect))) #:use-module ((system vm inspect) #:select ((inspect . %inspect)))
#:use-module (system vm program) #:use-module (system vm program)
#:export (<debug> #:export (<debug>
make-debug debug? debug-frames debug-index make-debug debug? debug-frames debug-index debug-error-message
print-locals print-frame print-frames frame->module print-locals print-frame print-frames frame->module
stack->vector narrow-stack->vector)) stack->vector narrow-stack->vector))
@ -66,7 +66,7 @@
;;; accessors, and provides some helper functions. ;;; accessors, and provides some helper functions.
;;; ;;;
(define-record <debug> frames index) (define-record <debug> frames index error-message)

View file

@ -32,6 +32,16 @@
;;; Error handling via repl debugging ;;; Error handling via repl debugging
;;; ;;;
(define (error-string stack key args)
(with-output-to-string
(lambda ()
(pmatch args
((,subr ,msg ,args . ,rest)
(display-error (vector-ref stack 0) (current-output-port)
subr msg args rest))
(else
(format #t "Throw to key `~a' with args `~s'." key args))))))
(define* (call-with-error-handling thunk #:key (define* (call-with-error-handling thunk #:key
(on-error 'debug) (post-error 'catch) (on-error 'debug) (post-error 'catch)
(pass-keys '(quit))) (pass-keys '(quit)))
@ -45,7 +55,7 @@
(lambda () (lambda ()
(with-error-to-port err (with-error-to-port err
thunk)))))) thunk))))))
(catch #t (catch #t
(lambda () (%start-stack #t thunk)) (lambda () (%start-stack #t thunk))
@ -75,7 +85,7 @@
(if (procedure? post-error) (if (procedure? post-error)
post-error ; a handler proc post-error ; a handler proc
(error "Unknown post-error strategy" post-error)))) (error "Unknown post-error strategy" post-error))))
(case on-error (case on-error
((debug) ((debug)
(lambda (key . args) (lambda (key . args)
@ -85,22 +95,18 @@
(make-stack #t) (make-stack #t)
;; Cut three frames from the top of the stack: ;; Cut three frames from the top of the stack:
;; make-stack, this one, and the throw handler. ;; make-stack, this one, and the throw handler.
3 3
;; Narrow the end of the stack to the most recent ;; Narrow the end of the stack to the most recent
;; start-stack. ;; start-stack.
tag tag
;; And one more frame, because %start-stack invoking ;; And one more frame, because %start-stack invoking
;; the start-stack thunk has its own frame too. ;; the start-stack thunk has its own frame too.
0 (and tag 1))) 0 (and tag 1)))
(debug (make-debug stack 0))) (error-msg (error-string stack key args))
(debug (make-debug stack 0 error-msg)))
(with-saved-ports (with-saved-ports
(lambda () (lambda ()
(pmatch args (format #t error-msg)
((,subr ,msg ,args . ,rest)
(display-error (vector-ref stack 0) (current-output-port)
subr msg args rest))
(else
(format #t "Throw to key `~a' with args `~s'." key args)))
(format #t "Entering a new prompt. ") (format #t "Entering a new prompt. ")
(format #t "Type `,bt' for a backtrace or `,q' to continue.\n") (format #t "Type `,bt' for a backtrace or `,q' to continue.\n")
((@ (system repl repl) start-repl) #:debug debug)))))) ((@ (system repl repl) start-repl) #:debug debug))))))