diff options
author | Kaz Kylheku <kaz@kylheku.com> | 2019-04-16 14:54:35 -0700 |
---|---|---|
committer | Kaz Kylheku <kaz@kylheku.com> | 2019-04-16 14:54:35 -0700 |
commit | 59c4fe61bdbe56eb215e29535e89ad72c3a2ee4b (patch) | |
tree | 117db7d424b7038311ea108a5d9d2427f2057543 /lib.c | |
parent | 7acbe1e1fff644f60637ad96610c93f76ccd2cf4 (diff) | |
download | txr-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 'lib.c')
-rw-r--r-- | lib.c | 25 |
1 files changed, 19 insertions, 6 deletions
@@ -72,6 +72,7 @@ #include "buf.h" #include "ffi.h" #include "txr.h" +#include "debug.h" #define max(a, b) ((a) > (b) ? (a) : (b)) #define min(a, b) ((a) < (b) ? (a) : (b)) @@ -6044,7 +6045,7 @@ static noreturn void callerror(val fun, val msg) abort(); } -val generic_funcall(val fun, struct args *args_in) +INLINE val do_generic_funcall(val fun, struct args *args_in) { int variadic, fixparam, reqargs; struct args *args = args_in; @@ -6257,6 +6258,18 @@ val generic_funcall(val fun, struct args *args_in) internal_error("corrupt function type field"); } +val generic_funcall(val fun, struct args *args) +{ + if (dbg_backtrace) { + val ret; + dbg_fcall_begin(fun, args); + ret = do_generic_funcall(fun, args); + dbg_fcall_end; + return ret; + } + return do_generic_funcall(fun, args); +} + static noreturn void wrongargs(val fun) { callerror(fun, lit("wrong number of arguments")); @@ -6264,7 +6277,7 @@ static noreturn void wrongargs(val fun) val funcall(val fun) { - if (type(fun) != FUN || fun->f.optargs) { + if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) { args_decl(args, ARGS_MIN); return generic_funcall(fun, args); } @@ -6305,7 +6318,7 @@ val funcall(val fun) val funcall1(val fun, val arg) { - if (type(fun) != FUN || fun->f.optargs) { + if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) { args_decl(args, ARGS_MIN); args_add(args, arg); return generic_funcall(fun, args); @@ -6357,7 +6370,7 @@ val funcall1(val fun, val arg) val funcall2(val fun, val arg1, val arg2) { - if (type(fun) != FUN || fun->f.optargs) { + if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) { args_decl(args, ARGS_MIN); args_add2(args, arg1, arg2); return generic_funcall(fun, args); @@ -6415,7 +6428,7 @@ val funcall2(val fun, val arg1, val arg2) val funcall3(val fun, val arg1, val arg2, val arg3) { - if (type(fun) != FUN || fun->f.optargs) { + if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) { args_decl(args, ARGS_MIN); args_add3(args, arg1, arg2, arg3); return generic_funcall(fun, args); @@ -6479,7 +6492,7 @@ val funcall3(val fun, val arg1, val arg2, val arg3) val funcall4(val fun, val arg1, val arg2, val arg3, val arg4) { - if (type(fun) != FUN || fun->f.optargs) { + if (type(fun) != FUN || fun->f.optargs || dbg_backtrace) { args_decl(args, ARGS_MIN); args_add4(args, arg1, arg2, arg3, arg4); return generic_funcall(fun, args); |