Subject: Re: bug#12774: 24.2.50; EMACS 24.2.50.1 crashing‏

From: Eli Zaretskii <[email-masked]>
Date: Sun, 04 Nov 2012 18:44:51 +0200

> From: Vincent Belaïche <[email-masked]>
> Date: Sat, 3 Nov 2012 23:24:15 +0100
> 
> The crash can happen without my doing anything special previously except opening that attached file USING_CEDET_FROM_BZR which causes loading orgmode. Also it seems that it has to do with the size of my init.el file --- and not only to its content.

OK.  Here's what I'm asking you to do.  Start Emacs under GDB, like
this:

 c:\Documents and Settings\Vincent>gdb C:/Programme/GNU/Emacs/bin/emacs.exe

(Note: do NOT invoke Emacs via the --exec= switch, since that does not
load the symbol table and other debugging info from emacs.exe.)

Once GDB shows its prompt, type these commands:

 (gdb) break ralloc.c:353
 (gdb) break w32heap.c:141
 (gdb) break w32heap.c:155
 (gdb) run

Please verify that the 3 source lines where you set breakpoints are
the ones marked below:

 ralloc.c:

      if ((*real_morecore) (- excess) == 0)
	{
	  /* If the system didn't want that much memory back, adjust
             the end of the last heap to reflect that.  This can occur
             if break_value is still within the original data segment.  */
 >>>>>>>  last_heap->end = (char *) last_heap->end + excess;
	  /* Make sure that the result of the adjustment is accurate.
             It should be, for the else clause above; the other case,
             which returns the entire last heap to the system, seems
             unlikely to trigger this mode of failure.  */
	  if (last_heap->end != (*real_morecore) (0))
	    emacs_abort ();
	}

 w32heap.c:

      /* Sanity checks.  */
      if ((data_region_end - size) < data_region_base)
 >>>>>	return NULL;

      /* We can only decommit full pages, so allow for
	 partial deallocation [cga].  */
      new_data_region_end = (data_region_end - size);
      new_data_region_end = (unsigned char *)
	((DWORD_PTR) (new_data_region_end + syspage_mask) & ~syspage_mask);
      new_size = real_data_region_end - new_data_region_end;
      real_data_region_end = new_data_region_end;
      if (new_size > 0)
	{
	  /* Decommit size bytes from the end of the heap.  */
	  if (using_dynamic_heap
	      && !VirtualFree (real_data_region_end, new_size, MEM_DECOMMIT))
 >>>>>	    return NULL;
 	}

If your sources are different, adjust the line numbers in the "break"
commands accordingly.

Now do whatever you usually do to get Emacs to crash, and wait for one
of the breakpoints to break (they will break before the crash, so
don't expect the abort dialog).

Then please tell which of the breakpoints on the 2 "return NULL" in
w32heap.c breaks.  If it's the second one, the one after the call to
VirtualFree, please type this command:

 (gdb) print w32_last-error()

(note the parentheses: they are important) and tell what it prints.

Then please type "continue", which should stop at the breakpoint in
ralloc.c, and tell what do the following commands produce:

 (gdb) print last_heap->end
 (gdb) print last_heap->bloc_start
 (gdb) print excess
 (gdb) print sbrk(0)

Also, please type "xbacktrace" and post the Lisp-level backtrace this
produces.  If you don't invoke GDB from the src directory, you may
need to type "source /path/to/emacs/src/.gdbinit" to make "xbacktrace"
work.

Thanks.