X-Git-Url: http://repo.macrolet.net/gitweb/?a=blobdiff_plain;f=src%2Fcode%2Fntrace.lisp;h=588b30ebd316e7d495e51034dc3b7b46bf50a32d;hb=084168e1524a6493bc0f9d1697753d31239b158d;hp=03eac599ac24d2d6b8a44fe41b5106d22a0fa46b;hpb=4f07ad793f1a0b3d379ffe412f4cf92a137dccae;p=sbcl.git diff --git a/src/code/ntrace.lisp b/src/code/ntrace.lisp index 03eac59..588b30e 100644 --- a/src/code/ntrace.lisp +++ b/src/code/ntrace.lisp @@ -204,9 +204,10 @@ (dolist (ele forms) (fresh-line) (print-trace-indentation) - (format t "~@<~S ~_= ~S~:>" (car ele) (funcall (cdr ele) frame)))) + (format t "~@<~S ~_= ~S~:>" (car ele) (funcall (cdr ele) frame)) + (terpri))) -;;; Test a BREAK option, and break if true. +;;; Test a BREAK option, and if true, break. (defun trace-maybe-break (info break where frame) (when (and break (funcall (cdr break) frame)) (sb-di:flush-frames-above frame) @@ -230,9 +231,9 @@ ;;;; hook functions ;;; Return a closure that can be used for a function start breakpoint -;;; hook function and a closure that can be used as the -;;; FUN-END-COOKIE function. The first communicates the sense of -;;; the Condition to the second via a closure variable. +;;; hook function and a closure that can be used as the FUN-END-COOKIE +;;; function. The first communicates the sense of the +;;; TRACE-INFO-CONDITION to the second via a closure variable. (defun trace-start-breakpoint-fun (info) (let (conditionp) (values @@ -342,7 +343,7 @@ (nth-value 2 (trace-fdefinition definition))) (trace-fdefinition function-or-name)) (when (gethash fun *traced-funs*) - (warn "~S is already TRACE'd, untracing it." function-or-name) + (warn "~S is already TRACE'd, untracing it first." function-or-name) (untrace-1 fun)) (let* ((debug-fun (sb-di:fun-debug-fun fun)) @@ -461,8 +462,7 @@ current)) ;;; Compute the expansion of TRACE in the non-trivial case (arguments -;;; specified.) If there are no :FUNCTION specs, then don't use a LET. -;;; This allows TRACE to be used without the full interpreter. +;;; specified.) (defun expand-trace (specs) (collect ((binds) (forms)) @@ -480,13 +480,20 @@ ((and (keywordp name) (not (or (fboundp name) (macro-function name)))) (error "unknown TRACE option: ~S" name)) + ((stringp name) + (let ((package (find-undeleted-package-or-lose name))) + (do-all-symbols (symbol (find-package name)) + (when (and (eql package (symbol-package symbol)) + (fboundp symbol) + (not (macro-function symbol)) + (not (special-operator-p symbol))) + (forms `(trace-1 ',symbol ',options)))))) (t (forms `(trace-1 ',name ',options)))) (setq current (parse-trace-options current options))))) - - (if (binds) - `(let ,(binds) (list ,@(forms))) - `(list ,@(forms))))) + + `(let ,(binds) + (list ,@(forms))))) (defun %list-traced-funs () (loop for x being each hash-value in *traced-funs* @@ -498,7 +505,9 @@ TRACE is a debugging tool that provides information when specified functions are called. In its simplest form: (TRACE NAME-1 NAME-2 ...) - (The NAMEs are not evaluated.) + The NAMEs are not evaluated. Each may be a symbol, denoting an + individual function, or a string, denoting all functions fbound + to symbols whose home package is the package with the given name. Options allow modification of the default behavior. Each option is a pair of an option keyword and a value form. Global options are specified before @@ -605,6 +614,11 @@ #+sb-doc "Remove tracing from the specified functions. With no args, untrace all functions." + ;; KLUDGE: Since we now allow (TRACE FOO BAR "SB-EXT") to trace not + ;; only #'FOO and #'BAR but also all the functions in #, + ;; it would be probably be best for consistency to do something similar + ;; with UNTRACE. (But I leave it to someone who uses and cares about + ;; UNTRACE-with-args more often than I do.) -- WHN 2003-12-17 (if specs (collect ((res)) (let ((current specs))