From 59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b Mon Sep 17 00:00:00 2001 From: Kaz Kylheku Date: Tue, 16 Apr 2019 14:54:35 -0700 Subject: 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. --- unwind.h | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) (limited to 'unwind.h') diff --git a/unwind.h b/unwind.h index edf079ee..58e8c5fd 100644 --- a/unwind.h +++ b/unwind.h @@ -28,7 +28,10 @@ typedef union uw_frame uw_frame_t; typedef enum uw_frtype { UW_BLOCK, UW_CAPTURED_BLOCK, UW_MENV, UW_CATCH, UW_HANDLE, - UW_CONT_COPY, UW_GUARD + UW_CONT_COPY, UW_GUARD, +#if CONFIG_DEBUG_SUPPORT + UW_FCALL, +#endif } uw_frtype_t; struct uw_common { @@ -88,6 +91,17 @@ struct uw_guard { int uw_ok; }; +#if CONFIG_DEBUG_SUPPORT + +struct uw_fcall { + uw_frame_t *up; + uw_frtype_t type; + val fun; + struct args *args; +}; + +#endif + #if __aarch64__ #define UW_FRAME_ALIGN __attribute__ ((aligned (16))) #else @@ -102,6 +116,9 @@ union uw_frame { struct uw_handler ha; struct uw_cont_copy cp; struct uw_guard gu; +#if CONFIG_DEBUG_SUPPORT + struct uw_fcall fc; +#endif } UW_FRAME_ALIGN; void uw_push_block(uw_frame_t *, val tag); @@ -118,6 +135,9 @@ INLINE val uw_block_return(val tag, val result) val uw_block_abscond(val tag, val result); void uw_push_catch(uw_frame_t *, val matches); void uw_push_handler(uw_frame_t *, val matches, val fun); +#if CONFIG_DEBUG_SUPPORT +void uw_push_fcall(uw_frame_t *, val fun, struct args *args); +#endif noreturn val uw_throw(val sym, val exception); noreturn val uw_throwv(val sym, struct args *); noreturn val uw_throwf(val sym, val fmt, ...); @@ -143,6 +163,9 @@ uw_frame_t *uw_current_exit_point(void); val uw_get_frames(void); val uw_find_frame(val extype, val frtype); val uw_find_frames(val extype, val frtype); +#if CONFIG_DEBUG_SUPPORT +val uw_find_frames_by_mask(val mask); +#endif val uw_invoke_catch(val catch_frame, val sym, struct args *); val uw_muffle_warning(val exc, struct args *); val uw_trace_error(val ctx, val exc, struct args *); -- cgit v1.2.3