summaryrefslogtreecommitdiffstats
path: root/share
diff options
context:
space:
mode:
authorKaz Kylheku <kaz@kylheku.com>2019-04-16 14:54:35 -0700
committerKaz Kylheku <kaz@kylheku.com>2019-04-16 14:54:35 -0700
commit59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b (patch)
tree117db7d424b7038311ea108a5d9d2427f2057543 /share
parent7acbe1e1fff644f60637ad96610c93f76ccd2cf4 (diff)
downloadtxr-59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b.tar.gz
txr-59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b.tar.bz2
txr-59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b.zip
debugger: initial backtrace support.
* debug.c (debug_state): Switch to unsigned, since this is now a bitmask. (sys_print_backtrace_s): New symbol variable. (dbg_clear, dbg_set, dbg_restore): New static functions. (debug_init): Initialize sys_print_backtrace_s. Register dbg-clear, dbg-set, dbg-restore intrinsics. Register dbg-enable, dbg-step, dbg-backtrace and dbg-all bitmask variables, Lisp equivalents of DBG_ENABLE, DBG_SETP, DBG_BACKTRACE and DBG_ALL. (debug_dump_backtrace): New function. * debug.h (opt_debugger): Declaration removed. (debug_state): Declaration updated. (DBG_ENABLE, DBG_STEP, DBG_BACKTRACE, DBG_ALL): New preprocessor symbols. (debug_set_state): Inline function removed. (debug_clear, debug_set, debug_restore): New inline functions. (dbg_backtrace, dbg_fcall_begin, dbg_fcall_end): New macros. (debug_dump_backtrace): Declared. * eval.c (error_trace): Invoke debug_dump_backtrace if support is compiled in and backtraces are enabled. * lib.c (do_generic_funcall): New function, copy of generic_funcall. (generic_funcall): Now a wrapper for do_generic_funcall which registers fcall frames if backtrace support is enabled. (funcall, funcall1, funcall2, funcall3, funcall4): Route to slow generic_funcall path if backtraces are enabled. * lisplib.c (debugger_instantiate, debugger_set_entries): New static functions. (lisplib_init): Autload support for debug module via above new functions. (lisplib_try_load): Save and restore debugger state in new way using debug_set and debug_restore, with specific mask values. * parser.y (parse_once): Disable debugging in new way. * share/txr/stdlib/debug.tl New file. * sighal.h (EJ_DBG_MEMB, EJ_DBG_SAVE, EJ_DBG_REST): New macros for saving/restoring debug state. (EJ_OPT_MEMB, EJ_OPT_SAVE, EJ_OPT_REST): Reference the above macros to include debug state in extended jump context. * txr.c (help): Document --backtrace and that that -d implies --backtrace. (txr_main): Enable debugger using debug_set. Provide new --backtrace option to enable backtraces only. * unwind.c (args_s): New symbol variable. (fcall_frame_type): New static variable. (unwind_to_exit_point): Save pointer to original frame stack and restore it when calling error_trace. This is so that error_trace can walk the stack to collect a backtrace. (uw_find_frames_by_mask, uw_push_fcall): New functions. (uw_late_init): Initialize args_s and fcall_frame_type. gc-protect fcall_frame_type. Register uw-* variables corresponding to the UW_* frame types. * unwind.h (uw_frtype_t): New enum constant UW_FCALL. (struct uw_fcall): New frame structure. (union uw_frame): New member fc. (uw_push_fcall, uw_find_frames_by_mask): Declared.
Diffstat (limited to 'share')
-rw-r--r--share/txr/stdlib/debugger.tl66
1 files changed, 66 insertions, 0 deletions
diff --git a/share/txr/stdlib/debugger.tl b/share/txr/stdlib/debugger.tl
new file mode 100644
index 00000000..9afab9ef
--- /dev/null
+++ b/share/txr/stdlib/debugger.tl
@@ -0,0 +1,66 @@
+;; Copyright 2019
+;; Kaz Kylheku <kaz@kylheku.com>
+;; Vancouver, Canada
+;; All rights reserved.
+;;
+;; Redistribution and use in source and binary forms, with or without
+;; modification, are permitted provided that the following conditions are met:
+;;
+;; 1. Redistributions of source code must retain the above copyright notice, this
+;; list of conditions and the following disclaimer.
+;;
+;; 2. Redistributions in binary form must reproduce the above copyright notice,
+;; this list of conditions and the following disclaimer in the documentation
+;; and/or other materials provided with the distribution.
+;;
+;; THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
+;; ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+;; WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+;; DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+;; FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+;; DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+;; SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+;; CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+;; OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+;; OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+(defmacro with-disabled-debugging (. forms)
+ (let ((state (gensym)))
+ ^(let ((,state (dbg-clear dbg-all)))
+ (unwind-protect
+ (progn ,*forms)
+ (dbg-restore ,state)))))
+
+(defun make-command-env (command-table)
+ (let ((env (make-env )))
+ (mapdo (ado env-vbind env @1 ^(,@2)) command-table)
+ env))
+
+(defparml %dbg-commands% '((usr:? debugger-help "list command summary")
+ (usr:bt print-backtrace "print backtrace")))
+
+(defparml %dbg-command-env% (make-command-env %dbg-commands%))
+
+(defun debugger-help ()
+ (mapdo (ap pprinl `@{@1 15} @3`) %dbg-commands%))
+
+(defun print-backtrace (: (*stdout* *stdout*) (prefix ""))
+ (with-resources ((imode (set-indent-mode *stdout* indent-off)
+ (set-indent-mode *stdout* imode)))
+ (each ((fr (find-frames-by-mask uw-fcall)))
+ (let* ((fun fr.fun)
+ (args fr.args)
+ (name (if (functionp fun)
+ (func-get-name fun)))
+ (kind
+ (cond
+ ((interp-fun-p fun) "I")
+ ((vm-fun-p fun) "V")
+ ((functionp fun) "C")
+ (t "O"))))
+ (put-string `@prefix @kind: `)
+ (prinl ^[,(or name fun) ,*args])))))
+
+(defun debugger ()
+ (with-disabled-debugging
+ (sys:repl nil *stdin* *stdout* %dbg-command-env%)))