diff options
author | Philipp Stephani <phst@google.com> | 2020-11-29 14:24:57 +0100 |
---|---|---|
committer | Philipp Stephani <phst@google.com> | 2020-12-06 17:47:52 +0100 |
commit | 40e11743ca3803bdc2c6c612f35ab695efb3eb8b (patch) | |
tree | 85d9362c7e46106a3212716dff5f2cfd30ffdaba /src/eval.c | |
parent | 87a9fc6dcd8e364c9ae27da27fee439dc41c2e25 (diff) | |
download | emacs-40e11743ca3803bdc2c6c612f35ab695efb3eb8b.tar.gz emacs-40e11743ca3803bdc2c6c612f35ab695efb3eb8b.tar.bz2 emacs-40e11743ca3803bdc2c6c612f35ab695efb3eb8b.zip |
Print a backtrace on unhandled errors in batch mode (Bug#44942).
* src/eval.c (signal_or_quit): Print a backtrace in batch mode if no
error handler was found.
* test/src/eval-tests.el (eval-tests/backtrace-in-batch-mode)
(eval-tests/backtrace-in-batch-mode/demoted-errors): New unit tests.
* etc/NEWS: Document change.
Diffstat (limited to 'src/eval.c')
-rw-r--r-- | src/eval.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/src/eval.c b/src/eval.c index d9a424b57a9..18df484aac0 100644 --- a/src/eval.c +++ b/src/eval.c @@ -1709,6 +1709,7 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit) break; } + bool debugger_called = false; if (/* Don't run the debugger for a memory-full error. (There is no room in memory to do that!) */ !NILP (error_symbol) @@ -1722,7 +1723,7 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit) if requested". */ || EQ (h->tag_or_ch, Qerror))) { - bool debugger_called + debugger_called = maybe_call_debugger (conditions, error_symbol, data); /* We can't return values to code which signaled an error, but we can continue code which has signaled a quit. */ @@ -1730,6 +1731,18 @@ signal_or_quit (Lisp_Object error_symbol, Lisp_Object data, bool keyboard_quit) return Qnil; } + /* If we're in batch mode, print a backtrace unconditionally to help with + debugging. Make sure to use `debug' unconditionally to not interfere with + ERT or other packages that install custom debuggers. */ + if (!debugger_called && !NILP (error_symbol) + && (NILP (clause) || EQ (h->tag_or_ch, Qerror)) && noninteractive) + { + ptrdiff_t count = SPECPDL_INDEX (); + specbind (Vdebugger, Qdebug); + call_debugger (list2 (Qerror, Fcons (error_symbol, data))); + unbind_to (count, Qnil); + } + if (!NILP (clause)) { Lisp_Object unwind_data |