This is the mail archive of the cygwin-patches mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: [PATCH 2/3] Provide ucontext to signal handlers


On 04/04/2015 09:40, Corinna Vinschen wrote:
On Apr  3 23:09, Jon TURNEY wrote:
On 01/04/2015 15:22, Corinna Vinschen wrote:
On Apr  1 14:19, Jon TURNEY wrote:
Add ucontext.h header, defining ucontext_t and mcontext_t types.

Provide sigaction sighandlers with a ucontext_t parameter, containing stack and
context information.

	* include/sys/ucontext.h : New header.
	* include/ucontext.h : Ditto.
	* exceptions.cc (call_signal_handler): Provide ucontext_t
	parameter to signal handler function.

Patch is ok with a single change:  Please add a "FIXME?" comment to:

   else
     RtlCaptureContext();

On second thought, calling RtlCaptureContext here is probably wrong.

Wrong and also dangerous.

This causes random crashes on x86.

It seems that RtlCaptureContext requires the framepointer of the calling
function in ebp, which it uses to report the rip and rsp of it's caller.

It also seems that gcc can decide to optimize the setting of the
framepointer away, irrespective of the fact that -fomit-frame-pointer is not
used when building exceptions.cc

If _cygtls::call_signal_handler() happens to get called with ebp pointing to
an invalid memory address, as seems to happen occasionally, we will fault in
RtlCaptureContext.  (in all cases, the eip and ebp in the returned context
are incorrect)

I wrote the attached patch, which fakes a callframe for RtlCaptureContext to
avoid these possible crashes, but this needs more work to correctly report
eip and ebp

Maybe it's simpler than that?  Looking into the GCC info pages, I found
this:

      Starting with GCC version 4.6, the default setting (when not
      optimizing for size) for 32-bit GNU/Linux x86 and 32-bit Darwin x86
      targets has been changed to '-fomit-frame-pointer'.  The default
      can be reverted to '-fno-omit-frame-pointer' by configuring GCC
      with the '--enable-frame-pointer' configure option.

      Enabled at levels '-O', '-O2', '-O3', '-Os'.
      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Very good. I hadn't noticed that sentence and was just looking at the "-O also turns on -fomit-frame-pointer on machines where doing so does not interfere with debugging. "

So it seems adding -fomit-frame-pointer file by file in Makefile.in
(when building with -O2) is moot and only has an effect when building
unoptimized, otherwise all files are built with -fomit-frame-pointer
anyway.

So, what if we drop all the -fomit-frame-pointer from Makefile.in and
add an

   exceptions_CFLAGS:=-fno-omit-frame-pointer

Does that help?

Yes, that seems to do the trick.  Patch attached.

Attachment: 0001-Compile-exceptions.cc-with-fno-omit-frame-pointer-on.patch
Description: Text document


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]