Re: A simple debugging macro
- From: Frank Goenninger DG1SBG <dont-email-me@xxxxxxxxxx>
- Date: Fri, 30 Nov 2007 10:38:40 +0100
Ken Tilton <kennytilton@xxxxxxxxxxxxx> writes:
fairchild.anthony@xxxxxxxxx wrote:
Hello all,
I wrote this simple macro a while back and I've found it to be
extremely useful for old-fashioned trace style debugging. Maybe
others will find it useful as well. Thoughts or criticism are
welcome. Perhaps others have similar macros or other methods of doing
this that are better.
Think to come of it, that would be a way kewl project, Ye Ultimate
Lisp Debuggery Tools. Yer hired.
Adding to the wish list:
* Being able to turn on debugging WITHOUT re-compiling everything (as
Rainer already pointed out)
* Logging of debug output into a file or (on *nix/OS X) to syslog
I have some ideas for this, of course:
;;; -*- mode: Lisp; Syntax: Common-Lisp; Package: gt.app.dbg; -*-
(in-package :cl-user)
(pushnew :net.goenninger.app.debug *features*)
(defpackage #:net.goenninger.app.debug
(:use
#:common-lisp
#:utils-kt
#:cells
#:net.goenninger.app.tools)
(:nicknames :gnc.app.dbg)
(:export
#:logmsg
#:*module*
#:in-module
#:enable-debugging
#:disable-debugging
#:reset-debugging-settings
#:defdbgobs))
(in-package :net.goenninger.app.debug)
;;; ----------------------------------------------------------------------------
;;; Debug Message Printing And Logging
;;; ----------------------------------------------------------------------------
;;; Requires: utils-kt package (by Kenneth Tilton)
(defun find-package-defining-symbol (designator)
(let ((name (string designator)))
(labels ((in-package-p (package)
(nth-value 1 (find-symbol name package))))
(if (member (in-package-p *package*) '(:external :internal))
*package*
(find :external (package-use-list *package*) :key #'in-package-p)))))
(defparameter *debug-modules* nil "Holds the module names for which debugging is enabled globally.")
(defparameter *module* nil "Holds the currently active module name.")
(defparameter *debug-functions* nil "Holds the package and function names for which debugging is enabled.")
(defparameter *log-level* nil "Defines the log level above which messages are logged - one of [\":DEBUG\"|\":INFO\"|\":WARN\"|\":ERROR\"|\":CRITICAL\"|\":EMERGENCY\"].")
(defmacro in-module (module-name)
(eval-when (:load-toplevel :compile-toplevel :execute)
`(setf net.goenninger.app.debug:*module* (up$ ,module-name))))
(defmacro logmsg (msg-class method method-desc msg &rest msg-args)
`(logmsg-fn ,msg-class
(find-package-defining-symbol ,method)
,method
,method-desc
,msg
,@msg-args))
(defun logmsg-fn (msg-class package method method-desc msg &rest msg-args)
(when (and (member (up$ (symbol-name method))
*debug-functions* :test #'string=)
(member *module* *debug-modules* :test #'string=))
(format *debug-io* "~&~%--- ~a --------------------------------------------------"
(format-iso8601-time (get-universal-time) t))
(format *debug-io* "~&*** ~A [ FN ~S ( ~A ) ]~&"
msg-class method method-desc)
(format *debug-io* "*** ")
(apply 'format *debug-io* msg msg-args)
(format *debug-io* "~%")
(force-output *debug-io*)))
(defmethod enable-debugging ((key (eql :module)) module-name)
(pushnew (up$ module-name) *debug-modules* :test #'string=))
(defmethod enable-debugging ((key (eql :function)) function-name)
(pushnew (up$ (symbol-name function-name)) *debug-functions* :test #'string=))
(defmethod disable-debugging ((key (eql :module)) module-name)
(setf *debug-modules* (remove (up$ module-name) *debug-modules*
:test #'string=)))
(defmethod disable-debugging ((key (eql :function)) function-name)
(setf *debug-modules* (remove (up$ (symbol-name function-name))
*debug-functions* :test #'string=)))
(defun reset-debugging-settings ()
(setf *debug-modules* nil)
(setf *debug-functions* nil))
;;; ----------------------------------------------------------------------------
;;; defdbgobs - Define standard debugging observer for a cell slot MACRO
;;; ----------------------------------------------------------------------------
;;; slot-name := Identifies the slot name to be observed
;;; class-desc := Identifies the class, example: ((self my-class))
;;;
;;; Requires: Cells 3.0 (by Kenneth Tilton)
(defmacro defdbgobs (slot-name class-desc)
`(defobserver ,slot-name ,class-desc
(logmsg :INFO 'observer ',slot-name
"~A of ~S: ~S -> ~S"
',slot-name self old-value new-value )))
Just some thoughts ... ;-)
// frgo
--
Frank Goenninger
frgo(at)mac(dot)com
"Don't ask me! I haven't been reading comp.lang.lisp long enough to
really know ..."
.
- Follow-Ups:
- Re: A simple debugging macro
- From: Edi Weitz
- Re: A simple debugging macro
- References:
- A simple debugging macro
- From: fairchild.anthony@xxxxxxxxx
- Re: A simple debugging macro
- From: Ken Tilton
- A simple debugging macro
- Prev by Date: Re: Reasons to choose CLISP over other free implementations
- Next by Date: Re: A simple debugging macro
- Previous by thread: Re: A simple debugging macro
- Next by thread: Re: A simple debugging macro
- Index(es):
Relevant Pages
|