bzr emacs(24.4.50.1) crashes when using auto-revert-tail-mode
Ken Brown
kbrown@cornell.edu
Fri Jun 20 14:27:00 GMT 2014
On 6/20/2014 2:04 PM, Eli Zaretskii wrote:
>> Date: Thu, 19 Jun 2014 09:11:37 -0400
>> From: Ken Brown
>>
>> On 6/18/2014 1:46 PM, Ken Brown wrote:
>>> On 6/18/2014 11:06 AM, Filipp Gunbin wrote:
>>>> I'm not sure whether this is Cygwin-specific, but I'm not able to test
>>>> it on other OS, so here are the steps to reproduce:
>>>>
>>>> emacs -Q
>>>> C-x C-r <some_file>
>>>
>>> You mean C-x C-f
>>>
>>>> M-x auto-revert-tail-mode
>>>> wait for few seconds -> emacs crashes
>>>
>>> I can confirm this, but on 32-bit Cygwin only; there's no crash on
>>> 64-bit Cygwin. (This is a refreshing change from the emacs crashes
>>> people have been reporting on 64-bit Cygwin.)
>>>
>>> Here's the backtrace:
>>>
>>> #0 0x00000000 in ?? ()
>>> No symbol table info available.
>>> #1 0x610f842f in pthread_mutex::lock (this=0x0)
>>> at /usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/thread.cc:1745
>>> self = <optimized out>
>>> result = <optimized out>
>>> __PRETTY_FUNCTION__ = "int pthread_mutex::lock()"
>>> #2 0x00000201 in ?? ()
>>> No symbol table info available.
>>>
>>> Lisp Backtrace:
>>> "gfile-add-watch" (0x288dc8)
>>> "file-notify-add-watch" (0x2890c8)
>>> "byte-code" (0x289340)
>>> "auto-revert-notify-add-watch" (0x289778)
>>> "auto-revert-buffers" (0x289b4c)
>>> "apply" (0x289b48)
>>> "byte-code" (0x289dc0)
>>> "timer-event-handler" (0x28a1fc)
>>>
>>> I'll look into this. In the meantime, you can work around it by
>>> configuring --with-file-notification=no.
>>
>> I'm afraid I ran into a brick wall trying to debug this. I wanted to see what gfile-add-watch was doing, so I ran emacs under gdb with a breakpoint at Fgfile_add_watch and then a breakpoint at g_file_monitor (a Glib function called by Fgfile_add_watch). When I tried to step through this function, I hit an assertion violation in gdb. This is repeatable. A log of the gdb session is appended below.
>>
>> The problem occurs only on 32-bit Cygwin. On 64-bit Cygwin, I can step through Fgfile_add_watch without a problem.
>
> Debugging Glib applications is not for the faint at heart. Its
> OO-like objects intentionally conceal their innards from the outside
> world, and appear as opaque objects in the debugger, unless you
> actually step deep enough into the methods.
>
> I generally find myself unable to debug Glib, unless I build Glib
> without optimizations and with -g3.
>
> I'd suggest to begin with looking at this from the Emacs side. Do I
> understand correctly that this works with previous versions of w32
> Emacs? If someone can show which past version of Cygwin-w32 build of
> Emacs worked with gfilenotify, then looking at the differences between
> then and now might show the way.
Maybe Filipp can answer this. I've never (knowingly) had occasion to use gfilenotify. And even if I had used it, I almost always use 64-bit Cygwin unless I'm testing something or responding to a bug report.
> If no one can tell what past version worked, then I suggest to build
> Glib with -O0 -g3, and debug that. From the crash traceback, it
> sounds like pthreads might also be involved, so I recommend to build
> that with -O0 -g3 as well. Then see if the backtrace becomes more
> useful.
>
> Also, does the 64-bit build use the same versions of Glib and
> pthreads?
Yes.
>> (gdb) b Fgfile_add_watch
>> Breakpoint 1 at 0x5f7a3f: file /usr/src/debug/emacs-24.3.91-2/src/gfilenotify.c, line 170.
>> (gdb) r -Q
>> Starting program: /usr/bin/emacs-w32.exe -Q
>> [...]
>> Breakpoint 1, Fgfile_add_watch (file=-2145740495, flags=13798510,
>> callback=-2146880150)
>> at /usr/src/debug/emacs-24.3.91-2/src/gfilenotify.c:170
>> 170 GFileMonitorFlags gflags = G_FILE_MONITOR_NONE;
>> (gdb) b g_file_monitor
>> Breakpoint 2 at 0x6a357e50: file /usr/src/debug/glib2.0-2.38.2-2/gio/gfile.c, line 5338.
>> (gdb) c
>> Continuing.
>> [...]
>> Breakpoint 2, g_file_monitor (file=0x80061530,
>> flags=(G_FILE_MONITOR_WATCH_MOUNTS | G_FILE_MONITOR_SEND_MOVED),
>> cancellable=0x0, error=0x0)
>> at /usr/src/debug/glib2.0-2.38.2-2/gio/gfile.c:5338
>> 5338 {
>> (gdb) n
>> 5339 if (g_file_query_file_type (file, 0, cancellable) == G_FILE_TYPE_DIRECTORY)
>> (gdb) n
>> 5338 {
>> (gdb) n
>> 5339 if (g_file_query_file_type (file, 0, cancellable) == G_FILE_TYPE_DIRECTORY)
>> (gdb) n
>> 5340 return g_file_monitor_directory (file,
>> (gdb) n
>> 5339 if (g_file_query_file_type (file, 0, cancellable) == G_FILE_TYPE_DIRECTORY)
>> (gdb) n
>> 5341 flags & ~G_FILE_MONITOR_WATCH_HARD_LINKS,
>> (gdb) n
>> 5340 return g_file_monitor_directory (file,
>> (gdb) n
>> 5345 }
>> (gdb) n
>> 5340 return g_file_monitor_directory (file,
>> (gdb) n
>> g_file_monitor_directory (file=0x80061530,
>> flags=(G_FILE_MONITOR_WATCH_MOUNTS | G_FILE_MONITOR_SEND_MOVED),
>> cancellable=0x0, error=0x0)
>> at /usr/src/debug/glib2.0-2.38.2-2/gio/gfile.c:5235
>> 5235 {
>> (gdb) n
>> 5238 g_return_val_if_fail (G_IS_FILE (file), NULL);
>> (gdb) n
>> /netrel/src/gdb-7.6.50-4/gdb/infrun.c:1942: internal-error: resume: Assertion `pc_in_thread_step_range (pc, tp)' failed.
>> A problem internal to GDB has been detected,
>> further debugging may prove unreliable.
>> Quit this debugging session? (y or n) y
>
> Why did you need to step through the Glib code? AFAIU, the file
> monitor did trigger, so what I would first look at is the data it
> delivers back to Emacs, not how the monitor works internally. Did you
> try that?
Yes, that's what I tried first. I get a SEGV right after the call to g_file_monitor:
(gdb) b Fgfile_add_watch
Breakpoint 3 at 0x5f7a3f: file /usr/src/debug/emacs-24.3.91-2/src/gfilenotify.c, line 170.
(gdb) r -Q
[...]
Breakpoint 3, Fgfile_add_watch (file=-2146927663, flags=12352654,
callback=-2145717982)
at /usr/src/debug/emacs-24.3.91-2/src/gfilenotify.c:170
170 GFileMonitorFlags gflags = G_FILE_MONITOR_NONE;
(gdb) n
173 CHECK_STRING (file);
(gdb) n
174 file = Fdirectory_file_name (Fexpand_file_name (file, Qnil));
(gdb) n
175 if (NILP (Ffile_exists_p (file)))
(gdb) n
178 CHECK_LIST (flags);
(gdb) n
180 if (!FUNCTIONP (callback))
(gdb) n
184 gfile = g_file_new_for_path (SSDATA (ENCODE_FILE (file)));
(gdb) n
[New Thread 6112.0x974]
[New Thread 6112.0x4c4]
187 if (!NILP (Fmember (Qwatch_mounts, flags)))
(gdb) n
188 gflags |= G_FILE_MONITOR_WATCH_MOUNTS;
(gdb) n
189 if (!NILP (Fmember (Qsend_moved, flags)))
(gdb) n
190 gflags |= G_FILE_MONITOR_SEND_MOVED;
(gdb) n
193 monitor = g_file_monitor (gfile, gflags, NULL, NULL);
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x00000000 in ?? ()
(gdb) bt full
#0 0x00000000 in ?? ()
No symbol table info available.
#1 0x610f842f in pthread_mutex::lock (this=0x0)
at /usr/src/debug/cygwin-1.7.30-1/winsup/cygwin/thread.cc:1745
self = <optimized out>
result = <optimized out>
__PRETTY_FUNCTION__ = "int pthread_mutex::lock()"
#2 0x00000201 in ?? ()
No symbol table info available.
Lisp Backtrace:
"gfile-add-watch" (0x288d48)
"file-notify-add-watch" (0x289048)
"byte-code" (0x2892c0)
"auto-revert-notify-add-watch" (0x2896f8)
"auto-revert-buffers" (0x289acc)
"apply" (0x289ac8)
"byte-code" (0x289d40)
"timer-event-handler" (0x28a17c)
--
Problem reports: http://cygwin.com/problems.html
FAQ: http://cygwin.com/faq/
Documentation: http://cygwin.com/docs.html
Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple
More information about the Cygwin
mailing list