summaryrefslogtreecommitdiff
path: root/lisp/emacs-lisp/debug.el
diff options
context:
space:
mode:
authorStefan Monnier <monnier@iro.umontreal.ca>2018-04-02 00:23:20 -0400
committerStefan Monnier <monnier@iro.umontreal.ca>2018-04-02 00:23:20 -0400
commit7228488effa78dcb75284cb6d247b24804e0e7f5 (patch)
treed18b1d62f339842a6bc8efe07dce4f26ff668b38 /lisp/emacs-lisp/debug.el
parent7bedc8812bd7ca1d9cf36636322068b28b690a85 (diff)
downloademacs-7228488effa78dcb75284cb6d247b24804e0e7f5.tar.gz
emacs-7228488effa78dcb75284cb6d247b24804e0e7f5.tar.bz2
emacs-7228488effa78dcb75284cb6d247b24804e0e7f5.zip
* lisp/emacs-lisp/debug.el (debug): Don't hang upon error in initial-frame.
Diffstat (limited to 'lisp/emacs-lisp/debug.el')
-rw-r--r--lisp/emacs-lisp/debug.el28
1 files changed, 24 insertions, 4 deletions
diff --git a/lisp/emacs-lisp/debug.el b/lisp/emacs-lisp/debug.el
index f3a927f31cd..e8a3015b8fb 100644
--- a/lisp/emacs-lisp/debug.el
+++ b/lisp/emacs-lisp/debug.el
@@ -145,9 +145,29 @@ You may call with no args, or you may pass nil as the first arg and
any other args you like. In that case, the list of args after the
first will be printed into the backtrace buffer."
(interactive)
- (if inhibit-redisplay
- ;; Don't really try to enter debugger within an eval from redisplay.
- debugger-value
+ (cond
+ (inhibit-redisplay
+ ;; Don't really try to enter debugger within an eval from redisplay.
+ debugger-value)
+ ((and (eq t (framep (selected-frame)))
+ (equal "initial_terminal" (terminal-name)))
+ ;; We're in the initial-frame (where `message' just outputs to stdout) so
+ ;; there's no tty or GUI frame to display the backtrace and interact with
+ ;; it: just dump a backtrace to stdout.
+ ;; This happens for example while handling an error in code from
+ ;; early-init.el with --debug-init.
+ (message "Error: %S" args)
+ (let ((print-escape-newlines t)
+ (print-escape-control-characters t)
+ (print-level 8)
+ (print-length 50)
+ (skip t)) ;Skip the first frame (i.e. the `debug' frame)!
+ (mapbacktrace (lambda (_evald func args _flags)
+ (if skip
+ (setq skip nil)
+ (message " %S" (cons func args))))
+ 'debug)))
+ (t
(unless noninteractive
(message "Entering debugger..."))
(let (debugger-value
@@ -272,7 +292,7 @@ first will be printed into the backtrace buffer."
(with-timeout-unsuspend debugger-with-timeout-suspend)
(set-match-data debugger-outer-match-data)))
(setq debug-on-next-call debugger-step-after-exit)
- debugger-value)))
+ debugger-value))))
(defun debugger--print (obj &optional stream)
(condition-case err