On Thu, 3 Sep 2009 13:44:46 +1000 Daniel White daniel@whitehouse.id.au wrote:
On Wed, 2 Sep 2009 21:54:14 -0400 Jonathon McKitrick jmckitrick@gmail.com wrote:
Thanks, I'll check these out. It looks pretty weblocks-specific, but I assume it can be adapted to hunchentoot easily enough? I'll just look for a similar method to wrap with the AROUND method.
On Tue, Sep 1, 2009 at 2:50 PM, Leslie P. Polzersky@viridian-project.de wrote:
Jonathon McKitrick wrote:
I recall some time ago, the break and backtrace capability of Hunchentoot was removed, perhaps to make it less platform dependent. But I still find myself often trying to find the origin of cryptic error messages, and adding FORMAT and BREAK statements to narrow down the problem area. What is a good way to drop in support for, say, SBCL, so that an error will break into the debugger with a backtrace, or even dump the backtrace to the log file?
See http://bitbucket.org/S11001001/weblocks-dev/src/tip/src/error-handler.lisp and http://bitbucket.org/S11001001/weblocks-dev/src/tip/src/request-handler.lisp...
Leslie
For debugging purposes, I've been using the following for a while. It only extends Andreas' suggestion slightly by handling the IO-TIMEOUT condition I was experiencing in SBCL.
;;; Acceptor that provides debugging from the REPL ;;; Based on an email by Andreas Fruchs: ;;; http://common-lisp.net/pipermail/tbnl-devel/2009-April/004688.html (defclass debuggable-acceptor (acceptor) () (:documentation "An acceptor that handles errors by invoking the debugger."))
(defmethod process-connection ((*acceptor* debuggable-acceptor) (socket t)) (declare (ignore socket)) ;; Invoke the debugger on any errors except for SB-SYS:IO-TIMEOUT. ;; HTTP browsers usually leave the connection open for futher requests, ;; and Hunchentoot respects this but sets a timeout so that old connections ;; are cleaned up. (let ((*debugging-p* t)) (handler-case (call-next-method) #+sbcl (sb-sys:io-timeout (condition) (values nil condition)) (error (condition) (invoke-debugger condition)))))
(defmethod acceptor-request-dispatcher ((*acceptor* debuggable-acceptor)) (let ((dispatcher (call-next-method))) (lambda (request) (handler-bind ((error #'invoke-debugger)) (funcall dispatcher request)))))
I also have a special variable *DEBUGGING-P* defined for some other special cases I needed, so that can be safely discarded if not needed.