From: Alan Mackenzie <acm@muc.de>
To: Eli Zaretskii <eliz@gnu.org>
Cc: 48337@debbugs.gnu.org, "Alex Bennée" <alex.bennee@linaro.org>
Subject: bug#48337: Fwd: 28.0.50; Emacs crashing randomly (possibly minibuffer activity related)
Date: Tue, 11 May 2021 19:45:23 +0000 [thread overview]
Message-ID: <YJre0ymtvLLrPrD4@ACM> (raw)
In-Reply-To: <83zgx14cal.fsf@gnu.org>
Hello, Eli.
On Tue, May 11, 2021 at 16:42:26 +0300, Eli Zaretskii wrote:
> > From: Alex Bennée <alex.bennee@linaro.org>
> > Date: Tue, 11 May 2021 13:54:02 +0100
> > Cc: 48337@debbugs.gnu.org, Alan Mackenzie <acm@muc.de>
> > (gdb) pp Vminibuffer_list
> > (#<buffer *Minibuf-0*> #<buffer *Minibuf-1*>)
> Thanks.
> Alan, the code in nth_minibuffer and its callers is unsafe. First,
> Fnthcdr can return nil, and then XCAR of that in nth_minibuffer
> crashes. I fixed that now on the master branch, ....
That Fnthcdr call "can't possibly" return nil, unless there's a bug
somewhere. Clearly there's a bug somewhere, and the fact it triggered
an abort is a good thing, since it should enable us to find that bug
more easily.
nth_minibuffer is called only with argument DEPTH set to 0 or
minibuf_level. minibuf_level is initialised to 0 and thereafter only
altered at exactly 2 places, a minibuf_level++ when entering a new MB,
and minibuf_level-- when exiting it.
Vminibuffer_list, the list of minibuffers, is extended by one element
when a new minibuffer level is entered for the first time. This is done
by function get_minibuffer. Once *Minibuf-2* has been created, it is
reused every time a recursive MB call at that level happens, and it is
never garbage collected.
My hypothesis at the moment is that minibuf_level++ has happened
(setting its value to 2), but get_minibuffer(2) hasn't happened yet, so
VMinibuffer_list is only 2 elements long, ( *Minibuf-0* *Minibuf-1*).
Something is trying to call nth_minibuffer (minibuf_level) in that
inconsistent state. There is a window of ~115 lines of code in
read_minibuf where that could happen.
However, Alex's dump doesn't say what the current positionn in
read_minibuf is. Instead it says "lisp.h:1008", which is unhelpful in
the extreme. Why does GDB have to be so "clever"? Is there any way to
stop GDB doing this and make it report the actual position in the prime
source code as well as the position in some inline function?
I'm going to write to Alex asking him to provide more details - his
posts are lacking a lisp backtrace, a recipe, and so much needed
information is <optimized out>. Why does GDB fail to display this
information? Surely it should know what processor registers the
arguments and local variables are stored in, and where in the stack
frame they have been pushed?
> .... but there're more problems: some the callers of nth_minibuffer
> don't seem to be protected from it returning nil. For example, we
> have this in read_minibuf_unwind:
> Fset_buffer (nth_minibuffer (minibuf_level));
This, I think, can be justified - if read_minibuf_unwind can't find the
minibuffer it's unwinding, we've got a serious problem and ought to
abort Emacs ASAP. Should that, perhaps, be an explicit assert?
> and this in minibuffer_unwind:
> set_window_buffer (window, nth_minibuffer (0), 0, 0);
This is similar: If we're unwinding a minibuffer call, *Minibuf-0* is
"bound" to exist. Perhaps there should be an explicit assert here, too?
> In other cases you compare windows' buffers [EZ's textual correction
> incorporated] with nil, which can never be true, so a preliminary test
> for nil would be nice to avoid a loop that can never find anything
> useful.
> Please make this code more robust.
OK. I will do this.
> Thanks.
--
Alan Mackenzie (Nuremberg, Germany).
next prev parent reply other threads:[~2021-05-11 19:45 UTC|newest]
Thread overview: 30+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <87tunasd2u.fsf@linaro.org>
2021-05-10 19:30 ` bug#48337: Fwd: 28.0.50; Emacs crashing randomly (possibly minibuffer activity related) Alex Bennée
2021-05-10 19:34 ` bug#48337: Alex Bennée
2021-05-11 2:24 ` bug#48337: Fwd: 28.0.50; Emacs crashing randomly (possibly minibuffer activity related) Eli Zaretskii
2021-05-11 6:51 ` Alex Bennée
2021-05-11 8:23 ` Alex Bennée
2021-05-11 8:54 ` Alex Bennée
2021-05-11 12:21 ` Eli Zaretskii
2021-05-11 12:54 ` Alex Bennée
2021-05-11 13:42 ` Eli Zaretskii
2021-05-11 13:47 ` Eli Zaretskii
2021-05-11 19:45 ` Alan Mackenzie [this message]
2021-05-11 19:55 ` Eli Zaretskii
2021-05-12 18:54 ` Alan Mackenzie
2021-05-13 7:54 ` martin rudalics
2021-05-13 9:52 ` Alan Mackenzie
2021-05-13 11:54 ` Alan Mackenzie
2021-05-13 12:09 ` Alan Mackenzie
2021-05-14 15:20 ` Gregory Heytings
2021-05-14 16:05 ` Eli Zaretskii
2021-05-14 17:31 ` Gregory Heytings
2021-05-14 18:19 ` Eli Zaretskii
2021-05-15 9:45 ` Gregory Heytings
2021-05-11 20:14 ` Alan Mackenzie
2021-05-11 22:07 ` Alex Bennée
2021-05-14 16:31 ` Alan Mackenzie
2021-05-14 16:52 ` Alex Bennée
2021-05-14 18:40 ` Alan Mackenzie
2021-05-14 22:35 ` Alex Bennée
2021-05-15 12:00 ` Alan Mackenzie
2021-05-16 14:24 ` Alan Mackenzie
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
List information: https://www.gnu.org/software/emacs/
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=YJre0ymtvLLrPrD4@ACM \
--to=acm@muc.de \
--cc=48337@debbugs.gnu.org \
--cc=alex.bennee@linaro.org \
--cc=eliz@gnu.org \
/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 public inbox
https://git.savannah.gnu.org/cgit/emacs.git
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).