unofficial mirror of bug-gnu-emacs@gnu.org 
 help / color / mirror / code / Atom feed
* bug#71929: 30.0.60; crash in mark_image_cache
@ 2024-07-04  2:33 Sean Whitton
  2024-07-04  2:44 ` Sean Whitton
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-04  2:33 UTC (permalink / raw)
  To: 71929

My pgtk Emacs keeps crashing.  This time I think I caught it.
I see there was a recent commit to code around here; if this backtrace
is not sufficient, I can try bisecting, but I cannot currently reproduce
the crash reliably.

Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
0x00005555557a2c51 in mark_image_cache (c=0x55555729fc70) at image.c:3775
3775		if (c->images[i])
(gdb)

  0 in mark_image_cache of image.c:3775
  1 in mark_frame of alloc.c:7063
  2 in process_mark_stack of alloc.c:7303
  3 in mark_object of alloc.c:7504
  4 in mark_char_table of alloc.c:6920
  5 in mark_char_table of alloc.c:6917
  6 in process_mark_stack of alloc.c:7341
  7 in mark_object of alloc.c:7504
  8 in mark_char_table of alloc.c:6920
  9 in mark_char_table of alloc.c:6917
 10 in process_mark_stack of alloc.c:7341
 11 in mark_object of alloc.c:7504
 12 in mark_char_table of alloc.c:6920
 13 in mark_char_table of alloc.c:6917
 14 in process_mark_stack of alloc.c:7341
 15 in mark_object of alloc.c:7504
 16 in mark_interval_tree_1 of alloc.c:1529
 17 in traverse_intervals_noorder of intervals.c:243
 18 in mark_interval_tree of alloc.c:1538
 19 in process_mark_stack of alloc.c:7264
 20 in mark_object of alloc.c:7504
 21 in mark_interval_tree_1 of alloc.c:1529
 22 in traverse_intervals_noorder of intervals.c:243
 23 in traverse_intervals_noorder of intervals.c:248
 24 in traverse_intervals_noorder of intervals.c:248
 25 in traverse_intervals_noorder of intervals.c:248
 26 in traverse_intervals_noorder of intervals.c:248
 27 in mark_interval_tree of alloc.c:1538
 28 in mark_buffer of alloc.c:6958
 29 in process_mark_stack of alloc.c:7299
 30 in mark_object of alloc.c:7504
 31 in mark_interval_tree_1 of alloc.c:1529
 32 in traverse_intervals_noorder of intervals.c:243
 33 in mark_interval_tree of alloc.c:1538
 34 in process_mark_stack of alloc.c:7264
 35 in mark_objects of alloc.c:7512
 36 in mark_vectorlike of alloc.c:6891
 37 in mark_buffer of alloc.c:6954
 38 in process_mark_stack of alloc.c:7299
 39 in mark_object of alloc.c:7504
 40 in mark_discard_killed_buffers of alloc.c:7020
 41 in mark_window of alloc.c:7087
 42 in process_mark_stack of alloc.c:7307
 43 in mark_objects of alloc.c:7512
 44 in mark_vectorlike of alloc.c:6891
 45 in mark_window of alloc.c:7072
 46 in process_mark_stack of alloc.c:7307
 47 in mark_objects of alloc.c:7512
 48 in mark_vectorlike of alloc.c:6891
 49 in mark_frame of alloc.c:7037
 50 in process_mark_stack of alloc.c:7303
 51 in mark_objects of alloc.c:7512
 52 in mark_vectorlike of alloc.c:6891
 53 in mark_window of alloc.c:7072
 54 in process_mark_stack of alloc.c:7307
 55 in mark_object of alloc.c:7504
 56 in mark_char_table of alloc.c:6920
 57 in mark_char_table of alloc.c:6917
 58 in process_mark_stack of alloc.c:7341
 59 in mark_objects of alloc.c:7512
 60 in mark_vectorlike of alloc.c:6891
 61 in mark_buffer of alloc.c:6954
 62 in process_mark_stack of alloc.c:7299
 63 in mark_objects of alloc.c:7512
 64 in mark_vectorlike of alloc.c:6891
 65 in mark_buffer of alloc.c:6954
 66 in process_mark_stack of alloc.c:7299
 67 in mark_objects of alloc.c:7512
 68 in mark_vectorlike of alloc.c:6891
 69 in mark_buffer of alloc.c:6954
 70 in process_mark_stack of alloc.c:7299
 71 in mark_objects of alloc.c:7512
 72 in mark_vectorlike of alloc.c:6891
 73 in mark_buffer of alloc.c:6954
 74 in process_mark_stack of alloc.c:7299
 75 in mark_object of alloc.c:7504
 76 in mark_char_table of alloc.c:6920
 77 in mark_char_table of alloc.c:6917
 78 in process_mark_stack of alloc.c:7341
 79 in mark_object of alloc.c:7504
 80 in mark_char_table of alloc.c:6920
 81 in mark_char_table of alloc.c:6917
 82 in process_mark_stack of alloc.c:7341
 83 in mark_objects of alloc.c:7512
 84 in mark_vectorlike of alloc.c:6891
 85 in mark_buffer of alloc.c:6954
 86 in process_mark_stack of alloc.c:7299
 87 in mark_object of alloc.c:7504
 88 in mark_char_table of alloc.c:6920
 89 in mark_char_table of alloc.c:6917
 90 in process_mark_stack of alloc.c:7341
 91 in mark_objects of alloc.c:7512
 92 in mark_vectorlike of alloc.c:6891
 93 in mark_buffer of alloc.c:6954
 94 in process_mark_stack of alloc.c:7299
 95 in mark_objects of alloc.c:7512
 96 in mark_vectorlike of alloc.c:6891
 97 in mark_buffer of alloc.c:6954
 98 in process_mark_stack of alloc.c:7299
 99 in mark_objects of alloc.c:7512
100 in mark_vectorlike of alloc.c:6891
101 in mark_buffer of alloc.c:6954
102 in process_mark_stack of alloc.c:7299
103 in mark_objects of alloc.c:7512
104 in mark_vectorlike of alloc.c:6891
105 in mark_buffer of alloc.c:6954
106 in process_mark_stack of alloc.c:7299
107 in mark_object of alloc.c:7504
108 in mark_char_table of alloc.c:6920
109 in process_mark_stack of alloc.c:7341
110 in mark_object of alloc.c:7504
111 in mark_char_table of alloc.c:6920
112 in process_mark_stack of alloc.c:7341
113 in mark_object of alloc.c:7504
114 in mark_char_table of alloc.c:6920
115 in process_mark_stack of alloc.c:7341
116 in mark_object of alloc.c:7504
117 in mark_char_table of alloc.c:6920
118 in process_mark_stack of alloc.c:7341
119 in mark_objects of alloc.c:7512
120 in mark_vectorlike of alloc.c:6891
121 in mark_buffer of alloc.c:6954
122 in process_mark_stack of alloc.c:7299
123 in mark_objects of alloc.c:7512
124 in mark_vectorlike of alloc.c:6891
125 in mark_buffer of alloc.c:6954
126 in process_mark_stack of alloc.c:7299
127 in mark_objects of alloc.c:7512
128 in mark_vectorlike of alloc.c:6891
129 in mark_buffer of alloc.c:6954
130 in process_mark_stack of alloc.c:7299
131 in mark_objects of alloc.c:7512
132 in mark_vectorlike of alloc.c:6891
133 in mark_buffer of alloc.c:6954
134 in process_mark_stack of alloc.c:7299
135 in mark_objects of alloc.c:7512
136 in mark_vectorlike of alloc.c:6891
137 in mark_buffer of alloc.c:6954
138 in process_mark_stack of alloc.c:7299
139 in mark_objects of alloc.c:7512
140 in mark_vectorlike of alloc.c:6891
141 in mark_buffer of alloc.c:6954
142 in process_mark_stack of alloc.c:7299
143 in mark_objects of alloc.c:7512
144 in mark_vectorlike of alloc.c:6891
145 in mark_buffer of alloc.c:6954
146 in process_mark_stack of alloc.c:7299
147 in mark_objects of alloc.c:7512
148 in mark_vectorlike of alloc.c:6891
149 in mark_buffer of alloc.c:6954
150 in process_mark_stack of alloc.c:7299
151 in mark_object of alloc.c:7504
152 in mark_object_root_visitor of alloc.c:6396
153 in visit_vectorlike_root of alloc.c:6348
154 in visit_buffer_root of alloc.c:6362
155 in visit_static_gc_roots of alloc.c:6374
156 in garbage_collect of alloc.c:6598
157 in maybe_garbage_collect of alloc.c:6507
158 in maybe_gc of /home/spwhitton/src/emacs/primary/src/lisp.h:5929
159 in Ffuncall of eval.c:3088
160 in read_char of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
161 in read_key_sequence of keyboard.c:10743
162 in command_loop_1 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
163 in internal_condition_case of eval.c:1613
164 in command_loop_2 of keyboard.c:1168
165 in internal_catch of eval.c:1292
166 in command_loop of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
167 in recursive_edit_1 of keyboard.c:754
168 in Frecursive_edit of keyboard.c:837
169 in main of emacs.c:2631

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  2:33 bug#71929: 30.0.60; crash in mark_image_cache Sean Whitton
@ 2024-07-04  2:44 ` Sean Whitton
  2024-07-04  5:53   ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-04  2:44 UTC (permalink / raw)
  To: 71929

Hello,

On Thu 04 Jul 2024 at 10:33am +08, Sean Whitton wrote:

> My pgtk Emacs keeps crashing.  This time I think I caught it.
> I see there was a recent commit to code around here; if this backtrace
> is not sufficient, I can try bisecting, but I cannot currently reproduce
> the crash reliably.
>
> Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
> 0x00005555557a2c51 in mark_image_cache (c=0x55555729fc70) at image.c:3775
> 3775		if (c->images[i])
> (gdb)

... and i was 0, i.e. it crashes on the first iteration.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  2:44 ` Sean Whitton
@ 2024-07-04  5:53   ` Eli Zaretskii
  2024-07-04  6:03     ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-04  5:53 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929

> From: Sean Whitton <spwhitton@spwhitton.name>
> Date: Thu, 04 Jul 2024 10:44:04 +0800
> 
> Hello,
> 
> On Thu 04 Jul 2024 at 10:33am +08, Sean Whitton wrote:
> 
> > My pgtk Emacs keeps crashing.  This time I think I caught it.
> > I see there was a recent commit to code around here; if this backtrace
> > is not sufficient, I can try bisecting, but I cannot currently reproduce
> > the crash reliably.
> >
> > Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
> > 0x00005555557a2c51 in mark_image_cache (c=0x55555729fc70) at image.c:3775
> > 3775		if (c->images[i])
> > (gdb)
> 
> ... and i was 0, i.e. it crashes on the first iteration.

What is the value of c->images?  IOW, why did this line segfault?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  5:53   ` Eli Zaretskii
@ 2024-07-04  6:03     ` Eli Zaretskii
  2024-07-04  6:17       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-05  0:13       ` Sean Whitton
  0 siblings, 2 replies; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-04  6:03 UTC (permalink / raw)
  To: spwhitton; +Cc: Po Lu, 71929

> Cc: 71929@debbugs.gnu.org
> Date: Thu, 04 Jul 2024 08:53:41 +0300
> From: Eli Zaretskii <eliz@gnu.org>
> 
> > From: Sean Whitton <spwhitton@spwhitton.name>
> > Date: Thu, 04 Jul 2024 10:44:04 +0800
> > 
> > Hello,
> > 
> > On Thu 04 Jul 2024 at 10:33am +08, Sean Whitton wrote:
> > 
> > > My pgtk Emacs keeps crashing.  This time I think I caught it.
> > > I see there was a recent commit to code around here; if this backtrace
> > > is not sufficient, I can try bisecting, but I cannot currently reproduce
> > > the crash reliably.
> > >
> > > Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
> > > 0x00005555557a2c51 in mark_image_cache (c=0x55555729fc70) at image.c:3775
> > > 3775		if (c->images[i])
> > > (gdb)
> > 
> > ... and i was 0, i.e. it crashes on the first iteration.
> 
> What is the value of c->images?  IOW, why did this line segfault?

Also, what is the value of c->refcount?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  6:03     ` Eli Zaretskii
@ 2024-07-04  6:17       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-04  6:42         ` Sean Whitton
  2024-07-05  0:13       ` Sean Whitton
  1 sibling, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-04  6:17 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 71929, spwhitton

Eli Zaretskii <eliz@gnu.org> writes:

>> Cc: 71929@debbugs.gnu.org
>> Date: Thu, 04 Jul 2024 08:53:41 +0300
>> From: Eli Zaretskii <eliz@gnu.org>
>> 
>> > From: Sean Whitton <spwhitton@spwhitton.name>
>> > Date: Thu, 04 Jul 2024 10:44:04 +0800
>> > 
>> > Hello,
>> > 
>> > On Thu 04 Jul 2024 at 10:33am +08, Sean Whitton wrote:
>> > 
>> > > My pgtk Emacs keeps crashing.  This time I think I caught it.
>> > > I see there was a recent commit to code around here; if this backtrace
>> > > is not sufficient, I can try bisecting, but I cannot currently reproduce
>> > > the crash reliably.
>> > >
>> > > Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
>> > > 0x00005555557a2c51 in mark_image_cache (c=0x55555729fc70) at image.c:3775
>> > > 3775		if (c->images[i])
>> > > (gdb)
>> > 
>> > ... and i was 0, i.e. it crashes on the first iteration.
>> 
>> What is the value of c->images?  IOW, why did this line segfault?
>
> Also, what is the value of c->refcount?

Please answer these questions, yes.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  6:17       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-04  6:42         ` Sean Whitton
  2024-07-04  6:59           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-04  7:40           ` Eli Zaretskii
  0 siblings, 2 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-04  6:42 UTC (permalink / raw)
  To: Po Lu, Eli Zaretskii; +Cc: 71929

Hello,

On Thu 04 Jul 2024 at 02:17pm +08, Po Lu wrote:

>>> What is the value of c->images?  IOW, why did this line segfault?
>>
>> Also, what is the value of c->refcount?
>
> Please answer these questions, yes.

I don't know, but I will see if I can get information about these next
time I observe the crash.

I struggle to keep the Emacs instance running gdb around very long
because it keeps crashing too :)

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  6:42         ` Sean Whitton
@ 2024-07-04  6:59           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-04  9:56             ` Sean Whitton
  2024-07-04  7:40           ` Eli Zaretskii
  1 sibling, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-04  6:59 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929, Eli Zaretskii

Sean Whitton <spwhitton@spwhitton.name> writes:

> I don't know, but I will see if I can get information about these next
> time I observe the crash.
>
> I struggle to keep the Emacs instance running gdb around very long
> because it keeps crashing too :)

What packages have you installed, and do they frequently create new
frames or adjust the font size of existing frames?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  6:42         ` Sean Whitton
  2024-07-04  6:59           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-04  7:40           ` Eli Zaretskii
  2024-07-04  9:57             ` Sean Whitton
  1 sibling, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-04  7:40 UTC (permalink / raw)
  To: Sean Whitton; +Cc: luangruo, 71929

> From: Sean Whitton <spwhitton@spwhitton.name>
> Cc: 71929@debbugs.gnu.org
> Date: Thu, 04 Jul 2024 14:42:01 +0800
> 
> Hello,
> 
> On Thu 04 Jul 2024 at 02:17pm +08, Po Lu wrote:
> 
> >>> What is the value of c->images?  IOW, why did this line segfault?
> >>
> >> Also, what is the value of c->refcount?
> >
> > Please answer these questions, yes.
> 
> I don't know, but I will see if I can get information about these next
> time I observe the crash.
> 
> I struggle to keep the Emacs instance running gdb around very long
> because it keeps crashing too :)

Do you mean GDB keeps crashing?

If you run GDB from Emacs, then try running it from the shell prompt
instead.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  6:59           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-04  9:56             ` Sean Whitton
  2024-07-04 12:28               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-04  9:56 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Thu 04 Jul 2024 at 02:59pm +08, Po Lu wrote:

> Sean Whitton <spwhitton@spwhitton.name> writes:
>
>> I don't know, but I will see if I can get information about these next
>> time I observe the crash.
>>
>> I struggle to keep the Emacs instance running gdb around very long
>> because it keeps crashing too :)
>
> What packages have you installed, and do they frequently create new
> frames or adjust the font size of existing frames?

The packages I have installed don't do that, but I have tonnes of custom
code in my init.el to create new frames and adjust font sizes.
I normally have >=three frames open for each of two instances of Emacs.

I have two entries in window-size-change-functions:

--8<---------------cut here---------------start------------->8---
(defun spw/maybe-scale-basic-faces (frame)
  "Entry for `window-size-change-functions' to increase font sizes,
relative to those set by the call to `custom-theme-set-faces' above, for
frames on wide monitors, except where doing so would itself prevent fitting
two 80-column windows side-by-side in the frame."
  (when (display-graphic-p frame)
   (let ((wide-monitor-p (> (cadddr (assoc 'geometry
					   (frame-monitor-attributes frame)))
			    1635)))
     (when (or wide-monitor-p
	       ;; Check whether a previous call made any changes we might need
	       ;; to undo if FRAME has moved to a smaller display.
	       (not (eq scroll-bar-mode
			(frame-parameter frame 'vertical-scroll-bars)))
	       (= (face-attribute 'default :height frame) 120)
	       (= (face-attribute 'variable-pitch :height frame) 151))
       (let* (;; Above 1635 you can scale up and still fit two 80-col windows.
	      ;; Below 1315 you can't fit the two windows even w/o scaling up.
	      (medium-p (> 1635 (frame-pixel-width frame) 1315))
	      (scale-up-p (and wide-monitor-p (not medium-p))))
	 (modify-frame-parameters
	  frame
	  `(;; Can fit two 80-col windows only if we disable scroll bars.
	    (vertical-scroll-bars . ,(and (not (and wide-monitor-p medium-p))
					  scroll-bar-mode))))
	 ;; Check Emacs found the relevant font on this window system, else
	 ;; our height values might be invalid.
	 (when (find-font (font-spec :foundry "SRC" :family "Hack") frame)
	   (set-face-attribute 'default frame
			       :height (if scale-up-p 120 105)))
	 (when (find-font (font-spec :foundry "bitstream"
				     :family "Bitstream Charter")
			  frame)
	   (set-face-attribute 'variable-pitch frame
			       :height (if scale-up-p 151 120))))))))
--8<---------------cut here---------------end--------------->8---

and

--8<---------------cut here---------------start------------->8---
(defun spw/maybe-toggle-split-after-resize (frame)
  (when (and (framep frame)
	     (frame-size-changed-p frame)
	     (= (count-windows nil frame) 2))
    (with-selected-frame frame
      (cl-labels ((toggleable-window-p (window)
		    (with-current-buffer (window-buffer window)
		      (not (derived-mode-p 'gnus-summary-mode))))
		  (window-info (window)
		    (and (toggleable-window-p window)
			 (cons (window-buffer window)
			       (cons (window-prev-buffers window)
				     (window-next-buffers window)))))
		  (set-window-info (window info)
		    (set-window-buffer window (car info))
		    (set-window-prev-buffers window (cadr info))
		    (set-window-next-buffers window (cddr info))))
	(when-let* ((this-info (window-info (selected-window)))
		    (next-info (window-info (next-window)))
		    (width (frame-width))
		    (this-edges (window-edges (selected-window)))
		    (next-edges (window-edges (next-window))))
	  (when (or (and (< width split-width-threshold)
			 (/= (car this-edges) (car next-edges)))
		    (and (>= width split-width-threshold)
			 (/= (cadr this-edges) (cadr next-edges))))
	    ;; Ensure we start with a fresh window.
	    (split-window)
	    (other-window 1)
	    (delete-other-windows)

	    (if (and (<= (car this-edges) (car next-edges))
		     (<= (cadr this-edges) (cadr next-edges)))
		;; Want to use `pop-to-buffer' for the second window s.t. my
		;; rule for REPLs in `display-buffer-alist' takes effect.
		(progn (set-window-info (selected-window) this-info)
		       (save-selected-window
			 (pop-to-buffer (car next-info))
			 (set-window-info (selected-window) next-info)))
	      (set-window-info (selected-window) next-info)
	      (pop-to-buffer (car this-info))
	      (set-window-info (selected-window) this-info))))))))
--8<---------------cut here---------------end--------------->8---

For completeness, though I doubt it is relevant, packages (installed
from Debian) are:

elpa-bongo
elpa-dash
elpa-debian-el
elpa-dpkg-dev-el
elpa-esxml
elpa-ggtags
elpa-git-annex
elpa-git-commit
elpa-git-modes
elpa-gitattributes-mode
elpa-gitconfig-mode
elpa-gitignore-mode
elpa-haskell-tab-indent
elpa-htmlize
elpa-ledger
elpa-magit
elpa-magit-section
elpa-mailscripts
elpa-markdown-mode
elpa-message-templ
elpa-notmuch
elpa-nov
elpa-org
elpa-org-contrib
elpa-org-d20
elpa-orgalist
elpa-paredit
elpa-pod-mode
elpa-rainbow-mode
elpa-s
elpa-seq
elpa-taxy
elpa-volume
elpa-with-editor
elpa-ws-butler
elpa-yasnippet
elpa-yasnippet-snippets

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  7:40           ` Eli Zaretskii
@ 2024-07-04  9:57             ` Sean Whitton
  2024-07-04 12:48               ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-04  9:57 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, 71929

Hello,

On Thu 04 Jul 2024 at 10:40am +03, Eli Zaretskii wrote:

>> From: Sean Whitton <spwhitton@spwhitton.name>
>> Cc: 71929@debbugs.gnu.org
>> Date: Thu, 04 Jul 2024 14:42:01 +0800
>>
>> Hello,
>>
>> On Thu 04 Jul 2024 at 02:17pm +08, Po Lu wrote:
>>
>> >>> What is the value of c->images?  IOW, why did this line segfault?
>> >>
>> >> Also, what is the value of c->refcount?
>> >
>> > Please answer these questions, yes.
>>
>> I don't know, but I will see if I can get information about these next
>> time I observe the crash.
>>
>> I struggle to keep the Emacs instance running gdb around very long
>> because it keeps crashing too :)
>
> Do you mean GDB keeps crashing?
>
> If you run GDB from Emacs,

The latter.

> then try running it from the shell prompt instead.

I have running Emacs-under-GDB-under-Emacs all scripted and integrated
into my desktop environment, but yes, if I have to, I can figure out
running it from a terminal instead.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  9:56             ` Sean Whitton
@ 2024-07-04 12:28               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-05  7:52                 ` Sean Whitton
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-04 12:28 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929, Eli Zaretskii

Sean Whitton <spwhitton@spwhitton.name> writes:

> Hello,
>
> On Thu 04 Jul 2024 at 02:59pm +08, Po Lu wrote:
>
>> Sean Whitton <spwhitton@spwhitton.name> writes:
>>
>>> I don't know, but I will see if I can get information about these next
>>> time I observe the crash.
>>>
>>> I struggle to keep the Emacs instance running gdb around very long
>>> because it keeps crashing too :)
>>
>> What packages have you installed, and do they frequently create new
>> frames or adjust the font size of existing frames?
>
> The packages I have installed don't do that, but I have tonnes of custom
> code in my init.el to create new frames and adjust font sizes.
> I normally have >=three frames open for each of two instances of Emacs.
>
> I have two entries in window-size-change-functions:
>
> (defun spw/maybe-scale-basic-faces (frame)
>   "Entry for `window-size-change-functions' to increase font sizes,
> relative to those set by the call to `custom-theme-set-faces' above, for
> frames on wide monitors, except where doing so would itself prevent fitting
> two 80-column windows side-by-side in the frame."
>   (when (display-graphic-p frame)
>    (let ((wide-monitor-p (> (cadddr (assoc 'geometry
> 					   (frame-monitor-attributes frame)))
> 			    1635)))
>      (when (or wide-monitor-p
> 	       ;; Check whether a previous call made any changes we might need
> 	       ;; to undo if FRAME has moved to a smaller display.
> 	       (not (eq scroll-bar-mode
> 			(frame-parameter frame 'vertical-scroll-bars)))
> 	       (= (face-attribute 'default :height frame) 120)
> 	       (= (face-attribute 'variable-pitch :height frame) 151))
>        (let* (;; Above 1635 you can scale up and still fit two 80-col windows.
> 	      ;; Below 1315 you can't fit the two windows even w/o scaling up.
> 	      (medium-p (> 1635 (frame-pixel-width frame) 1315))
> 	      (scale-up-p (and wide-monitor-p (not medium-p))))
> 	 (modify-frame-parameters
> 	  frame
> 	  `(;; Can fit two 80-col windows only if we disable scroll bars.
> 	    (vertical-scroll-bars . ,(and (not (and wide-monitor-p medium-p))
> 					  scroll-bar-mode))))
> 	 ;; Check Emacs found the relevant font on this window system, else
> 	 ;; our height values might be invalid.
> 	 (when (find-font (font-spec :foundry "SRC" :family "Hack") frame)
> 	   (set-face-attribute 'default frame
> 			       :height (if scale-up-p 120 105)))
> 	 (when (find-font (font-spec :foundry "bitstream"
> 				     :family "Bitstream Charter")
> 			  frame)
> 	   (set-face-attribute 'variable-pitch frame
> 			       :height (if scale-up-p 151 120))))))))
>
>
> and
>
> (defun spw/maybe-toggle-split-after-resize (frame)
>   (when (and (framep frame)
> 	     (frame-size-changed-p frame)
> 	     (= (count-windows nil frame) 2))
>     (with-selected-frame frame
>       (cl-labels ((toggleable-window-p (window)
> 		    (with-current-buffer (window-buffer window)
> 		      (not (derived-mode-p 'gnus-summary-mode))))
> 		  (window-info (window)
> 		    (and (toggleable-window-p window)
> 			 (cons (window-buffer window)
> 			       (cons (window-prev-buffers window)
> 				     (window-next-buffers window)))))
> 		  (set-window-info (window info)
> 		    (set-window-buffer window (car info))
> 		    (set-window-prev-buffers window (cadr info))
> 		    (set-window-next-buffers window (cddr info))))
> 	(when-let* ((this-info (window-info (selected-window)))
> 		    (next-info (window-info (next-window)))
> 		    (width (frame-width))
> 		    (this-edges (window-edges (selected-window)))
> 		    (next-edges (window-edges (next-window))))
> 	  (when (or (and (< width split-width-threshold)
> 			 (/= (car this-edges) (car next-edges)))
> 		    (and (>= width split-width-threshold)
> 			 (/= (cadr this-edges) (cadr next-edges))))
> 	    ;; Ensure we start with a fresh window.
> 	    (split-window)
> 	    (other-window 1)
> 	    (delete-other-windows)
>
> 	    (if (and (<= (car this-edges) (car next-edges))
> 		     (<= (cadr this-edges) (cadr next-edges)))
> 		;; Want to use `pop-to-buffer' for the second window s.t. my
> 		;; rule for REPLs in `display-buffer-alist' takes effect.
> 		(progn (set-window-info (selected-window) this-info)
> 		       (save-selected-window
> 			 (pop-to-buffer (car next-info))
> 			 (set-window-info (selected-window) next-info)))
> 	      (set-window-info (selected-window) next-info)
> 	      (pop-to-buffer (car this-info))
> 	      (set-window-info (selected-window) this-info))))))))
>
> For completeness, though I doubt it is relevant, packages (installed
> from Debian) are:
>
> elpa-bongo
> elpa-dash
> elpa-debian-el
> elpa-dpkg-dev-el
> elpa-esxml
> elpa-ggtags
> elpa-git-annex
> elpa-git-commit
> elpa-git-modes
> elpa-gitattributes-mode
> elpa-gitconfig-mode
> elpa-gitignore-mode
> elpa-haskell-tab-indent
> elpa-htmlize
> elpa-ledger
> elpa-magit
> elpa-magit-section
> elpa-mailscripts
> elpa-markdown-mode
> elpa-message-templ
> elpa-notmuch
> elpa-nov
> elpa-org
> elpa-org-contrib
> elpa-org-d20
> elpa-orgalist
> elpa-paredit
> elpa-pod-mode
> elpa-rainbow-mode
> elpa-s
> elpa-seq
> elpa-taxy
> elpa-volume
> elpa-with-editor
> elpa-ws-butler
> elpa-yasnippet
> elpa-yasnippet-snippets

Thanks.  It may be of assistance if you were to run an Emacs configured
`--enable-checking=yes,all' for a while and report whether any
assertions fail.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  9:57             ` Sean Whitton
@ 2024-07-04 12:48               ` Eli Zaretskii
  0 siblings, 0 replies; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-04 12:48 UTC (permalink / raw)
  To: Sean Whitton; +Cc: luangruo, 71929

> From: Sean Whitton <spwhitton@spwhitton.name>
> Cc: luangruo@yahoo.com,  71929@debbugs.gnu.org
> Date: Thu, 04 Jul 2024 17:57:48 +0800
> 
> > Do you mean GDB keeps crashing?
> >
> > If you run GDB from Emacs,
> 
> The latter.
> 
> > then try running it from the shell prompt instead.
> 
> I have running Emacs-under-GDB-under-Emacs all scripted and integrated
> into my desktop environment, but yes, if I have to, I can figure out
> running it from a terminal instead.

If Emacs keeps crashing, then running GDB from such an Emacs will
endanger your chances of collecting useful information.  If you have
older and more stable Emacs installed, try running GDB from that older
version.  Or from the shell prompt.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04  6:03     ` Eli Zaretskii
  2024-07-04  6:17       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-05  0:13       ` Sean Whitton
  2024-07-05  6:27         ` Eli Zaretskii
  1 sibling, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-05  0:13 UTC (permalink / raw)
  To: Eli Zaretskii, Po Lu; +Cc: 71929

Hello,

On Thu 04 Jul 2024 at 09:03am +03, Eli Zaretskii wrote:

>> What is the value of c->images?  IOW, why did this line segfault?
>
> Also, what is the value of c->refcount?

(gdb) p c
$1 = (struct image_cache *) 0x555557c89e20
(gdb) xpr
There is no member named i.

(gdb) p c->images
$2 = (struct image **) 0x35
(gdb) xpr
Cannot access memory at address 0x35

(gdb) p c->refcount
$4 = 93823560581177

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05  0:13       ` Sean Whitton
@ 2024-07-05  6:27         ` Eli Zaretskii
  2024-07-05  6:41           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-05  6:27 UTC (permalink / raw)
  To: Sean Whitton; +Cc: luangruo, 71929

> From: Sean Whitton <spwhitton@spwhitton.name>
> Cc: 71929@debbugs.gnu.org
> Date: Fri, 05 Jul 2024 08:13:14 +0800
> 
> Hello,
> 
> On Thu 04 Jul 2024 at 09:03am +03, Eli Zaretskii wrote:
> 
> >> What is the value of c->images?  IOW, why did this line segfault?
> >
> > Also, what is the value of c->refcount?
> 
> (gdb) p c
> $1 = (struct image_cache *) 0x555557c89e20
> (gdb) xpr
> There is no member named i.
> 
> (gdb) p c->images
> $2 = (struct image **) 0x35
> (gdb) xpr
> Cannot access memory at address 0x35
> 
> (gdb) p c->refcount
> $4 = 93823560581177

So it's garbled.

Po Lu, how do we handle the "shared" image cache when a frame is
deleted?  Where's the code which frees the cache if the cache's
refcount is one when the frame is deleted?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05  6:27         ` Eli Zaretskii
@ 2024-07-05  6:41           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-05  7:37             ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-05  6:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 71929, Sean Whitton

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Sean Whitton <spwhitton@spwhitton.name>
>> Cc: 71929@debbugs.gnu.org
>> Date: Fri, 05 Jul 2024 08:13:14 +0800
>> 
>> Hello,
>> 
>> On Thu 04 Jul 2024 at 09:03am +03, Eli Zaretskii wrote:
>> 
>> >> What is the value of c->images?  IOW, why did this line segfault?
>> >
>> > Also, what is the value of c->refcount?
>> 
>> (gdb) p c
>> $1 = (struct image_cache *) 0x555557c89e20
>> (gdb) xpr
>> There is no member named i.
>> 
>> (gdb) p c->images
>> $2 = (struct image **) 0x35
>> (gdb) xpr
>> Cannot access memory at address 0x35
>> 
>> (gdb) p c->refcount
>> $4 = 93823560581177
>
> So it's garbled.
>
> Po Lu, how do we handle the "shared" image cache when a frame is
> deleted?  Where's the code which frees the cache if the cache's
> refcount is one when the frame is deleted?

There's only one caller of free_image_cache, free_frame_faces, which is
only called once in a frame's existence.  Cache refcounts are also
altered from gui_set_font, but this process never entails decrementing a
refcount to zero, as the caches under consideration are always retained
by one or more frames:

  iwidth = max (10, FRAME_COLUMN_WIDTH (f));
  if (FRAME_IMAGE_CACHE (f)
      && (iwidth != FRAME_IMAGE_CACHE (f)->scaling_col_width))
    {
      eassert (FRAME_IMAGE_CACHE (f)->refcount >= 1);
      if (FRAME_IMAGE_CACHE (f)->refcount == 1)
	{
	  /* This frame is the only user of this image cache.  */
	  FRAME_IMAGE_CACHE (f)->scaling_col_width = iwidth;
	  /* Clean F's image cache of images whose values are derived
	     from the font width.  */
	  clear_image_cache (f, Qauto);
	}
      else
	{
	  /* Release the current image cache, and reuse or allocate a
	     new image cache with IWIDTH.  */
	  FRAME_IMAGE_CACHE (f)->refcount--;
	  FRAME_IMAGE_CACHE (f) = share_image_cache (f);
	  FRAME_IMAGE_CACHE (f)->refcount++;
	}
    }





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05  6:41           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-05  7:37             ` Eli Zaretskii
  2024-07-05  9:36               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-05  7:37 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, spwhitton

> From: Po Lu <luangruo@yahoo.com>
> Cc: Sean Whitton <spwhitton@spwhitton.name>,  71929@debbugs.gnu.org
> Date: Fri, 05 Jul 2024 14:41:31 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> From: Sean Whitton <spwhitton@spwhitton.name>
> >> Cc: 71929@debbugs.gnu.org
> >> Date: Fri, 05 Jul 2024 08:13:14 +0800
> >> 
> >> Hello,
> >> 
> >> On Thu 04 Jul 2024 at 09:03am +03, Eli Zaretskii wrote:
> >> 
> >> >> What is the value of c->images?  IOW, why did this line segfault?
> >> >
> >> > Also, what is the value of c->refcount?
> >> 
> >> (gdb) p c
> >> $1 = (struct image_cache *) 0x555557c89e20
> >> (gdb) xpr
> >> There is no member named i.
> >> 
> >> (gdb) p c->images
> >> $2 = (struct image **) 0x35
> >> (gdb) xpr
> >> Cannot access memory at address 0x35
> >> 
> >> (gdb) p c->refcount
> >> $4 = 93823560581177
> >
> > So it's garbled.
> >
> > Po Lu, how do we handle the "shared" image cache when a frame is
> > deleted?  Where's the code which frees the cache if the cache's
> > refcount is one when the frame is deleted?
> 
> There's only one caller of free_image_cache, free_frame_faces, which is
> only called once in a frame's existence.  Cache refcounts are also
> altered from gui_set_font, but this process never entails decrementing a
> refcount to zero, as the caches under consideration are always retained
> by one or more frames:
> 
>   iwidth = max (10, FRAME_COLUMN_WIDTH (f));
>   if (FRAME_IMAGE_CACHE (f)
>       && (iwidth != FRAME_IMAGE_CACHE (f)->scaling_col_width))
>     {
>       eassert (FRAME_IMAGE_CACHE (f)->refcount >= 1);
>       if (FRAME_IMAGE_CACHE (f)->refcount == 1)
> 	{
> 	  /* This frame is the only user of this image cache.  */
> 	  FRAME_IMAGE_CACHE (f)->scaling_col_width = iwidth;
> 	  /* Clean F's image cache of images whose values are derived
> 	     from the font width.  */
> 	  clear_image_cache (f, Qauto);
> 	}
>       else
> 	{
> 	  /* Release the current image cache, and reuse or allocate a
> 	     new image cache with IWIDTH.  */
> 	  FRAME_IMAGE_CACHE (f)->refcount--;
> 	  FRAME_IMAGE_CACHE (f) = share_image_cache (f);
> 	  FRAME_IMAGE_CACHE (f)->refcount++;
> 	}
>     }

How does this answer my question?

The use case I was thinking of is that the image cache was shared,
then the last frame which shared the cache was deleted.  How do we
make sure the cache is freed and set to NULL in this situation?

IOW, we seem to have a cache that is not NULL but is also not a real
cache, as it cannot be accessed.  The question is how did that happen?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-04 12:28               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-05  7:52                 ` Sean Whitton
  0 siblings, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-05  7:52 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Thu 04 Jul 2024 at 08:28pm +08, Po Lu wrote:

> Thanks.  It may be of assistance if you were to run an Emacs configured
> `--enable-checking=yes,all' for a while and report whether any
> assertions fail.

Okay, rebuilding with that configuration option.

I tried removing my two custom functions from
window-size-change-functions.  This seems to mean that crashing is much
less frequent, but it still happens.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05  7:37             ` Eli Zaretskii
@ 2024-07-05  9:36               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-05 11:10                 ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-05  9:36 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 71929, spwhitton

Eli Zaretskii <eliz@gnu.org> writes:

> How does this answer my question?

I mentioned free_frame_faces.  That's the only function where image
caches are released.

> The use case I was thinking of is that the image cache was shared,
> then the last frame which shared the cache was deleted.  How do we
> make sure the cache is freed and set to NULL in this situation?

The cache (whose refcount is 1) is released in free_frame_faces when it
is called with this final frame, through free_image_cache, which also
resets its `FRAME_IMAGE_CACHE' to NULL.

> IOW, we seem to have a cache that is not NULL but is also not a real
> cache, as it cannot be accessed.  The question is how did that happen?

I don't know.  It can only be the case if its `refcount' was decremented
excessively for a reason not yet understood.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05  9:36               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-05 11:10                 ` Eli Zaretskii
  2024-07-05 11:40                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-05 11:10 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, spwhitton

> From: Po Lu <luangruo@yahoo.com>
> Cc: spwhitton@spwhitton.name,  71929@debbugs.gnu.org
> Date: Fri, 05 Jul 2024 17:36:49 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> > How does this answer my question?
> 
> I mentioned free_frame_faces.  That's the only function where image
> caches are released.
> 
> > The use case I was thinking of is that the image cache was shared,
> > then the last frame which shared the cache was deleted.  How do we
> > make sure the cache is freed and set to NULL in this situation?
> 
> The cache (whose refcount is 1) is released in free_frame_faces when it
> is called with this final frame, through free_image_cache, which also
> resets its `FRAME_IMAGE_CACHE' to NULL.
> 
> > IOW, we seem to have a cache that is not NULL but is also not a real
> > cache, as it cannot be accessed.  The question is how did that happen?
> 
> I don't know.  It can only be the case if its `refcount' was decremented
> excessively for a reason not yet understood.

Can you suggest a GDB setup for Sean to use in order to try to find
this unknown code which causes this?

Please note that this affects the release branch, and the changeset
which seems to have caused it was installed a couple of days before
the release branch was cut.  So if we cannot find and solve the
problem soon enough, I'd revert that changeset and solve the original
problem which it was supposed to solve on master, rather than leave
such a serious problem on the release branch.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05 11:10                 ` Eli Zaretskii
@ 2024-07-05 11:40                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-05 12:46                     ` Sean Whitton
  2024-07-06  2:41                     ` Sean Whitton
  0 siblings, 2 replies; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-05 11:40 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 71929, spwhitton

Eli Zaretskii <eliz@gnu.org> writes:

> Can you suggest a GDB setup for Sean to use in order to try to find
> this unknown code which causes this?

I suggested compiling --enable-checking, as there is an assert which I
expect to be activated in these situations.

> Please note that this affects the release branch, and the changeset
> which seems to have caused it was installed a couple of days before
> the release branch was cut.  So if we cannot find and solve the
> problem soon enough, I'd revert that changeset and solve the original
> problem which it was supposed to solve on master, rather than leave
> such a serious problem on the release branch.

OK.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05 11:40                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-05 12:46                     ` Sean Whitton
  2024-07-06  2:41                     ` Sean Whitton
  1 sibling, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-05 12:46 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Fri 05 Jul 2024 at 07:40pm +08, Po Lu wrote:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> Can you suggest a GDB setup for Sean to use in order to try to find
>> this unknown code which causes this?
>
> I suggested compiling --enable-checking, as there is an assert which I
> expect to be activated in these situations.

Yeah, now running with this.  Probably I'll have a crash within a day.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-05 11:40                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-05 12:46                     ` Sean Whitton
@ 2024-07-06  2:41                     ` Sean Whitton
  2024-07-06  6:08                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-06  6:40                       ` Eli Zaretskii
  1 sibling, 2 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-06  2:41 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Fri 05 Jul 2024 at 07:40pm +08, Po Lu wrote:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> Can you suggest a GDB setup for Sean to use in order to try to find
>> this unknown code which causes this?
>
> I suggested compiling --enable-checking, as there is an assert which I
> expect to be activated in these situations.

I recompiled with this.  It crashed again this morning.  Unfortunately
it just crashed in the same way, without hitting any other failed
assertions along the way.  Here is the backtrace.

  0 in mark_image_cache of image.c:3775
  1 in mark_frame of alloc.c:7063
  2 in process_mark_stack of alloc.c:7303
  3 in mark_objects of alloc.c:7512
  4 in mark_vectorlike of alloc.c:6891
  5 in mark_window of alloc.c:7072
  6 in process_mark_stack of alloc.c:7307
  7 in mark_objects of alloc.c:7512
  8 in mark_vectorlike of alloc.c:6891
  9 in mark_frame of alloc.c:7037
 10 in process_mark_stack of alloc.c:7303
 11 in mark_objects of alloc.c:7512
 12 in mark_vectorlike of alloc.c:6891
 13 in mark_window of alloc.c:7072
 14 in process_mark_stack of alloc.c:7307
 15 in mark_object of alloc.c:7504
 16 in mark_char_table of alloc.c:6920
 17 in mark_char_table of alloc.c:6917
 18 in process_mark_stack of alloc.c:7341
 19 in mark_object of alloc.c:7504
 20 in mark_char_table of alloc.c:6920
 21 in mark_char_table of alloc.c:6917
 22 in process_mark_stack of alloc.c:7341
 23 in mark_object of alloc.c:7504
 24 in mark_interval_tree_1 of alloc.c:1529
 25 in traverse_intervals_noorder of intervals.c:243
 26 in traverse_intervals_noorder of intervals.c:248
 27 in traverse_intervals_noorder of intervals.c:248
 28 in traverse_intervals_noorder of intervals.c:248
 29 in mark_interval_tree of alloc.c:1538
 30 in mark_buffer of alloc.c:6958
 31 in process_mark_stack of alloc.c:7299
 32 in mark_objects of alloc.c:7512
 33 in mark_vectorlike of alloc.c:6891
 34 in mark_buffer of alloc.c:6954
 35 in process_mark_stack of alloc.c:7299
 36 in mark_object of alloc.c:7504
 37 in mark_discard_killed_buffers of alloc.c:7020
 38 in mark_window of alloc.c:7087
 39 in process_mark_stack of alloc.c:7307
 40 in mark_objects of alloc.c:7512
 41 in mark_vectorlike of alloc.c:6891
 42 in mark_frame of alloc.c:7037
 43 in process_mark_stack of alloc.c:7303
 44 in mark_object of alloc.c:7504
 45 in mark_interval_tree_1 of alloc.c:1529
 46 in traverse_intervals_noorder of intervals.c:243
 47 in mark_interval_tree of alloc.c:1538
 48 in process_mark_stack of alloc.c:7264
 49 in mark_objects of alloc.c:7512
 50 in mark_vectorlike of alloc.c:6891
 51 in mark_buffer of alloc.c:6954
 52 in process_mark_stack of alloc.c:7299
 53 in mark_object of alloc.c:7504
 54 in mark_interval_tree_1 of alloc.c:1529
 55 in traverse_intervals_noorder of intervals.c:243
 56 in traverse_intervals_noorder of intervals.c:248
 57 in traverse_intervals_noorder of intervals.c:248
 58 in mark_interval_tree of alloc.c:1538
 59 in process_mark_stack of alloc.c:7264
 60 in mark_object of alloc.c:7504
 61 in mark_glyph_matrix of alloc.c:6847
 62 in mark_window of alloc.c:7079
 63 in process_mark_stack of alloc.c:7307
 64 in mark_objects of alloc.c:7512
 65 in mark_vectorlike of alloc.c:6891
 66 in mark_frame of alloc.c:7037
 67 in process_mark_stack of alloc.c:7303
 68 in mark_object of alloc.c:7504
 69 in mark_interval_tree_1 of alloc.c:1529
 70 in traverse_intervals_noorder of intervals.c:243
 71 in mark_interval_tree of alloc.c:1538
 72 in process_mark_stack of alloc.c:7264
 73 in mark_object of alloc.c:7504
 74 in mark_overlay of alloc.c:6933
 75 in process_mark_stack of alloc.c:7355
 76 in mark_objects of alloc.c:7512
 77 in mark_vectorlike of alloc.c:6891
 78 in mark_buffer of alloc.c:6954
 79 in process_mark_stack of alloc.c:7299
 80 in mark_object of alloc.c:7504
 81 in mark_interval_tree_1 of alloc.c:1529
 82 in traverse_intervals_noorder of intervals.c:243
 83 in mark_interval_tree of alloc.c:1538
 84 in process_mark_stack of alloc.c:7264
 85 in mark_object of alloc.c:7504
 86 in mark_char_table of alloc.c:6920
 87 in mark_char_table of alloc.c:6917
 88 in process_mark_stack of alloc.c:7341
 89 in mark_object of alloc.c:7504
 90 in mark_char_table of alloc.c:6920
 91 in mark_char_table of alloc.c:6917
 92 in process_mark_stack of alloc.c:7341
 93 in mark_objects of alloc.c:7512
 94 in mark_vectorlike of alloc.c:6891
 95 in mark_buffer of alloc.c:6954
 96 in process_mark_stack of alloc.c:7299
 97 in mark_objects of alloc.c:7512
 98 in mark_vectorlike of alloc.c:6891
 99 in mark_buffer of alloc.c:6954
100 in process_mark_stack of alloc.c:7299
101 in mark_object of alloc.c:7504
102 in mark_char_table of alloc.c:6920
103 in mark_char_table of alloc.c:6917
104 in process_mark_stack of alloc.c:7341
105 in mark_objects of alloc.c:7512
106 in mark_vectorlike of alloc.c:6891
107 in mark_buffer of alloc.c:6954
108 in process_mark_stack of alloc.c:7299
109 in mark_objects of alloc.c:7512
110 in mark_vectorlike of alloc.c:6891
111 in mark_buffer of alloc.c:6954
112 in process_mark_stack of alloc.c:7299
113 in mark_objects of alloc.c:7512
114 in mark_vectorlike of alloc.c:6891
115 in mark_buffer of alloc.c:6954
116 in process_mark_stack of alloc.c:7299
117 in mark_objects of alloc.c:7512
118 in mark_vectorlike of alloc.c:6891
119 in mark_buffer of alloc.c:6954
120 in process_mark_stack of alloc.c:7299
121 in mark_objects of alloc.c:7512
122 in mark_vectorlike of alloc.c:6891
123 in mark_buffer of alloc.c:6954
124 in process_mark_stack of alloc.c:7299
125 in mark_object of alloc.c:7504
126 in mark_object_root_visitor of alloc.c:6396
127 in visit_vectorlike_root of alloc.c:6348
128 in visit_buffer_root of alloc.c:6362
129 in visit_static_gc_roots of alloc.c:6374
130 in garbage_collect of alloc.c:6598
131 in maybe_garbage_collect of alloc.c:6507
132 in maybe_gc of /home/spwhitton/src/emacs/primary/src/lisp.h:5929
133 in exec_byte_code of bytecode.c:787
134 in funcall_lambda of eval.c:3252
135 in funcall_general of eval.c:3044
136 in Ffuncall of eval.c:3093
137 in Fapply of eval.c:2718
138 in funcall_subr of eval.c:3184
139 in exec_byte_code of bytecode.c:812
140 in funcall_lambda of eval.c:3252
141 in funcall_general of eval.c:3044
142 in Ffuncall of eval.c:3093
143 in timer_check_2 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
144 in timer_check of keyboard.c:4866
145 in readable_events of keyboard.c:3591
146 in get_input_pending of keyboard.c:7869
147 in detect_input_pending_run_timers of keyboard.c:11573
148 in wait_reading_process_output of process.c:5838
149 in kbd_buffer_get_event of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
150 in read_event_from_main_queue of keyboard.c:2330
151 in read_decoded_event_from_main_queue of keyboard.c:2394
152 in read_char of keyboard.c:3015
153 in read_key_sequence of keyboard.c:10743
154 in command_loop_1 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
155 in internal_condition_case of eval.c:1613
156 in command_loop_2 of keyboard.c:1168
157 in internal_catch of eval.c:1292
158 in command_loop of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
159 in recursive_edit_1 of keyboard.c:754
160 in Frecursive_edit of keyboard.c:837
161 in main of emacs.c:2631

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-06  2:41                     ` Sean Whitton
@ 2024-07-06  6:08                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-07  2:40                         ` Sean Whitton
  2024-07-07  2:43                         ` Sean Whitton
  2024-07-06  6:40                       ` Eli Zaretskii
  1 sibling, 2 replies; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-06  6:08 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929, Eli Zaretskii

Sean Whitton <spwhitton@spwhitton.name> writes:

> I recompiled with this.  It crashed again this morning.  Unfortunately
> it just crashed in the same way, without hitting any other failed
> assertions along the way.  Here is the backtrace.
>
>   0 in mark_image_cache of image.c:3775
>   1 in mark_frame of alloc.c:7063
>   2 in process_mark_stack of alloc.c:7303
>   3 in mark_objects of alloc.c:7512
>   4 in mark_vectorlike of alloc.c:6891
>   5 in mark_window of alloc.c:7072
>   6 in process_mark_stack of alloc.c:7307
>   7 in mark_objects of alloc.c:7512
>   8 in mark_vectorlike of alloc.c:6891
>   9 in mark_frame of alloc.c:7037
>  10 in process_mark_stack of alloc.c:7303
>  11 in mark_objects of alloc.c:7512
>  12 in mark_vectorlike of alloc.c:6891
>  13 in mark_window of alloc.c:7072
>  14 in process_mark_stack of alloc.c:7307
>  15 in mark_object of alloc.c:7504
>  16 in mark_char_table of alloc.c:6920
>  17 in mark_char_table of alloc.c:6917
>  18 in process_mark_stack of alloc.c:7341
>  19 in mark_object of alloc.c:7504
>  20 in mark_char_table of alloc.c:6920
>  21 in mark_char_table of alloc.c:6917
>  22 in process_mark_stack of alloc.c:7341
>  23 in mark_object of alloc.c:7504
>  24 in mark_interval_tree_1 of alloc.c:1529
>  25 in traverse_intervals_noorder of intervals.c:243
>  26 in traverse_intervals_noorder of intervals.c:248
>  27 in traverse_intervals_noorder of intervals.c:248
>  28 in traverse_intervals_noorder of intervals.c:248
>  29 in mark_interval_tree of alloc.c:1538
>  30 in mark_buffer of alloc.c:6958
>  31 in process_mark_stack of alloc.c:7299
>  32 in mark_objects of alloc.c:7512
>  33 in mark_vectorlike of alloc.c:6891
>  34 in mark_buffer of alloc.c:6954
>  35 in process_mark_stack of alloc.c:7299
>  36 in mark_object of alloc.c:7504
>  37 in mark_discard_killed_buffers of alloc.c:7020
>  38 in mark_window of alloc.c:7087
>  39 in process_mark_stack of alloc.c:7307
>  40 in mark_objects of alloc.c:7512
>  41 in mark_vectorlike of alloc.c:6891
>  42 in mark_frame of alloc.c:7037
>  43 in process_mark_stack of alloc.c:7303
>  44 in mark_object of alloc.c:7504
>  45 in mark_interval_tree_1 of alloc.c:1529
>  46 in traverse_intervals_noorder of intervals.c:243
>  47 in mark_interval_tree of alloc.c:1538
>  48 in process_mark_stack of alloc.c:7264
>  49 in mark_objects of alloc.c:7512
>  50 in mark_vectorlike of alloc.c:6891
>  51 in mark_buffer of alloc.c:6954
>  52 in process_mark_stack of alloc.c:7299
>  53 in mark_object of alloc.c:7504
>  54 in mark_interval_tree_1 of alloc.c:1529
>  55 in traverse_intervals_noorder of intervals.c:243
>  56 in traverse_intervals_noorder of intervals.c:248
>  57 in traverse_intervals_noorder of intervals.c:248
>  58 in mark_interval_tree of alloc.c:1538
>  59 in process_mark_stack of alloc.c:7264
>  60 in mark_object of alloc.c:7504
>  61 in mark_glyph_matrix of alloc.c:6847
>  62 in mark_window of alloc.c:7079
>  63 in process_mark_stack of alloc.c:7307
>  64 in mark_objects of alloc.c:7512
>  65 in mark_vectorlike of alloc.c:6891
>  66 in mark_frame of alloc.c:7037
>  67 in process_mark_stack of alloc.c:7303
>  68 in mark_object of alloc.c:7504
>  69 in mark_interval_tree_1 of alloc.c:1529
>  70 in traverse_intervals_noorder of intervals.c:243
>  71 in mark_interval_tree of alloc.c:1538
>  72 in process_mark_stack of alloc.c:7264
>  73 in mark_object of alloc.c:7504
>  74 in mark_overlay of alloc.c:6933
>  75 in process_mark_stack of alloc.c:7355
>  76 in mark_objects of alloc.c:7512
>  77 in mark_vectorlike of alloc.c:6891
>  78 in mark_buffer of alloc.c:6954
>  79 in process_mark_stack of alloc.c:7299
>  80 in mark_object of alloc.c:7504
>  81 in mark_interval_tree_1 of alloc.c:1529
>  82 in traverse_intervals_noorder of intervals.c:243
>  83 in mark_interval_tree of alloc.c:1538
>  84 in process_mark_stack of alloc.c:7264
>  85 in mark_object of alloc.c:7504
>  86 in mark_char_table of alloc.c:6920
>  87 in mark_char_table of alloc.c:6917
>  88 in process_mark_stack of alloc.c:7341
>  89 in mark_object of alloc.c:7504
>  90 in mark_char_table of alloc.c:6920
>  91 in mark_char_table of alloc.c:6917
>  92 in process_mark_stack of alloc.c:7341
>  93 in mark_objects of alloc.c:7512
>  94 in mark_vectorlike of alloc.c:6891
>  95 in mark_buffer of alloc.c:6954
>  96 in process_mark_stack of alloc.c:7299
>  97 in mark_objects of alloc.c:7512
>  98 in mark_vectorlike of alloc.c:6891
>  99 in mark_buffer of alloc.c:6954
> 100 in process_mark_stack of alloc.c:7299
> 101 in mark_object of alloc.c:7504
> 102 in mark_char_table of alloc.c:6920
> 103 in mark_char_table of alloc.c:6917
> 104 in process_mark_stack of alloc.c:7341
> 105 in mark_objects of alloc.c:7512
> 106 in mark_vectorlike of alloc.c:6891
> 107 in mark_buffer of alloc.c:6954
> 108 in process_mark_stack of alloc.c:7299
> 109 in mark_objects of alloc.c:7512
> 110 in mark_vectorlike of alloc.c:6891
> 111 in mark_buffer of alloc.c:6954
> 112 in process_mark_stack of alloc.c:7299
> 113 in mark_objects of alloc.c:7512
> 114 in mark_vectorlike of alloc.c:6891
> 115 in mark_buffer of alloc.c:6954
> 116 in process_mark_stack of alloc.c:7299
> 117 in mark_objects of alloc.c:7512
> 118 in mark_vectorlike of alloc.c:6891
> 119 in mark_buffer of alloc.c:6954
> 120 in process_mark_stack of alloc.c:7299
> 121 in mark_objects of alloc.c:7512
> 122 in mark_vectorlike of alloc.c:6891
> 123 in mark_buffer of alloc.c:6954
> 124 in process_mark_stack of alloc.c:7299
> 125 in mark_object of alloc.c:7504
> 126 in mark_object_root_visitor of alloc.c:6396
> 127 in visit_vectorlike_root of alloc.c:6348
> 128 in visit_buffer_root of alloc.c:6362
> 129 in visit_static_gc_roots of alloc.c:6374
> 130 in garbage_collect of alloc.c:6598
> 131 in maybe_garbage_collect of alloc.c:6507
> 132 in maybe_gc of /home/spwhitton/src/emacs/primary/src/lisp.h:5929
> 133 in exec_byte_code of bytecode.c:787
> 134 in funcall_lambda of eval.c:3252
> 135 in funcall_general of eval.c:3044
> 136 in Ffuncall of eval.c:3093
> 137 in Fapply of eval.c:2718
> 138 in funcall_subr of eval.c:3184
> 139 in exec_byte_code of bytecode.c:812
> 140 in funcall_lambda of eval.c:3252
> 141 in funcall_general of eval.c:3044
> 142 in Ffuncall of eval.c:3093
> 143 in timer_check_2 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
> 144 in timer_check of keyboard.c:4866
> 145 in readable_events of keyboard.c:3591
> 146 in get_input_pending of keyboard.c:7869
> 147 in detect_input_pending_run_timers of keyboard.c:11573
> 148 in wait_reading_process_output of process.c:5838
> 149 in kbd_buffer_get_event of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
> 150 in read_event_from_main_queue of keyboard.c:2330
> 151 in read_decoded_event_from_main_queue of keyboard.c:2394
> 152 in read_char of keyboard.c:3015
> 153 in read_key_sequence of keyboard.c:10743
> 154 in command_loop_1 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
> 155 in internal_condition_case of eval.c:1613
> 156 in command_loop_2 of keyboard.c:1168
> 157 in internal_catch of eval.c:1292
> 158 in command_loop of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
> 159 in recursive_edit_1 of keyboard.c:754
> 160 in Frecursive_edit of keyboard.c:837
> 161 in main of emacs.c:2631

Thanks.  Would you mind running Emacs with this patch installed and
configured with the aforesaid option, and responding with backtraces
from any triggered assertion?

diff --git a/src/frame.c b/src/frame.c
index 7f4bf274ad9..a4b8ca207ee 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -4831,14 +4831,18 @@ gui_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
 	  /* Clean F's image cache of images whose values are derived
 	     from the font width.  */
 	  clear_image_cache (f, Qauto);
+	  verify_image_cache_refcount (f);
 	}
       else
 	{
 	  /* Release the current image cache, and reuse or allocate a
 	     new image cache with IWIDTH.  */
 	  FRAME_IMAGE_CACHE (f)->refcount--;
+	  FRAME_IMAGE_CACHE (f) = NULL;
+	  verify_image_cache_refcount (f);
 	  FRAME_IMAGE_CACHE (f) = share_image_cache (f);
 	  FRAME_IMAGE_CACHE (f)->refcount++;
+	  verify_image_cache_refcount (f);
 	}
     }
 
diff --git a/src/frame.h b/src/frame.h
index 1d920d1a6bc..eee694d6920 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1682,6 +1682,34 @@ IMAGE_OPT_FROM_ID (struct frame *f, int id)
   eassume (0 <= used);
   return 0 <= id && id < used ? FRAME_IMAGE_CACHE (f)->images[id] : NULL;
 }
+
+/* Abort if F's image cache's `refcount' field disagrees with the number
+   of frames holding references to the same.  */
+
+INLINE void
+verify_image_cache_refcount (f)
+     struct frame *f;
+{
+#ifdef ENABLE_CHECKING
+  int expected;
+  Lisp_Object tail, frame;
+
+  if (FRAME_IMAGE_CACHE (f))
+    {
+      expected = 0;
+
+      FOR_EACH_FRAME (tail, frame)
+	{
+	  if (FRAME_IMAGE_CACHE (XFRAME (frame))
+	      == FRAME_IMAGE_CACHE (f))
+	    expected++;
+	}
+
+      eassert (expected == FRAME_IMAGE_CACHE (f)->refcount);
+    }
+#endif /* ENABLE_CHECKING */
+}
+
 #endif
 \f
 /***********************************************************************
diff --git a/src/image.c b/src/image.c
index 2945447b962..9420c579d7b 100644
--- a/src/image.c
+++ b/src/image.c
@@ -3625,6 +3625,7 @@ cache_image (struct frame *f, struct image *img)
     {
       c = FRAME_IMAGE_CACHE (f) = share_image_cache (f);
       c->refcount++;
+      verify_image_cache_refcount (f);
     }
 
   /* Find a free slot in c->images.  */
diff --git a/src/xfaces.c b/src/xfaces.c
index 188dd4778bc..0e0172e1984 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -680,6 +680,7 @@ init_frame_faces (struct frame *f)
     {
       FRAME_IMAGE_CACHE (f) = share_image_cache (f);
       ++FRAME_IMAGE_CACHE (f)->refcount;
+      verify_image_cache_refcount (f);
     }
 #endif /* HAVE_WINDOW_SYSTEM */
 
@@ -709,6 +710,7 @@ free_frame_faces (struct frame *f)
       struct image_cache *image_cache = FRAME_IMAGE_CACHE (f);
       if (image_cache)
 	{
+	  verify_image_cache_refcount (f);
 	  --image_cache->refcount;
 	  if (image_cache->refcount == 0)
 	    free_image_cache (f);





^ permalink raw reply related	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-06  2:41                     ` Sean Whitton
  2024-07-06  6:08                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-06  6:40                       ` Eli Zaretskii
  2024-07-07  2:39                         ` Sean Whitton
  1 sibling, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-06  6:40 UTC (permalink / raw)
  To: Sean Whitton; +Cc: luangruo, 71929

> From: Sean Whitton <spwhitton@spwhitton.name>
> Cc: Eli Zaretskii <eliz@gnu.org>,  71929@debbugs.gnu.org
> Date: Sat, 06 Jul 2024 10:41:15 +0800
> 
> I recompiled with this.  It crashed again this morning.  Unfortunately
> it just crashed in the same way, without hitting any other failed
> assertions along the way.  Here is the backtrace.
> 
>   0 in mark_image_cache of image.c:3775
>   1 in mark_frame of alloc.c:7063
>   2 in process_mark_stack of alloc.c:7303

Do you still have this crashes session in GDB, so I could ask you to
look around and show values of some variables?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-06  6:40                       ` Eli Zaretskii
@ 2024-07-07  2:39                         ` Sean Whitton
  0 siblings, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-07  2:39 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, 71929

Hello,

On Sat 06 Jul 2024 at 09:40am +03, Eli Zaretskii wrote:

>> From: Sean Whitton <spwhitton@spwhitton.name>
>> Cc: Eli Zaretskii <eliz@gnu.org>,  71929@debbugs.gnu.org
>> Date: Sat, 06 Jul 2024 10:41:15 +0800
>>
>> I recompiled with this.  It crashed again this morning.  Unfortunately
>> it just crashed in the same way, without hitting any other failed
>> assertions along the way.  Here is the backtrace.
>>
>>   0 in mark_image_cache of image.c:3775
>>   1 in mark_frame of alloc.c:7063
>>   2 in process_mark_stack of alloc.c:7303
>
> Do you still have this crashes session in GDB, so I could ask you to
> look around and show values of some variables?

Unfortunately not.  I'll try to keep it aronud next time, and please let
me know as many variables as you have already thought of as soon as you
can.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-06  6:08                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-07  2:40                         ` Sean Whitton
  2024-07-07  2:43                         ` Sean Whitton
  1 sibling, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-07  2:40 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Sat 06 Jul 2024 at 02:08pm +08, Po Lu wrote:

>
> Thanks.  Would you mind running Emacs with this patch installed and
> configured with the aforesaid option, and responding with backtraces
> from any triggered assertion?

Will do.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-06  6:08                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-07  2:40                         ` Sean Whitton
@ 2024-07-07  2:43                         ` Sean Whitton
  2024-07-07  2:46                           ` Sean Whitton
  1 sibling, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-07  2:43 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Sat 06 Jul 2024 at 02:08pm +08, Po Lu wrote:

> Thanks.  Would you mind running Emacs with this patch installed and
> configured with the aforesaid option, and responding with backtraces
> from any triggered assertion?

I launch it with emacs --fg-daemon under gdb and it crashes immediately,
before I've had chance to open any frames with emacsclient:

 0 in terminate_due_to_signal of emacs.c:442
 1 in die of alloc.c:8083
 2 in verify_image_cache_refcount of /home/spwhitton/src/emacs/primary/src/frame.h:1708
 3 in init_frame_faces of xfaces.c:683
 4 in Fx_create_frame of pgtkfns.c:1467
 5 in funcall_subr of eval.c:3161
 6 in exec_byte_code of bytecode.c:812
 7 in funcall_lambda of eval.c:3252
 8 in funcall_general of eval.c:3044
 9 in Ffuncall of eval.c:3093
10 in Fapply of eval.c:2722
11 in funcall_subr of eval.c:3184
12 in exec_byte_code of bytecode.c:812
13 in funcall_lambda of eval.c:3252
14 in funcall_general of eval.c:3044
15 in Ffuncall of eval.c:3093
16 in Fapply of eval.c:2765
17 in apply1 of eval.c:2981
18 in read_process_output_call of process.c:6129
19 in internal_condition_case_1 of eval.c:1637
20 in read_and_dispose_of_process_output of process.c:6498
21 in read_process_output of process.c:6266
22 in wait_reading_process_output of process.c:5947
23 in kbd_buffer_get_event of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
24 in read_event_from_main_queue of keyboard.c:2330
25 in read_decoded_event_from_main_queue of keyboard.c:2394
26 in read_char of keyboard.c:3015
27 in read_key_sequence of keyboard.c:10743
28 in command_loop_1 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
29 in internal_condition_case of eval.c:1613
30 in command_loop_2 of keyboard.c:1168
31 in internal_catch of eval.c:1292
32 in command_loop of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
33 in recursive_edit_1 of keyboard.c:754
34 in Frecursive_edit of keyboard.c:837
35 in main of emacs.c:2631

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07  2:43                         ` Sean Whitton
@ 2024-07-07  2:46                           ` Sean Whitton
  2024-07-07  4:04                             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-07  2:46 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Sun 07 Jul 2024 at 10:43am +08, Sean Whitton wrote:

> Hello,
>
> On Sat 06 Jul 2024 at 02:08pm +08, Po Lu wrote:
>
>> Thanks.  Would you mind running Emacs with this patch installed and
>> configured with the aforesaid option, and responding with backtraces
>> from any triggered assertion?
>
> I launch it with emacs --fg-daemon under gdb and it crashes immediately,
> before I've had chance to open any frames with emacsclient:

Not quite.  It crashes when I try to use 'emacsclient -c' to open the
first graphical frame.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07  2:46                           ` Sean Whitton
@ 2024-07-07  4:04                             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-07  4:54                               ` Sean Whitton
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-07  4:04 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929, Eli Zaretskii

Sean Whitton <spwhitton@spwhitton.name> writes:

> Hello,
>
> On Sun 07 Jul 2024 at 10:43am +08, Sean Whitton wrote:
>
>> Hello,
>>
>> On Sat 06 Jul 2024 at 02:08pm +08, Po Lu wrote:
>>
>>> Thanks.  Would you mind running Emacs with this patch installed and
>>> configured with the aforesaid option, and responding with backtraces
>>> from any triggered assertion?
>>
>> I launch it with emacs --fg-daemon under gdb and it crashes immediately,
>> before I've had chance to open any frames with emacsclient:
>
> Not quite.  It crashes when I try to use 'emacsclient -c' to open the
> first graphical frame.

Please move into verify_image_cache_refcount and execute:

  (gdb) p expected
  (gdb) p FRAME_IMAGE_CACHE (f)
  (gdb) p FRAME_IMAGE_CACHE (f)->refcount
  (gdb) set $cons = Vframe_list
  (gdb) while $cons
   >xgetptr $cons
   >p ((struct Lisp_Cons *) $ptr)->u.s.car
   >xframe
   >p *$
   >xgetptr $cons
   >set $cons = ((struct Lisp_Cons *) $ptr)->u.s.u.cdr
   >end





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07  4:04                             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-07  4:54                               ` Sean Whitton
  2024-07-07  7:08                                 ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-07  4:54 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Sun 07 Jul 2024 at 12:04pm +08, Po Lu wrote:

> Sean Whitton <spwhitton@spwhitton.name> writes:
>
>> Hello,
>>
>> On Sun 07 Jul 2024 at 10:43am +08, Sean Whitton wrote:
>>
>>> Hello,
>>>
>>> On Sat 06 Jul 2024 at 02:08pm +08, Po Lu wrote:
>>>
>>>> Thanks.  Would you mind running Emacs with this patch installed and
>>>> configured with the aforesaid option, and responding with backtraces
>>>> from any triggered assertion?
>>>
>>> I launch it with emacs --fg-daemon under gdb and it crashes immediately,
>>> before I've had chance to open any frames with emacsclient:
>>
>> Not quite.  It crashes when I try to use 'emacsclient -c' to open the
>> first graphical frame.
>
> Please move into verify_image_cache_refcount and execute:
>
>   (gdb) p expected
>   (gdb) p FRAME_IMAGE_CACHE (f)
>   (gdb) p FRAME_IMAGE_CACHE (f)->refcount
>   (gdb) set $cons = Vframe_list
>   (gdb) while $cons
>    >xgetptr $cons
>    >p ((struct Lisp_Cons *) $ptr)->u.s.car
>    >xframe
>    >p *$
>    >xgetptr $cons
>    >set $cons = ((struct Lisp_Cons *) $ptr)->u.s.u.cdr
>    >end

(gdb) p expected
$1 = 0
(gdb) p FRAME_IMAGE_CACHE (f)
$2 = (struct image_cache *) 0x555557f29270
(gdb) p FRAME_IMAGE_CACHE (f)->refcount
$3 = 1
(gdb) set $cons = Vframe_list
[...]
$4 = XIL(0x555555f3dfd5)
$5 = (struct frame *) 0x555555f3dfd0
"F1"
$6 = {
  header = {
    size = 4611686018595352602
  },
  name = XIL(0x55555587c944),
  icon_name = XIL(0),
  title = XIL(0),
  parent_frame = XIL(0),
  last_mouse_device = XIL(0),
  focus_frame = XIL(0),
  root_window = XIL(0x555555f3e225),
  selected_window = XIL(0x555555f3e225),
  old_selected_window = XIL(0),
  minibuffer_window = XIL(0x555555f3e4cd),
  param_alist = XIL(0x555557a23523),
  scroll_bars = XIL(0),
  condemned_scroll_bars = XIL(0),
  menu_bar_items = XIL(0),
  face_hash_table = XIL(0x555555f3e775),
  menu_bar_vector = XIL(0),
  buffer_predicate = XIL(0),
  buffer_list = XIL(0x555557a23503),
  buried_buffer_list = XIL(0),
  tab_bar_window = XIL(0),
  desired_tab_bar_string = XIL(0),
  current_tab_bar_string = XIL(0),
  tool_bar_position = XIL(0x11d00),
  font_data = XIL(0),
  tab_bar_items = XIL(0),
  tool_bar_items = XIL(0),
  face_cache = 0x555555f741d0,
  image_cache = 0x0,
  last_tab_bar_item = -1,
  menu_bar_items_used = 0,
  current_pool = 0x555555f3f4b0,
  desired_pool = 0x555555f3f490,
  desired_matrix = 0x555555f3f4d0,
  current_matrix = 0x555555f3f740,
  glyphs_initialized_p = true,
  resized_p = true,
  default_face_done_p = false,
  already_hscrolled_p = false,
  updated_p = false,
  minimize_tab_bar_window_p = false,
  external_tool_bar = false,
  fonts_changed = false,
  cursor_type_changed = false,
  redisplay = true,
  external_menu_bar = false,
  visible = 1,
  iconified = false,
  garbaged = true,
  wants_modeline = true,
  auto_raise = false,
  auto_lower = false,
  no_split = false,
  explicit_name = false,
  window_change = true,
  window_state_change = false,
  mouse_moved = false,
  pointer_invisible = false,
  frozen_window_starts = false,
  output_method = output_initial,
  tooltip = false,
  want_fullscreen = FULLSCREEN_NONE,
  vertical_scroll_bar_type = vertical_scroll_bar_none,
  horizontal_scroll_bars = false,
  undecorated = false,
  override_redirect = false,
  skip_taskbar = false,
  no_focus_on_map = false,
  no_accept_focus = false,
  z_group = z_group_none,
  no_special_glyphs = false,
  can_set_window_size = true,
  after_make_frame = true,
  tab_bar_redisplayed = false,
  tab_bar_resized = false,
  tool_bar_redisplayed = false,
  tool_bar_resized = false,
  inhibit_horizontal_resize = false,
  inhibit_vertical_resize = false,
  face_change = true,
  inhibit_clear_image_cache = false,
  new_size_p = false,
  was_invisible = false,
  select_mini_window_flag = false,
  change_stamp = 1,
  number_of_windows = 0,
  tab_bar_lines = 0,
  tab_bar_height = 0,
  n_tab_bar_rows = 0,
  n_tab_bar_items = 0,
  tool_bar_lines = 0,
  tool_bar_height = 0,
  n_tool_bar_rows = 0,
  n_tool_bar_items = 0,
  decode_mode_spec_buffer = 0x555555f3f340 "",
  insert_line_cost = 0x0,
  delete_line_cost = 0x0,
  insert_n_lines_cost = 0x0,
  delete_n_lines_cost = 0x0,
  text_cols = 80,
  text_lines = 24,
  text_width = 80,
  text_height = 24,
  total_cols = 80,
  total_lines = 25,
  pixel_width = 80,
  pixel_height = 25,
  new_width = -1,
  new_height = -1,
  left_pos = 0,
  top_pos = 0,
  win_gravity = 0,
  size_hint_flags = 0,
  border_width = 0,
  child_frame_border_width = -1,
  internal_border_width = 0,
  right_divider_width = 0,
  bottom_divider_width = 0,
  left_fringe_width = 0,
  right_fringe_width = 0,
  fringe_cols = 0,
  menu_bar_lines = 1,
  menu_bar_height = 1,
  column_width = 1,
  line_height = 1,
  terminal = 0x555555f3ddb0,
  output_data = {
    tty = 0x0,
    x = 0x0,
    w32 = 0x0,
    ns = 0x0,
    pgtk = 0x0,
    haiku = 0x0,
    android = 0x0
  },
  font_driver_list = 0x0,
  desired_cursor = FILLED_BOX_CURSOR,
  cursor_width = 0,
  blink_off_cursor = FILLED_BOX_CURSOR,
  blink_off_cursor_width = 0,
  config_scroll_bar_width = 0,
  config_scroll_bar_cols = 0,
  config_scroll_bar_height = 0,
  config_scroll_bar_lines = 0,
  cost_calculation_baud_rate = 0,
  alpha = {0, 0},
  alpha_background = 0,
  gamma = 0,
  extra_line_spacing = 0,
  background_pixel = 18446744073709551613,
  foreground_pixel = 18446744073709551614
}

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07  4:54                               ` Sean Whitton
@ 2024-07-07  7:08                                 ` Eli Zaretskii
  2024-07-07  7:41                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-07  7:08 UTC (permalink / raw)
  To: luangruo, Sean Whitton; +Cc: 71929

> From: Sean Whitton <spwhitton@spwhitton.name>
> Cc: 71929@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>
> Date: Sun, 07 Jul 2024 12:54:13 +0800
> 
> > Please move into verify_image_cache_refcount and execute:
> >
> >   (gdb) p expected
> >   (gdb) p FRAME_IMAGE_CACHE (f)
> >   (gdb) p FRAME_IMAGE_CACHE (f)->refcount
> >   (gdb) set $cons = Vframe_list
> >   (gdb) while $cons
> >    >xgetptr $cons
> >    >p ((struct Lisp_Cons *) $ptr)->u.s.car
> >    >xframe
> >    >p *$
> >    >xgetptr $cons
> >    >set $cons = ((struct Lisp_Cons *) $ptr)->u.s.u.cdr
> >    >end
> 
> (gdb) p expected
> $1 = 0
> (gdb) p FRAME_IMAGE_CACHE (f)
> $2 = (struct image_cache *) 0x555557f29270
> (gdb) p FRAME_IMAGE_CACHE (f)->refcount
> $3 = 1
> (gdb) set $cons = Vframe_list
> [...]
> $4 = XIL(0x555555f3dfd5)
> $5 = (struct frame *) 0x555555f3dfd0
> "F1"
> $6 = {
>   header = {
>     size = 4611686018595352602
>   },
> [...]
>   terminal = 0x555555f3ddb0,
>   output_data = {
>     tty = 0x0,
>     x = 0x0,
>     w32 = 0x0,
>     ns = 0x0,
>     pgtk = 0x0,
>     haiku = 0x0,
>     android = 0x0
>   },

This is the initial frame of the daemon.  It is not a GUI frame, and
so it should not have a valid image cache.  I guess some change is
needed in verify_image_cache_refcount?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07  7:08                                 ` Eli Zaretskii
@ 2024-07-07  7:41                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-07 13:16                                     ` Sean Whitton
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-07  7:41 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 71929, Sean Whitton

Eli Zaretskii <eliz@gnu.org> writes:

> This is the initial frame of the daemon.  It is not a GUI frame, and
> so it should not have a valid image cache.  I guess some change is
> needed in verify_image_cache_refcount?

Not quite: init_frame_faces is apparently called before the frame is
entered into Vframe_list, so, likewise, the face cache's reference count
should be verified before it is incremented.

Sean, please retry with this patch substituted for the previous:

diff --git a/src/frame.c b/src/frame.c
index 7f4bf274ad9..9793b9f5cbe 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -4831,14 +4831,20 @@ gui_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
 	  /* Clean F's image cache of images whose values are derived
 	     from the font width.  */
 	  clear_image_cache (f, Qauto);
+	  verify_image_cache_refcount (FRAME_IMAGE_CACHE (f));
 	}
       else
 	{
+	  struct image_cache *old_cache = FRAME_IMAGE_CACHE (f);
+
 	  /* Release the current image cache, and reuse or allocate a
 	     new image cache with IWIDTH.  */
 	  FRAME_IMAGE_CACHE (f)->refcount--;
+	  FRAME_IMAGE_CACHE (f) = NULL;
+	  verify_image_cache_refcount (old_cache);
 	  FRAME_IMAGE_CACHE (f) = share_image_cache (f);
 	  FRAME_IMAGE_CACHE (f)->refcount++;
+	  verify_image_cache_refcount (FRAME_IMAGE_CACHE (f));
 	}
     }
 
diff --git a/src/frame.h b/src/frame.h
index 1d920d1a6bc..8a636c56643 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1682,6 +1682,31 @@ IMAGE_OPT_FROM_ID (struct frame *f, int id)
   eassume (0 <= used);
   return 0 <= id && id < used ? FRAME_IMAGE_CACHE (f)->images[id] : NULL;
 }
+
+/* Abort if C is non-NULL and C's `refcount' field disagrees with the
+   number of frames holding references to the same.  */
+
+INLINE void
+verify_image_cache_refcount (struct image_cache *c)
+{
+  int expected;
+  Lisp_Object tail, frame;
+
+  if (c)
+    {
+      expected = 0;
+
+      FOR_EACH_FRAME (tail, frame)
+	{
+	  if (FRAME_IMAGE_CACHE (XFRAME (frame)) == c)
+	    expected++;
+	}
+
+      if (expected != c->refcount)
+	emacs_abort ();
+    }
+}
+
 #endif
 \f
 /***********************************************************************
diff --git a/src/image.c b/src/image.c
index 2945447b962..9387c78408b 100644
--- a/src/image.c
+++ b/src/image.c
@@ -3625,6 +3625,7 @@ cache_image (struct frame *f, struct image *img)
     {
       c = FRAME_IMAGE_CACHE (f) = share_image_cache (f);
       c->refcount++;
+      verify_image_cache_refcount (c);
     }
 
   /* Find a free slot in c->images.  */
diff --git a/src/xfaces.c b/src/xfaces.c
index 188dd4778bc..ed4d404fbf3 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -678,7 +678,10 @@ init_frame_faces (struct frame *f)
   /* Make or share an image cache.  */
   if (FRAME_WINDOW_P (f))
     {
-      FRAME_IMAGE_CACHE (f) = share_image_cache (f);
+      struct image_cache *c = share_image_cache (f);
+
+      verify_image_cache_refcount (c);
+      FRAME_IMAGE_CACHE (f) = c;
       ++FRAME_IMAGE_CACHE (f)->refcount;
     }
 #endif /* HAVE_WINDOW_SYSTEM */
@@ -709,6 +712,7 @@ free_frame_faces (struct frame *f)
       struct image_cache *image_cache = FRAME_IMAGE_CACHE (f);
       if (image_cache)
 	{
+	  verify_image_cache_refcount (image_cache);
 	  --image_cache->refcount;
 	  if (image_cache->refcount == 0)
 	    free_image_cache (f);





^ permalink raw reply related	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07  7:41                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-07 13:16                                     ` Sean Whitton
  2024-07-07 13:47                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-07 13:16 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Sun 07 Jul 2024 at 03:41pm +08, Po Lu wrote:

> Eli Zaretskii <eliz@gnu.org> writes:
>
>> This is the initial frame of the daemon.  It is not a GUI frame, and
>> so it should not have a valid image cache.  I guess some change is
>> needed in verify_image_cache_refcount?
>
> Not quite: init_frame_faces is apparently called before the frame is
> entered into Vframe_list, so, likewise, the face cache's reference count
> should be verified before it is incremented.
>
> Sean, please retry with this patch substituted for the previous:

This time it doesn't crash until I open and close a frame, as can be
seen in the backtrace:

 0 in terminate_due_to_signal of emacs.c:442
 1 in emacs_abort of sysdep.c:2391
 2 in verify_image_cache_refcount of /home/spwhitton/src/emacs/primary/src/frame.h:1706
 3 in free_frame_faces of xfaces.c:715
 4 in pgtk_free_frame_resources of pgtkterm.c:443
 5 in pgtk_destroy_window of pgtkterm.c:539
 6 in delete_frame of frame.c:2318
 7 in Fdelete_frame of frame.c:2527
 8 in funcall_subr of eval.c:3163
 9 in exec_byte_code of bytecode.c:812
10 in funcall_lambda of eval.c:3252
11 in funcall_general of eval.c:3044
12 in Ffuncall of eval.c:3093
13 in Ffuncall_interactively of callint.c:250
14 in funcall_subr of eval.c:3184
15 in funcall_general of eval.c:3040
16 in Ffuncall of eval.c:3093
17 in Fcall_interactively of callint.c:789
18 in funcall_subr of eval.c:3165
19 in exec_byte_code of bytecode.c:812
20 in funcall_lambda of eval.c:3252
21 in funcall_general of eval.c:3044
22 in Ffuncall of eval.c:3093
23 in read_char of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
24 in read_key_sequence of keyboard.c:10743
25 in command_loop_1 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
26 in internal_condition_case of eval.c:1613
27 in command_loop_2 of keyboard.c:1168
28 in internal_catch of eval.c:1292
29 in command_loop of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
30 in recursive_edit_1 of keyboard.c:754
31 in Frecursive_edit of keyboard.c:837
32 in main of emacs.c:2631

(gdb) p expected
$3 = 0
(gdb) p c
$4 = (struct image_cache *) 0x555557f65370
(gdb) p c->refcount
$5 = 1
(gdb) set $cons = Vframe_list
(gdb) while $cons
 >xgetptr $cons
 >p ((struct Lisp_Cons *) $ptr)->u.s.car
 >xframe
 >p *$
 >xgetptr $cons
 >set $cons = ((struct Lisp_Cons *) $ptr)->u.s.u.cdr
 >end
$6 = XIL(0x555555f3dfd5)
$7 = (struct frame *) 0x555555f3dfd0
"F1"
$8 = {
  header = {
    size = 4611686018595352602
  },
  name = XIL(0x55555587c944),
  icon_name = XIL(0),
  title = XIL(0),
  parent_frame = XIL(0),
  last_mouse_device = XIL(0),
  focus_frame = XIL(0),
  root_window = XIL(0x555555f3e225),
  selected_window = XIL(0x555555f3e225),
  old_selected_window = XIL(0x555555f3e225),
  minibuffer_window = XIL(0x555555f3e4cd),
  param_alist = XIL(0x555557a23c73),
  scroll_bars = XIL(0),
  condemned_scroll_bars = XIL(0),
  menu_bar_items = XIL(0x555558f8b705),
  face_hash_table = XIL(0x555555f3e775),
  menu_bar_vector = XIL(0),
  buffer_predicate = XIL(0),
  buffer_list = XIL(0x55555934f053),
  buried_buffer_list = XIL(0),
  tab_bar_window = XIL(0),
  desired_tab_bar_string = XIL(0),
  current_tab_bar_string = XIL(0),
  tool_bar_position = XIL(0x11d00),
  font_data = XIL(0),
  tab_bar_items = XIL(0),
  tool_bar_items = XIL(0),
  face_cache = 0x555555f741d0,
  image_cache = 0x0,
  last_tab_bar_item = -1,
  menu_bar_items_used = 0,
  current_pool = 0x555555f3f4b0,
  desired_pool = 0x555555f3f490,
  desired_matrix = 0x555555f3f4d0,
  current_matrix = 0x555555f3f740,
  glyphs_initialized_p = true,
  resized_p = false,
  default_face_done_p = false,
  already_hscrolled_p = false,
  updated_p = false,
  minimize_tab_bar_window_p = false,
  external_tool_bar = false,
  fonts_changed = false,
  cursor_type_changed = false,
  redisplay = true,
  external_menu_bar = false,
  visible = 1,
  iconified = false,
  garbaged = false,
  wants_modeline = true,
  auto_raise = false,
  auto_lower = false,
  no_split = false,
  explicit_name = false,
  window_change = false,
  window_state_change = false,
  mouse_moved = false,
  pointer_invisible = false,
  frozen_window_starts = false,
  output_method = output_initial,
  tooltip = false,
  want_fullscreen = FULLSCREEN_NONE,
  vertical_scroll_bar_type = vertical_scroll_bar_none,
  horizontal_scroll_bars = false,
  undecorated = false,
  override_redirect = false,
  skip_taskbar = false,
  no_focus_on_map = false,
  no_accept_focus = false,
  z_group = z_group_none,
  no_special_glyphs = false,
  can_set_window_size = true,
  after_make_frame = true,
  tab_bar_redisplayed = false,
  tab_bar_resized = false,
  tool_bar_redisplayed = false,
  tool_bar_resized = false,
  inhibit_horizontal_resize = false,
  inhibit_vertical_resize = false,
  face_change = false,
  inhibit_clear_image_cache = false,
  new_size_p = false,
  was_invisible = false,
  select_mini_window_flag = false,
  change_stamp = 7,
  number_of_windows = 2,
  tab_bar_lines = 0,
  tab_bar_height = 0,
  n_tab_bar_rows = 0,
  n_tab_bar_items = 0,
  tool_bar_lines = 0,
  tool_bar_height = 0,
  n_tool_bar_rows = 0,
  n_tool_bar_items = 0,
  decode_mode_spec_buffer = 0x555555f3f340 "",
  insert_line_cost = 0x0,
  delete_line_cost = 0x0,
  insert_n_lines_cost = 0x0,
  delete_n_lines_cost = 0x0,
  text_cols = 80,
  text_lines = 24,
  text_width = 80,
  text_height = 24,
  total_cols = 80,
  total_lines = 25,
  pixel_width = 80,
  pixel_height = 25,
  new_width = -1,
  new_height = -1,
  left_pos = 0,
  top_pos = 0,
  win_gravity = 0,
  size_hint_flags = 0,
  border_width = 0,
  child_frame_border_width = -1,
  internal_border_width = 0,
  right_divider_width = 0,
  bottom_divider_width = 0,
  left_fringe_width = 0,
  right_fringe_width = 0,
  fringe_cols = 0,
  menu_bar_lines = 1,
  menu_bar_height = 1,
  column_width = 1,
  line_height = 1,
  terminal = 0x555555f3ddb0,
  output_data = {
    tty = 0x0,
    x = 0x0,
    w32 = 0x0,
    ns = 0x0,
    pgtk = 0x0,
    haiku = 0x0,
    android = 0x0
  },
  font_driver_list = 0x0,
  desired_cursor = FILLED_BOX_CURSOR,
  cursor_width = 0,
  blink_off_cursor = FILLED_BOX_CURSOR,
  blink_off_cursor_width = 0,
  config_scroll_bar_width = 0,
  config_scroll_bar_cols = 0,
  config_scroll_bar_height = 0,
  config_scroll_bar_lines = 0,
  cost_calculation_baud_rate = 0,
  alpha = {0, 0},
  alpha_background = 0,
  gamma = 0,
  extra_line_spacing = 0,
  background_pixel = 18446744073709551613,
  foreground_pixel = 18446744073709551614
}

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07 13:16                                     ` Sean Whitton
@ 2024-07-07 13:47                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-07 14:45                                         ` Sean Whitton
  2024-07-09  5:48                                         ` Sean Whitton
  0 siblings, 2 replies; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-07 13:47 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929, Eli Zaretskii

Sean Whitton <spwhitton@spwhitton.name> writes:

> Hello,
>
> On Sun 07 Jul 2024 at 03:41pm +08, Po Lu wrote:
>
>> Eli Zaretskii <eliz@gnu.org> writes:
>>
>>> This is the initial frame of the daemon.  It is not a GUI frame, and
>>> so it should not have a valid image cache.  I guess some change is
>>> needed in verify_image_cache_refcount?
>>
>> Not quite: init_frame_faces is apparently called before the frame is
>> entered into Vframe_list, so, likewise, the face cache's reference count
>> should be verified before it is incremented.
>>
>> Sean, please retry with this patch substituted for the previous:
>
> This time it doesn't crash until I open and close a frame, as can be
> seen in the backtrace:

I must ask you to bear with me again, as another detail was not
correctly accounted for in the last patch.  Please retry with this:

diff --git a/src/frame.c b/src/frame.c
index 7f4bf274ad9..9793b9f5cbe 100644
--- a/src/frame.c
+++ b/src/frame.c
@@ -4831,14 +4831,20 @@ gui_set_font (struct frame *f, Lisp_Object arg, Lisp_Object oldval)
 	  /* Clean F's image cache of images whose values are derived
 	     from the font width.  */
 	  clear_image_cache (f, Qauto);
+	  verify_image_cache_refcount (FRAME_IMAGE_CACHE (f));
 	}
       else
 	{
+	  struct image_cache *old_cache = FRAME_IMAGE_CACHE (f);
+
 	  /* Release the current image cache, and reuse or allocate a
 	     new image cache with IWIDTH.  */
 	  FRAME_IMAGE_CACHE (f)->refcount--;
+	  FRAME_IMAGE_CACHE (f) = NULL;
+	  verify_image_cache_refcount (old_cache);
 	  FRAME_IMAGE_CACHE (f) = share_image_cache (f);
 	  FRAME_IMAGE_CACHE (f)->refcount++;
+	  verify_image_cache_refcount (FRAME_IMAGE_CACHE (f));
 	}
     }
 
diff --git a/src/frame.h b/src/frame.h
index 1d920d1a6bc..8a636c56643 100644
--- a/src/frame.h
+++ b/src/frame.h
@@ -1682,6 +1682,31 @@ IMAGE_OPT_FROM_ID (struct frame *f, int id)
   eassume (0 <= used);
   return 0 <= id && id < used ? FRAME_IMAGE_CACHE (f)->images[id] : NULL;
 }
+
+/* Abort if C is non-NULL and C's `refcount' field disagrees with the
+   number of frames holding references to the same.  */
+
+INLINE void
+verify_image_cache_refcount (struct image_cache *c)
+{
+  int expected;
+  Lisp_Object tail, frame;
+
+  if (c)
+    {
+      expected = 0;
+
+      FOR_EACH_FRAME (tail, frame)
+	{
+	  if (FRAME_IMAGE_CACHE (XFRAME (frame)) == c)
+	    expected++;
+	}
+
+      if (expected != c->refcount)
+	emacs_abort ();
+    }
+}
+
 #endif
 \f
 /***********************************************************************
diff --git a/src/image.c b/src/image.c
index 2945447b962..9387c78408b 100644
--- a/src/image.c
+++ b/src/image.c
@@ -3625,6 +3625,7 @@ cache_image (struct frame *f, struct image *img)
     {
       c = FRAME_IMAGE_CACHE (f) = share_image_cache (f);
       c->refcount++;
+      verify_image_cache_refcount (c);
     }
 
   /* Find a free slot in c->images.  */
diff --git a/src/xfaces.c b/src/xfaces.c
index 188dd4778bc..372c36634d1 100644
--- a/src/xfaces.c
+++ b/src/xfaces.c
@@ -678,7 +678,10 @@ init_frame_faces (struct frame *f)
   /* Make or share an image cache.  */
   if (FRAME_WINDOW_P (f))
     {
-      FRAME_IMAGE_CACHE (f) = share_image_cache (f);
+      struct image_cache *c = share_image_cache (f);
+
+      verify_image_cache_refcount (c);
+      FRAME_IMAGE_CACHE (f) = c;
       ++FRAME_IMAGE_CACHE (f)->refcount;
     }
 #endif /* HAVE_WINDOW_SYSTEM */
@@ -710,6 +713,7 @@ free_frame_faces (struct frame *f)
       if (image_cache)
 	{
 	  --image_cache->refcount;
+	  verify_image_cache_refcount (image_cache);
 	  if (image_cache->refcount == 0)
 	    free_image_cache (f);
 	}





^ permalink raw reply related	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07 13:47                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-07 14:45                                         ` Sean Whitton
  2024-07-09  5:48                                         ` Sean Whitton
  1 sibling, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-07 14:45 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Sun 07 Jul 2024 at 09:47pm +08, Po Lu wrote:

> I must ask you to bear with me again, as another detail was not
> correctly accounted for in the last patch.  Please retry with this:

No problem.  It doesn't crash right away this time, but I'll get back to
you when it does.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-07 13:47                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-07 14:45                                         ` Sean Whitton
@ 2024-07-09  5:48                                         ` Sean Whitton
  2024-07-09 11:37                                           ` Eli Zaretskii
  2024-07-09 12:13                                           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 2 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-09  5:48 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

On Sun, Jul 07, 2024 at 09:47:28PM +0800, Po Lu wrote:

> I must ask you to bear with me again, as another detail was not
> correctly accounted for in the last patch.  Please retry with this:

This just crashed.  Apparent trigger was 'emacsclient -t', this time.

verify_image_cache_refcount is not in the backtrace.

I should be able to keep it open in a stable build of Emacs for at least 24h
if you'd like to ask for more.

Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
0x00005555557a21cd in mark_image_cache (c=0x55555672cc50) at image.c:3776
3776		if (c->images[i])

  0 in mark_image_cache of image.c:3776
  1 in mark_frame of alloc.c:7063
  2 in process_mark_stack of alloc.c:7303
  3 in mark_objects of alloc.c:7512
  4 in mark_vectorlike of alloc.c:6891
  5 in mark_frame of alloc.c:7037
  6 in process_mark_stack of alloc.c:7303
  7 in mark_objects of alloc.c:7512
  8 in mark_vectorlike of alloc.c:6891
  9 in mark_window of alloc.c:7072
 10 in process_mark_stack of alloc.c:7307
 11 in mark_object of alloc.c:7504
 12 in mark_char_table of alloc.c:6920
 13 in mark_char_table of alloc.c:6917
 14 in process_mark_stack of alloc.c:7341
 15 in mark_objects of alloc.c:7512
 16 in mark_vectorlike of alloc.c:6891
 17 in mark_buffer of alloc.c:6954
 18 in process_mark_stack of alloc.c:7299
 19 in mark_object of alloc.c:7504
 20 in mark_interval_tree_1 of alloc.c:1529
 21 in traverse_intervals_noorder of intervals.c:243
 22 in traverse_intervals_noorder of intervals.c:248
 23 in mark_interval_tree of alloc.c:1538
 24 in process_mark_stack of alloc.c:7264
 25 in mark_objects of alloc.c:7512
 26 in mark_vectorlike of alloc.c:6891
 27 in mark_buffer of alloc.c:6954
 28 in process_mark_stack of alloc.c:7299
 29 in mark_object of alloc.c:7504
 30 in mark_interval_tree_1 of alloc.c:1529
 31 in traverse_intervals_noorder of intervals.c:243
 32 in mark_interval_tree of alloc.c:1538
 33 in process_mark_stack of alloc.c:7264
 34 in mark_object of alloc.c:7504
 35 in mark_char_table of alloc.c:6920
 36 in mark_char_table of alloc.c:6917
 37 in process_mark_stack of alloc.c:7341
 38 in mark_objects of alloc.c:7512
 39 in mark_vectorlike of alloc.c:6891
 40 in mark_buffer of alloc.c:6954
 41 in process_mark_stack of alloc.c:7299
 42 in mark_object of alloc.c:7504
 43 in mark_char_table of alloc.c:6920
 44 in mark_char_table of alloc.c:6917
 45 in process_mark_stack of alloc.c:7341
 46 in mark_object of alloc.c:7504
 47 in mark_char_table of alloc.c:6920
 48 in mark_char_table of alloc.c:6917
 49 in process_mark_stack of alloc.c:7341
 50 in mark_object of alloc.c:7504
 51 in mark_char_table of alloc.c:6920
 52 in mark_char_table of alloc.c:6917
 53 in process_mark_stack of alloc.c:7341
 54 in mark_objects of alloc.c:7512
 55 in mark_vectorlike of alloc.c:6891
 56 in mark_buffer of alloc.c:6954
 57 in process_mark_stack of alloc.c:7299
 58 in mark_object of alloc.c:7504
 59 in mark_char_table of alloc.c:6920
 60 in mark_char_table of alloc.c:6917
 61 in process_mark_stack of alloc.c:7341
 62 in mark_objects of alloc.c:7512
 63 in mark_vectorlike of alloc.c:6891
 64 in mark_buffer of alloc.c:6954
 65 in process_mark_stack of alloc.c:7299
 66 in mark_objects of alloc.c:7512
 67 in mark_vectorlike of alloc.c:6891
 68 in mark_buffer of alloc.c:6954
 69 in process_mark_stack of alloc.c:7299
 70 in mark_object of alloc.c:7504
 71 in mark_char_table of alloc.c:6920
 72 in mark_char_table of alloc.c:6917
 73 in process_mark_stack of alloc.c:7341
 74 in mark_objects of alloc.c:7512
 75 in mark_vectorlike of alloc.c:6891
 76 in mark_buffer of alloc.c:6954
 77 in process_mark_stack of alloc.c:7299
 78 in mark_objects of alloc.c:7512
 79 in mark_vectorlike of alloc.c:6891
 80 in mark_window of alloc.c:7072
 81 in process_mark_stack of alloc.c:7307
 82 in mark_objects of alloc.c:7512
 83 in mark_vectorlike of alloc.c:6891
 84 in mark_frame of alloc.c:7037
 85 in process_mark_stack of alloc.c:7303
 86 in mark_objects of alloc.c:7512
 87 in mark_vectorlike of alloc.c:6891
 88 in mark_window of alloc.c:7072
 89 in process_mark_stack of alloc.c:7307
 90 in mark_objects of alloc.c:7512
 91 in mark_vectorlike of alloc.c:6891
 92 in mark_buffer of alloc.c:6954
 93 in process_mark_stack of alloc.c:7299
 94 in mark_objects of alloc.c:7512
 95 in mark_vectorlike of alloc.c:6891
 96 in mark_buffer of alloc.c:6954
 97 in process_mark_stack of alloc.c:7299
 98 in mark_objects of alloc.c:7512
 99 in mark_vectorlike of alloc.c:6891
100 in mark_buffer of alloc.c:6954
101 in process_mark_stack of alloc.c:7299
102 in mark_object of alloc.c:7504
103 in mark_interval_tree_1 of alloc.c:1529
104 in traverse_intervals_noorder of intervals.c:243
105 in mark_interval_tree of alloc.c:1538
106 in process_mark_stack of alloc.c:7264
107 in mark_objects of alloc.c:7512
108 in mark_vectorlike of alloc.c:6891
109 in mark_buffer of alloc.c:6954
110 in process_mark_stack of alloc.c:7299
111 in mark_object of alloc.c:7504
112 in mark_interval_tree_1 of alloc.c:1529
113 in traverse_intervals_noorder of intervals.c:243
114 in mark_interval_tree of alloc.c:1538
115 in process_mark_stack of alloc.c:7264
116 in mark_objects of alloc.c:7512
117 in mark_vectorlike of alloc.c:6891
118 in mark_buffer of alloc.c:6954
119 in process_mark_stack of alloc.c:7299
120 in mark_objects of alloc.c:7512
121 in mark_vectorlike of alloc.c:6891
122 in mark_buffer of alloc.c:6954
123 in process_mark_stack of alloc.c:7299
124 in mark_object of alloc.c:7504
125 in mark_interval_tree_1 of alloc.c:1529
126 in traverse_intervals_noorder of intervals.c:243
127 in mark_interval_tree of alloc.c:1538
128 in process_mark_stack of alloc.c:7264
129 in mark_objects of alloc.c:7512
130 in mark_vectorlike of alloc.c:6891
131 in mark_buffer of alloc.c:6954
132 in process_mark_stack of alloc.c:7299
133 in mark_object of alloc.c:7504
134 in mark_char_table of alloc.c:6920
135 in process_mark_stack of alloc.c:7341
136 in mark_object of alloc.c:7504
137 in mark_char_table of alloc.c:6920
138 in process_mark_stack of alloc.c:7341
139 in mark_object of alloc.c:7504
140 in mark_char_table of alloc.c:6920
141 in process_mark_stack of alloc.c:7341
142 in mark_object of alloc.c:7504
143 in mark_char_table of alloc.c:6920
144 in process_mark_stack of alloc.c:7341
145 in mark_objects of alloc.c:7512
146 in mark_vectorlike of alloc.c:6891
147 in mark_buffer of alloc.c:6954
148 in process_mark_stack of alloc.c:7299
149 in mark_objects of alloc.c:7512
150 in mark_vectorlike of alloc.c:6891
151 in mark_buffer of alloc.c:6954
152 in process_mark_stack of alloc.c:7299
153 in mark_objects of alloc.c:7512
154 in mark_vectorlike of alloc.c:6891
155 in mark_buffer of alloc.c:6954
156 in process_mark_stack of alloc.c:7299
157 in mark_objects of alloc.c:7512
158 in mark_vectorlike of alloc.c:6891
159 in mark_buffer of alloc.c:6954
160 in process_mark_stack of alloc.c:7299
161 in mark_objects of alloc.c:7512
162 in mark_vectorlike of alloc.c:6891
163 in mark_buffer of alloc.c:6954
164 in process_mark_stack of alloc.c:7299
165 in mark_object of alloc.c:7504
166 in mark_object_root_visitor of alloc.c:6396
167 in visit_vectorlike_root of alloc.c:6348
168 in visit_buffer_root of alloc.c:6362
169 in visit_static_gc_roots of alloc.c:6374
170 in garbage_collect of alloc.c:6598
171 in maybe_garbage_collect of alloc.c:6507
172 in maybe_gc of /home/spwhitton/src/emacs/primary/src/lisp.h:5929
173 in Ffuncall of eval.c:3088
174 in Fmaphash of fns.c:5974
175 in funcall_subr of eval.c:3163
176 in exec_byte_code of bytecode.c:812
177 in funcall_lambda of eval.c:3252
178 in funcall_general of eval.c:3044
179 in Ffuncall of eval.c:3093
180 in Fapply of eval.c:2722
181 in funcall_subr of eval.c:3184
182 in exec_byte_code of bytecode.c:812
183 in funcall_lambda of eval.c:3252
184 in funcall_general of eval.c:3044
185 in Ffuncall of eval.c:3093
186 in Fapply of eval.c:2765
187 in apply1 of eval.c:2981
188 in read_process_output_call of process.c:6129
189 in internal_condition_case_1 of eval.c:1637
190 in read_and_dispose_of_process_output of process.c:6498
191 in read_process_output of process.c:6266
192 in wait_reading_process_output of process.c:5947
193 in sit_for of dispnew.c:6335
194 in read_char of keyboard.c:2923
195 in read_key_sequence of keyboard.c:10743
196 in command_loop_1 of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
197 in internal_condition_case of eval.c:1613
198 in command_loop_2 of keyboard.c:1168
199 in internal_catch of eval.c:1292
200 in command_loop of /home/spwhitton/src/emacs/primary/src/lisp.h:1178
201 in recursive_edit_1 of keyboard.c:754
202 in Frecursive_edit of keyboard.c:837
203 in main of emacs.c:2631

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09  5:48                                         ` Sean Whitton
@ 2024-07-09 11:37                                           ` Eli Zaretskii
  2024-07-10  1:12                                             ` Sean Whitton
  2024-07-09 12:13                                           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  1 sibling, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-09 11:37 UTC (permalink / raw)
  To: Sean Whitton; +Cc: luangruo, 71929

> Date: Tue, 9 Jul 2024 13:48:32 +0800
> From: Sean Whitton <spwhitton@spwhitton.name>
> Cc: 71929@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>
> 
> On Sun, Jul 07, 2024 at 09:47:28PM +0800, Po Lu wrote:
> 
> > I must ask you to bear with me again, as another detail was not
> > correctly accounted for in the last patch.  Please retry with this:
> 
> This just crashed.  Apparent trigger was 'emacsclient -t', this time.
> 
> verify_image_cache_refcount is not in the backtrace.
> 
> I should be able to keep it open in a stable build of Emacs for at least 24h
> if you'd like to ask for more.

Thanks.  How many frames, approximately, were alive in this session
when it crashed?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09  5:48                                         ` Sean Whitton
  2024-07-09 11:37                                           ` Eli Zaretskii
@ 2024-07-09 12:13                                           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-09 13:44                                             ` Sean Whitton
  1 sibling, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-09 12:13 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929, Eli Zaretskii

Sean Whitton <spwhitton@spwhitton.name> writes:

> On Sun, Jul 07, 2024 at 09:47:28PM +0800, Po Lu wrote:
>
>> I must ask you to bear with me again, as another detail was not
>> correctly accounted for in the last patch.  Please retry with this:
>
> This just crashed.  Apparent trigger was 'emacsclient -t', this time.
>
> verify_image_cache_refcount is not in the backtrace.
>
> I should be able to keep it open in a stable build of Emacs for at least 24h
> if you'd like to ask for more.
>
> Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
> 0x00005555557a21cd in mark_image_cache (c=0x55555672cc50) at image.c:3776
> 3776		if (c->images[i])

And this is a segmentation fault, not a trap.  Can you establish when
the frame in question was created, how and where it received its current
image cache, and whether this frame exists in Vframe_list?

If the answer to the final question is no, can anyone surmise how it is
that a live frame's image cache might be prematurely deleted without its
references being detected by verify_image_cache_refcount?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09 12:13                                           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-09 13:44                                             ` Sean Whitton
  2024-07-09 14:03                                               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-09 13:44 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

On Tue, Jul 09, 2024 at 08:13:28PM +0800, Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors wrote:
> Sean Whitton <spwhitton@spwhitton.name> writes:
> 
> > On Sun, Jul 07, 2024 at 09:47:28PM +0800, Po Lu wrote:
> >
> >> I must ask you to bear with me again, as another detail was not
> >> correctly accounted for in the last patch.  Please retry with this:
> >
> > This just crashed.  Apparent trigger was 'emacsclient -t', this time.
> >
> > verify_image_cache_refcount is not in the backtrace.
> >
> > I should be able to keep it open in a stable build of Emacs for at least 24h
> > if you'd like to ask for more.
> >
> > Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
> > 0x00005555557a21cd in mark_image_cache (c=0x55555672cc50) at image.c:3776
> > 3776		if (c->images[i])
> 
> And this is a segmentation fault, not a trap.  Can you establish when
> the frame in question was created, how and where it received its current
> image cache, and whether this frame exists in Vframe_list?

I'm afraid I'm not familiar with any of these data structures.  I don't know
what these image caches are.

In the mark_frame stack frame I did "p f" to obtain the address
0x555559f61330.  I then did the "while $cons" thing you posted in another
message, and searched its output for this address, and it is not present.

So perhaps this means the frame is not present in Vframe_list.



-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09 13:44                                             ` Sean Whitton
@ 2024-07-09 14:03                                               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-09 14:18                                                 ` Eli Zaretskii
  2024-07-10  1:12                                                 ` Sean Whitton
  0 siblings, 2 replies; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-09 14:03 UTC (permalink / raw)
  To: Sean Whitton; +Cc: 71929, Eli Zaretskii

Sean Whitton <spwhitton@spwhitton.name> writes:

> On Tue, Jul 09, 2024 at 08:13:28PM +0800, Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors wrote:
>> Sean Whitton <spwhitton@spwhitton.name> writes:
>> 
>> > On Sun, Jul 07, 2024 at 09:47:28PM +0800, Po Lu wrote:
>> >
>> >> I must ask you to bear with me again, as another detail was not
>> >> correctly accounted for in the last patch.  Please retry with this:
>> >
>> > This just crashed.  Apparent trigger was 'emacsclient -t', this time.
>> >
>> > verify_image_cache_refcount is not in the backtrace.
>> >
>> > I should be able to keep it open in a stable build of Emacs for at least 24h
>> > if you'd like to ask for more.
>> >
>> > Thread 1 "emacs" received signal SIGSEGV, Segmentation fault.
>> > 0x00005555557a21cd in mark_image_cache (c=0x55555672cc50) at image.c:3776
>> > 3776		if (c->images[i])
>> 
>> And this is a segmentation fault, not a trap.  Can you establish when
>> the frame in question was created, how and where it received its current
>> image cache, and whether this frame exists in Vframe_list?
>
> I'm afraid I'm not familiar with any of these data structures.  I don't know
> what these image caches are.
>
> In the mark_frame stack frame I did "p f" to obtain the address
> 0x555559f61330.  I then did the "while $cons" thing you posted in another
> message, and searched its output for this address, and it is not present.
>
> So perhaps this means the frame is not present in Vframe_list.

OK, I believe I understand the source of these crashes.  A frame whose
image cache is shared among several frames is destroyed, but its
`image_cache' field is never cleared after it is destroyed, as its cache
continues to be referenced, and, if references to the dead frame remain,
GC attempts to mark the said image cache although its validity is no
longer guaranteed.  In earlier Emacs versions, this problem would have
appeared if references to dead frames were preserved beyond the
destruction of a display structure.  This has been corrected on the
emacs-30 branch, and therefore if the crashes do not resurface in a few
days, I will close this ticket.

Thanks.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09 14:03                                               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-09 14:18                                                 ` Eli Zaretskii
  2024-07-09 15:02                                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-10  1:12                                                 ` Sean Whitton
  1 sibling, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-09 14:18 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, spwhitton

> From: Po Lu <luangruo@yahoo.com>
> Cc: 71929@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>
> Date: Tue, 09 Jul 2024 22:03:34 +0800
> 
> OK, I believe I understand the source of these crashes.  A frame whose
> image cache is shared among several frames is destroyed, but its
> `image_cache' field is never cleared after it is destroyed, as its cache
> continues to be referenced, and, if references to the dead frame remain,
> GC attempts to mark the said image cache although its validity is no
> longer guaranteed.  In earlier Emacs versions, this problem would have
> appeared if references to dead frames were preserved beyond the
> destruction of a display structure.  This has been corrected on the
> emacs-30 branch, and therefore if the crashes do not resurface in a few
> days, I will close this ticket.

Thanks, but I don't think I understand this part of the change you
installed:

  --- a/src/image.c
  +++ b/src/image.c
  @@ -2304,23 +2304,18 @@ uncache_image (struct frame *f, Lisp_Object spec)
   free_image_cache (struct frame *f)
   {
     struct image_cache *c = FRAME_IMAGE_CACHE (f);
  -  if (c)
  -    {
  -      ptrdiff_t i;
  +  ptrdiff_t i;

  -      /* Cache should not be referenced by any frame when freed.  */
  -      eassert (c->refcount == 0);
  +  /* Cache should not be referenced by any frame when freed.  */
  +  eassert (c->refcount == 0);

  -      for (i = 0; i < c->used; ++i)
  -       free_image (f, c->images[i]);
  -      xfree (c->images);
  -      xfree (c->buckets);
  -      xfree (c);
  -      FRAME_IMAGE_CACHE (f) = NULL;
  -    }
  +  for (i = 0; i < c->used; ++i)
  +    free_image (f, c->images[i]);
  +  xfree (c->images);
  +  xfree (c->buckets);
  +  xfree (c);
   }

This basically removes the test of 'c' being non-NULL, leaving the
rest of the code unchanged.  But if 'c' is NULL, dereferencing it in
the following code will segfault, so why remove the test?  In
particular, what about frames that were not yet allocated the image
cache (could this happen with TTY frames, for example)?

What am I missing here?





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09 14:18                                                 ` Eli Zaretskii
@ 2024-07-09 15:02                                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-09 15:45                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-09 15:02 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 71929, spwhitton

Eli Zaretskii <eliz@gnu.org> writes:

>> From: Po Lu <luangruo@yahoo.com>
>> Cc: 71929@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>
>> Date: Tue, 09 Jul 2024 22:03:34 +0800
>> 
>> OK, I believe I understand the source of these crashes.  A frame
>> whose
>> image cache is shared among several frames is destroyed, but its
>> `image_cache' field is never cleared after it is destroyed, as its
>> cache
>> continues to be referenced, and, if references to the dead frame
>> remain,
>> GC attempts to mark the said image cache although its validity is no
>> longer guaranteed.  In earlier Emacs versions, this problem would
>> have
>> appeared if references to dead frames were preserved beyond the
>> destruction of a display structure.  This has been corrected on the
>> emacs-30 branch, and therefore if the crashes do not resurface in a
>> few
>> days, I will close this ticket.
>
> Thanks, but I don't think I understand this part of the change you
> installed:
>
>   --- a/src/image.c
>   +++ b/src/image.c
>   @@ -2304,23 +2304,18 @@ uncache_image (struct frame *f, Lisp_Object spec)
>    free_image_cache (struct frame *f)
>    {
>      struct image_cache *c = FRAME_IMAGE_CACHE (f);
>   -  if (c)
>   -    {
>   -      ptrdiff_t i;
>   +  ptrdiff_t i;
>
>   -      /* Cache should not be referenced by any frame when freed.  */
>   -      eassert (c->refcount == 0);
>   +  /* Cache should not be referenced by any frame when freed.  */
>   +  eassert (c->refcount == 0);
>
>   -      for (i = 0; i < c->used; ++i)
>   -       free_image (f, c->images[i]);
>   -      xfree (c->images);
>   -      xfree (c->buckets);
>   -      xfree (c);
>   -      FRAME_IMAGE_CACHE (f) = NULL;
>   -    }
>   +  for (i = 0; i < c->used; ++i)
>   +    free_image (f, c->images[i]);
>   +  xfree (c->images);
>   +  xfree (c->buckets);
>   +  xfree (c);
>    }
>
> This basically removes the test of 'c' being non-NULL, leaving the
> rest of the code unchanged.  But if 'c' is NULL, dereferencing it in
> the following code will segfault, so why remove the test?  In
> particular, what about frames that were not yet allocated the image
> cache (could this happen with TTY frames, for example)?
>
> What am I missing here?

That free_frame_faces has been the sole caller of this function for
quite some time, and it already performs the same test around its call
to free_image_cache.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09 15:02                                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
@ 2024-07-09 15:45                                                     ` Eli Zaretskii
  0 siblings, 0 replies; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-09 15:45 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, spwhitton

> From: Po Lu <luangruo@yahoo.com>
> Cc: spwhitton@spwhitton.name,  71929@debbugs.gnu.org
> Date: Tue, 09 Jul 2024 23:02:22 +0800
> 
> Eli Zaretskii <eliz@gnu.org> writes:
> 
> >> From: Po Lu <luangruo@yahoo.com>
> >> Cc: 71929@debbugs.gnu.org,  Eli Zaretskii <eliz@gnu.org>
> >> Date: Tue, 09 Jul 2024 22:03:34 +0800
> >> 
> >> OK, I believe I understand the source of these crashes.  A frame
> >> whose
> >> image cache is shared among several frames is destroyed, but its
> >> `image_cache' field is never cleared after it is destroyed, as its
> >> cache
> >> continues to be referenced, and, if references to the dead frame
> >> remain,
> >> GC attempts to mark the said image cache although its validity is no
> >> longer guaranteed.  In earlier Emacs versions, this problem would
> >> have
> >> appeared if references to dead frames were preserved beyond the
> >> destruction of a display structure.  This has been corrected on the
> >> emacs-30 branch, and therefore if the crashes do not resurface in a
> >> few
> >> days, I will close this ticket.
> >
> > Thanks, but I don't think I understand this part of the change you
> > installed:
> >
> >   --- a/src/image.c
> >   +++ b/src/image.c
> >   @@ -2304,23 +2304,18 @@ uncache_image (struct frame *f, Lisp_Object spec)
> >    free_image_cache (struct frame *f)
> >    {
> >      struct image_cache *c = FRAME_IMAGE_CACHE (f);
> >   -  if (c)
> >   -    {
> >   -      ptrdiff_t i;
> >   +  ptrdiff_t i;
> >
> >   -      /* Cache should not be referenced by any frame when freed.  */
> >   -      eassert (c->refcount == 0);
> >   +  /* Cache should not be referenced by any frame when freed.  */
> >   +  eassert (c->refcount == 0);
> >
> >   -      for (i = 0; i < c->used; ++i)
> >   -       free_image (f, c->images[i]);
> >   -      xfree (c->images);
> >   -      xfree (c->buckets);
> >   -      xfree (c);
> >   -      FRAME_IMAGE_CACHE (f) = NULL;
> >   -    }
> >   +  for (i = 0; i < c->used; ++i)
> >   +    free_image (f, c->images[i]);
> >   +  xfree (c->images);
> >   +  xfree (c->buckets);
> >   +  xfree (c);
> >    }
> >
> > This basically removes the test of 'c' being non-NULL, leaving the
> > rest of the code unchanged.  But if 'c' is NULL, dereferencing it in
> > the following code will segfault, so why remove the test?  In
> > particular, what about frames that were not yet allocated the image
> > cache (could this happen with TTY frames, for example)?
> >
> > What am I missing here?
> 
> That free_frame_faces has been the sole caller of this function for
> quite some time, and it already performs the same test around its call
> to free_image_cache.

Such dependencies are not a good idea, IME, for public (non-static)
functions, if at all, not in the long run.  At the very least, please
add an assertion at entry to the function which verifies that the
cache is not NULL.  That will at least serve as prominent
documentation of the function's contract.





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09 11:37                                           ` Eli Zaretskii
@ 2024-07-10  1:12                                             ` Sean Whitton
  0 siblings, 0 replies; 48+ messages in thread
From: Sean Whitton @ 2024-07-10  1:12 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: luangruo, 71929

Hello,

On Tue 09 Jul 2024 at 02:37pm +03, Eli Zaretskii wrote:

>> Date: Tue, 9 Jul 2024 13:48:32 +0800
>> From: Sean Whitton <spwhitton@spwhitton.name>
>> Cc: 71929@debbugs.gnu.org, Eli Zaretskii <eliz@gnu.org>
>>
>> On Sun, Jul 07, 2024 at 09:47:28PM +0800, Po Lu wrote:
>>
>> > I must ask you to bear with me again, as another detail was not
>> > correctly accounted for in the last patch.  Please retry with this:
>>
>> This just crashed.  Apparent trigger was 'emacsclient -t', this time.
>>
>> verify_image_cache_refcount is not in the backtrace.
>>
>> I should be able to keep it open in a stable build of Emacs for at least 24h
>> if you'd like to ask for more.
>
> Thanks.  How many frames, approximately, were alive in this session
> when it crashed?

Sorry I missed replying to this.  I think there were three or four.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-09 14:03                                               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  2024-07-09 14:18                                                 ` Eli Zaretskii
@ 2024-07-10  1:12                                                 ` Sean Whitton
  2024-07-24 13:31                                                   ` Basil L. Contovounesios
  1 sibling, 1 reply; 48+ messages in thread
From: Sean Whitton @ 2024-07-10  1:12 UTC (permalink / raw)
  To: Po Lu; +Cc: 71929, Eli Zaretskii

Hello,

On Tue 09 Jul 2024 at 10:03pm +08, Po Lu wrote:

> OK, I believe I understand the source of these crashes.  A frame whose
> image cache is shared among several frames is destroyed, but its
> `image_cache' field is never cleared after it is destroyed, as its cache
> continues to be referenced, and, if references to the dead frame remain,
> GC attempts to mark the said image cache although its validity is no
> longer guaranteed.  In earlier Emacs versions, this problem would have
> appeared if references to dead frames were preserved beyond the
> destruction of a display structure.  This has been corrected on the
> emacs-30 branch, and therefore if the crashes do not resurface in a few
> days, I will close this ticket.

Thanks for the fix, running it now.

-- 
Sean Whitton





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-10  1:12                                                 ` Sean Whitton
@ 2024-07-24 13:31                                                   ` Basil L. Contovounesios
  2024-07-24 13:38                                                     ` Eli Zaretskii
  0 siblings, 1 reply; 48+ messages in thread
From: Basil L. Contovounesios @ 2024-07-24 13:31 UTC (permalink / raw)
  To: Sean Whitton; +Cc: Po Lu, 71929, Eli Zaretskii

FWIW I can no longer get master to crash.

Previously (few weeks ago) I could fairly reliably get a crash by
closing the last remaining graphical emacsclient frame.

This happens often in my typical workflow where EDITOR is effectively
'emacsclient -c' and pop-up-frames is non-nil, so frames are constantly
being created and then all deleted.

Thanks for fixing this,
-- 
Basil





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-24 13:31                                                   ` Basil L. Contovounesios
@ 2024-07-24 13:38                                                     ` Eli Zaretskii
  2024-07-24 14:10                                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 1 reply; 48+ messages in thread
From: Eli Zaretskii @ 2024-07-24 13:38 UTC (permalink / raw)
  To: Basil L. Contovounesios; +Cc: luangruo, 71929, spwhitton

> From: "Basil L. Contovounesios" <basil@contovou.net>
> Cc: Po Lu <luangruo@yahoo.com>,  71929@debbugs.gnu.org,  Eli Zaretskii
>  <eliz@gnu.org>
> Date: Wed, 24 Jul 2024 15:31:03 +0200
> 
> FWIW I can no longer get master to crash.
> 
> Previously (few weeks ago) I could fairly reliably get a crash by
> closing the last remaining graphical emacsclient frame.
> 
> This happens often in my typical workflow where EDITOR is effectively
> 'emacsclient -c' and pop-up-frames is non-nil, so frames are constantly
> being created and then all deleted.
> 
> Thanks for fixing this,

Thanks for telling us.  I think we should close this bug now (and
reopen if it turns out it was not fixed).





^ permalink raw reply	[flat|nested] 48+ messages in thread

* bug#71929: 30.0.60; crash in mark_image_cache
  2024-07-24 13:38                                                     ` Eli Zaretskii
@ 2024-07-24 14:10                                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
  0 siblings, 0 replies; 48+ messages in thread
From: Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors @ 2024-07-24 14:10 UTC (permalink / raw)
  To: Eli Zaretskii; +Cc: 71929-done, Basil L. Contovounesios, spwhitton

Eli Zaretskii <eliz@gnu.org> writes:

>> From: "Basil L. Contovounesios" <basil@contovou.net>
>> Cc: Po Lu <luangruo@yahoo.com>,  71929@debbugs.gnu.org,  Eli Zaretskii
>>  <eliz@gnu.org>
>> Date: Wed, 24 Jul 2024 15:31:03 +0200
>> 
>> FWIW I can no longer get master to crash.
>> 
>> Previously (few weeks ago) I could fairly reliably get a crash by
>> closing the last remaining graphical emacsclient frame.
>> 
>> This happens often in my typical workflow where EDITOR is effectively
>> 'emacsclient -c' and pop-up-frames is non-nil, so frames are constantly
>> being created and then all deleted.
>> 
>> Thanks for fixing this,
>
> Thanks for telling us.  I think we should close this bug now (and
> reopen if it turns out it was not fixed).

I agree, now done.





^ permalink raw reply	[flat|nested] 48+ messages in thread

end of thread, other threads:[~2024-07-24 14:10 UTC | newest]

Thread overview: 48+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-07-04  2:33 bug#71929: 30.0.60; crash in mark_image_cache Sean Whitton
2024-07-04  2:44 ` Sean Whitton
2024-07-04  5:53   ` Eli Zaretskii
2024-07-04  6:03     ` Eli Zaretskii
2024-07-04  6:17       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-04  6:42         ` Sean Whitton
2024-07-04  6:59           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-04  9:56             ` Sean Whitton
2024-07-04 12:28               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-05  7:52                 ` Sean Whitton
2024-07-04  7:40           ` Eli Zaretskii
2024-07-04  9:57             ` Sean Whitton
2024-07-04 12:48               ` Eli Zaretskii
2024-07-05  0:13       ` Sean Whitton
2024-07-05  6:27         ` Eli Zaretskii
2024-07-05  6:41           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-05  7:37             ` Eli Zaretskii
2024-07-05  9:36               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-05 11:10                 ` Eli Zaretskii
2024-07-05 11:40                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-05 12:46                     ` Sean Whitton
2024-07-06  2:41                     ` Sean Whitton
2024-07-06  6:08                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-07  2:40                         ` Sean Whitton
2024-07-07  2:43                         ` Sean Whitton
2024-07-07  2:46                           ` Sean Whitton
2024-07-07  4:04                             ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-07  4:54                               ` Sean Whitton
2024-07-07  7:08                                 ` Eli Zaretskii
2024-07-07  7:41                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-07 13:16                                     ` Sean Whitton
2024-07-07 13:47                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-07 14:45                                         ` Sean Whitton
2024-07-09  5:48                                         ` Sean Whitton
2024-07-09 11:37                                           ` Eli Zaretskii
2024-07-10  1:12                                             ` Sean Whitton
2024-07-09 12:13                                           ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-09 13:44                                             ` Sean Whitton
2024-07-09 14:03                                               ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-09 14:18                                                 ` Eli Zaretskii
2024-07-09 15:02                                                   ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-09 15:45                                                     ` Eli Zaretskii
2024-07-10  1:12                                                 ` Sean Whitton
2024-07-24 13:31                                                   ` Basil L. Contovounesios
2024-07-24 13:38                                                     ` Eli Zaretskii
2024-07-24 14:10                                                       ` Po Lu via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-07-06  6:40                       ` Eli Zaretskii
2024-07-07  2:39                         ` Sean Whitton

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).