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:
parent
5cc987760b
commit
54d9a994b1
4 changed files with 45 additions and 21 deletions
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -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))))))
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue