From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: monnier@iro.umontreal.ca, larsi@gnus.org, emacs-devel@gnu.org
Subject: Re: Redisplay hook error backtraces
Date: Fri, 15 Jul 2022 18:18:14 +0000 [thread overview]
Message-ID: <YtGvZqw0z96tM0ZQ@ACM> (raw)
In-Reply-To: <83tu7isz4w.fsf@gnu.org>
Hello, everybody.
I know that there are technical issues in the code still to be thrashed
out, but the new backtrace facility needs documentation. I've written
some and a proposed patch (for debugging.texi and NEWS) is below.
I've come to see that `backtrace-on-redisplay-lisp-error', although
accurate, is too much of a mouthful, and I think it needs shortening.
Would anybody object to me just calling this variable `debug-redisplay'?
Also, I think that writing the backtrace into *Backtrace* is a bad idea,
now. Users expect such a buffer to have active facilities, whereas the
new backtrace is just a dead dump. Is there any objection to me instead
calling the buffer something like "*Redisplay-trace*"?
diff --git a/doc/lispref/debugging.texi b/doc/lispref/debugging.texi
index 058c931954..3f9c9fea50 100644
--- a/doc/lispref/debugging.texi
+++ b/doc/lispref/debugging.texi
@@ -77,6 +77,7 @@ Debugger
@menu
* Error Debugging:: Entering the debugger when an error happens.
+* Debugging Redisplay:: Getting backtraces from redisplay hook errors.
* Infinite Loops:: Stopping and debugging a program that doesn't exit.
* Function Debugging:: Entering it when a certain function is called.
* Variable Debugging:: Entering it when a variable is modified.
@@ -105,6 +106,10 @@ Error Debugging
(The command @code{toggle-debug-on-error} provides an easy way to do
this.)
+Note that, for technical reasons, you cannot use the facilities
+defined in this subsection to debug errors in hooks the redisplay code
+has invoked. @xref{Debugging Redisplay} for help with these.
+
@defopt debug-on-error
This variable determines whether the debugger is called when an error
is signaled and not handled. If @code{debug-on-error} is @code{t},
@@ -213,6 +218,52 @@ Error Debugging
bypasses the @code{condition-case} which normally catches errors in the
init file.
+@node Debugging Redisplay
+@subsection Debugging Redisplay Hooks
+@cindex redisplay hooks
+@cindex debugging redisplay hooks
+
+When a Lisp error occurs in a hook function which redisplay has
+invoked, you cannot use Emacs's usual debugging mechanisms, for
+technical reasons. This subsection describes how to get a backtrace
+from such an error, information which should be helpful in debugging
+it.
+
+Note that if you have had such an error, the error handling will
+likely have removed the function causing it from its hook. You will
+thus need to reinitialize that hook somehow, perhaps with
+@code{add-hook}, to be able to replay the bug.
+
+The hooks which these directions apply to are the following:
+@enumerate
+@item
+@code{fontification-functions} (@pxref{Auto Faces}).
+@item
+@code{set-message-function} (@pxref{Displaying Messages}).
+@item
+@code{clear-message-function} (@pxref{Displaying Messages}).
+@item
+@code{pre-redisplay-function} (@pxref{Forcing Redisplay}).
+@item
+@code{pre-redisplay-functions} (@pxref{Forcing Redisplay}).
+@item
+@code{menu-bar-update-hook} (@pxref{Menu Bar}).
+@item
+@code{window-scroll-functions} (@pxref{Window Hooks}).
+@end enumerate
+
+To generate a backtrace in these circumstances, set the variable
+@code{backtrace-on-redisplay-lisp-error} to non-@code{nil}. When the
+error occurs, Emacs will dump the backtrace to the buffer
+@file{*Backtrace*}. This buffer is not automatically displayed in a
+window; you will need to display it yourself, with a command such as
+@code{switch-to-buffer-other-frame} (@key{C-x 5 b}).
+
+@defvar backtrace-on-redisplay-lisp-error
+Set this variable to non-@code{nil} to enable the generation of a
+backtrace when errors occur in any of the above hooks.
+@end defvar
+
@node Infinite Loops
@subsection Debugging Infinite Loops
@cindex infinite loops
diff --git a/etc/NEWS b/etc/NEWS
index c2900b0bc4..0196d55306 100644
--- a/etc/NEWS
+++ b/etc/NEWS
@@ -1227,6 +1227,13 @@ When invoked with a non-zero prefix argument, as in 'C-u C-x C-e',
this command will pop up a new buffer and show the full pretty-printed
value there.
++++
+*** It is now possible to generate a backtrace from errors in redisplay
+hooks. To do this, set the new variable
+'backtrace-on-redisplay-lisp-error' to a non-nil value. The backtrace
+will be written to buffer *Backtrace*, but this buffer will not be
+automatically displayed in a window.
+
** Compile
+++
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2022-07-15 18:18 UTC|newest]
Thread overview: 54+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-06-25 13:42 Why is it so difficult to get a Lisp backtrace? Alan Mackenzie
2022-06-25 15:26 ` Alan Mackenzie
2022-06-25 15:30 ` Stefan Kangas
2022-06-25 15:52 ` Alan Mackenzie
2022-06-25 16:27 ` Stefan Kangas
2022-06-25 15:35 ` Lars Ingebrigtsen
2022-06-25 15:59 ` Alan Mackenzie
2022-06-25 16:51 ` Eli Zaretskii
2022-06-25 19:45 ` Alan Mackenzie
2022-06-26 5:20 ` Eli Zaretskii
2022-06-27 19:48 ` Fontification error backtrace [Was: Why is it so difficult to get a Lisp backtrace?] Alan Mackenzie
2022-06-28 11:43 ` Lars Ingebrigtsen
2022-06-28 11:57 ` Eli Zaretskii
2022-06-28 17:28 ` Alan Mackenzie
2022-06-28 18:17 ` Eli Zaretskii
2022-06-28 19:31 ` Alan Mackenzie
2022-06-29 19:00 ` Eli Zaretskii
2022-07-12 19:48 ` Redisplay hook error bactraces [Was: Fontification error backtrace] Alan Mackenzie
2022-07-13 12:33 ` Eli Zaretskii
2022-07-13 18:41 ` Redisplay hook error backtraces Alan Mackenzie
2022-07-13 19:00 ` Eli Zaretskii
2022-07-13 20:12 ` Alan Mackenzie
2022-07-13 20:49 ` Stefan Monnier
2022-07-14 5:12 ` Eli Zaretskii
2022-07-14 9:01 ` Alan Mackenzie
2022-07-14 9:10 ` Eli Zaretskii
2022-07-14 13:42 ` Alan Mackenzie
2022-07-14 13:59 ` Eli Zaretskii
2022-07-14 16:07 ` Alan Mackenzie
2022-07-14 16:18 ` Stefan Monnier
2022-07-14 19:47 ` Alan Mackenzie
2022-07-14 20:48 ` Stefan Monnier
2022-07-15 5:50 ` Eli Zaretskii
2022-07-15 18:18 ` Alan Mackenzie [this message]
2022-07-16 6:03 ` Eli Zaretskii
2022-07-14 17:09 ` Eli Zaretskii
2022-07-14 19:33 ` Alan Mackenzie
2022-07-16 6:12 ` Eli Zaretskii
2022-07-16 15:45 ` Alan Mackenzie
2022-07-13 19:13 ` Redisplay hook error bactraces [Was: Fontification error backtrace] Stefan Monnier
2022-07-13 19:24 ` Eli Zaretskii
2022-07-13 19:58 ` Alan Mackenzie
2022-07-13 20:45 ` Stefan Monnier
2022-06-30 20:34 ` Fontification error backtrace [Was: Why is it so difficult to get a Lisp backtrace?] Stefan Monnier
2022-07-01 5:39 ` Eli Zaretskii
2022-07-01 15:34 ` Juri Linkov
2022-07-01 16:04 ` Eli Zaretskii
2022-07-01 19:14 ` Juri Linkov
2022-07-01 19:26 ` Stefan Monnier
2022-07-02 5:53 ` Eli Zaretskii
2022-07-02 21:15 ` Stefan Monnier
2022-07-02 20:27 ` Alan Mackenzie
2022-07-02 21:12 ` Stefan Monnier
2022-06-26 8:45 ` Why is it so difficult to get a Lisp backtrace? Stefan Monnier
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YtGvZqw0z96tM0ZQ@ACM \
--to=acm@muc.de \
--cc=eliz@gnu.org \
--cc=emacs-devel@gnu.org \
--cc=larsi@gnus.org \
--cc=monnier@iro.umontreal.ca \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
Code repositories for project(s) associated with this external index
https://git.savannah.gnu.org/cgit/emacs.git
https://git.savannah.gnu.org/cgit/emacs/org-mode.git
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.