X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fdebug.lisp;h=54099e01a1a33322c7a212beac2a43ab002b69b2;hb=bee53328c93be3433477821131ab805557476c8b;hp=9f7171235117d53cb3927e0f595447f02da5bf0d;hpb=f0338f6fa732b21daa4405e19465bd460e0526d9;p=sbcl.git diff --git a/src/code/debug.lisp b/src/code/debug.lisp index 9f71712..54099e0 100644 --- a/src/code/debug.lisp +++ b/src/code/debug.lisp @@ -37,15 +37,22 @@ ;;; nestedness inside debugger command loops (defvar *debug-command-level* 0) -(defvar *stack-top-hint* nil - #!+sb-doc - "If this is bound before the debugger is invoked, it is used as the stack - top by the debugger.") +;;; If this is bound before the debugger is invoked, it is used as the +;;; stack top by the debugger. +(defvar *stack-top-hint* nil) + (defvar *stack-top* nil) (defvar *real-stack-top* nil) (defvar *current-frame* nil) +;;; Beginner-oriented help messages are important because you end up +;;; in the debugger whenever something bad happens, or if you try to +;;; get out of the system with Ctrl-C or (EXIT) or EXIT or whatever. +;;; But after memorizing them the wasted screen space gets annoying.. +(defvar *debug-beginner-help-p* t + "Should the debugger display beginner-oriented help messages?") + (defun debug-prompt (stream) ;; old behavior, will probably go away in sbcl-0.7.x @@ -187,7 +194,7 @@ Function and macro commands: (setf next-list (next-code-locations (first next-list)))) next-list))) -;;; Returns a list of code-locations of the possible breakpoints of the +;;; Return a list of code-locations of the possible breakpoints of the ;;; debug-function passed. (defun possible-breakpoints (debug-function) (let ((possible-breakpoints nil)) @@ -201,7 +208,7 @@ Function and macro commands: (push code-location possible-breakpoints)))))) (nreverse possible-breakpoints))) -;;; Searches the info-list for the item passed (code-location, +;;; Search the info-list for the item passed (code-location, ;;; debug-function, or breakpoint-info). If the item passed is a debug ;;; function then kind will be compared if it was specified. The kind ;;; if also compared if a breakpoint-info is passed since it's in the @@ -253,7 +260,7 @@ Function and macro commands: :type (or sb!di:code-location sb!di:debug-function)) ;; the breakpoint returned by sb!di:make-breakpoint (breakpoint (required-argument) :type sb!di:breakpoint) - ;; the function returned from sb!di:preprocess-for-eval. If result is + ;; the function returned from SB!DI:PREPROCESS-FOR-EVAL. If result is ;; non-NIL, drop into the debugger. (break #'identity :type function) ;; the function returned from sb!di:preprocess-for-eval. If result is @@ -432,7 +439,7 @@ Function and macro commands: (*standard-output* *debug-io*)) #!+sb-doc "Show a listing of the call stack going down from the current frame. In the - debugger, the current frame is indicated by the prompt. Count is how many + debugger, the current frame is indicated by the prompt. COUNT is how many frames to show." (fresh-line *standard-output*) (do ((frame (if *in-the-debugger* *current-frame* (sb!di:top-frame)) @@ -673,15 +680,17 @@ reset to ~S." ;; that file, and right to send them to *DEBUG-IO*. (*error-output* *debug-io*)) (unless (typep condition 'step-condition) - (format *debug-io* - "~%~@~2%" - '*debug-condition*) - (show-restarts *debug-restarts* *debug-io*) - (terpri *debug-io*)) + (when *debug-beginner-help-p* + (format *debug-io* + "~%~@~2%" + '*debug-condition* + '*debug-beginner-help-p*)) + (show-restarts *debug-restarts* *debug-io*)) (internal-debug)))))) (defun show-restarts (restarts s) @@ -792,32 +801,12 @@ reset to ~S." (t (funcall cmd-fun))))))))))))))) -;;; FIXME: As far as I know, the CMU CL X86 codebase has never -;;; supported access to the environment of the debugged function. It -;;; would be really, really nice to make that work! (Until then, -;;; non-NIL *AUTO-EVAL-IN-FRAME* seems to be useless, and as of -;;; sbcl-0.6.10 it even seemed to be actively harmful, since the -;;; debugger gets confused when trying to unwind the frames which -;;; arise in SIGINT interrupts. So it's set to NIL.) -(defvar *auto-eval-in-frame* nil - #!+sb-doc - "When set, evaluations in the debugger's command loop occur relative - to the current frame's environment without the need of debugger - forms that explicitly control this kind of evaluation. In an ideal - world, the default would be T, but since unfortunately the X86 - debugger support isn't good enough to make this useful, the - default is NIL instead.") - ;;; FIXME: We could probably use INTERACTIVE-EVAL for much of this logic. (defun debug-eval-print (expr) (/noshow "entering DEBUG-EVAL-PRINT" expr) (/noshow (fboundp 'compile)) - (/noshow (and (fboundp 'compile) *auto-eval-in-frame*)) (setq +++ ++ ++ + + - - expr) - (let* ((values (multiple-value-list - (if (and (fboundp 'compile) *auto-eval-in-frame*) - (sb!di:eval-in-frame *current-frame* -) - (eval -)))) + (let* ((values (multiple-value-list (eval -))) (*standard-output* *debug-io*)) (/noshow "done with EVAL in DEBUG-EVAL-PRINT") (fresh-line) @@ -1279,10 +1268,10 @@ argument") (defvar *cached-readtable* nil) (declaim (type (or readtable null) *cached-readtable*)) -(pushnew #'(lambda () - (setq *cached-debug-source* nil *cached-source-stream* nil - *cached-readtable* nil)) - sb!int:*before-save-initializations*) +(pushnew (lambda () + (setq *cached-debug-source* nil *cached-source-stream* nil + *cached-readtable* nil)) + *before-save-initializations*) ;;; We also cache the last top-level form that we printed a source for ;;; so that we don't have to do repeated reads and calls to