diff options
Diffstat (limited to 'winsup/cygwin/exceptions.cc')
-rw-r--r-- | winsup/cygwin/exceptions.cc | 18 |
1 files changed, 2 insertions, 16 deletions
diff --git a/winsup/cygwin/exceptions.cc b/winsup/cygwin/exceptions.cc index 3b4184db0..56f191851 100644 --- a/winsup/cygwin/exceptions.cc +++ b/winsup/cygwin/exceptions.cc @@ -599,8 +599,6 @@ _cygtls::handle_exceptions (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT return 1; } - rtl_unwind (frame, e); - debug_printf ("In cygwin_except_handler exc %p at %p sp %p", e->ExceptionCode, in->Eip, in->Esp); debug_printf ("In cygwin_except_handler sig %d at %p", si.si_signo, in->Eip); @@ -650,6 +648,7 @@ _cygtls::handle_exceptions (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT goto out; } + rtl_unwind (frame, e); open_stackdumpfile (); exception (e, in); stackdump ((DWORD) ebp, 0, 1); @@ -680,21 +679,8 @@ _cygtls::handle_exceptions (EXCEPTION_RECORD *e, exception_list *frame, CONTEXT sig_send (NULL, si, &me); // Signal myself me.incyg--; e->ExceptionFlags = 0; - /* The OS adds an exception list frame to the stack. It expects to be - able to remove this entry after the exception handler returned. - However, when unwinding to our frame, our frame becomes the uppermost - frame on the stack (%fs:0 points to frame). This way, our frame - is removed from the exception stack and just disappears. So, we can't - just return here or things will be screwed up by the helpful function - in (presumably) ntdll.dll. - - So, instead, we will do the equivalent of a longjmp here and return - to the caller without visiting any of the helpful code installed prior - to this function. This should work ok, since a longjmp() out of here has - to work if linux signal semantics are to be maintained. */ out: - SetThreadContext (GetCurrentThread (), in); - return 0; /* Never actually returns. This is just to keep gcc happy. */ + return 0; } /* Utilities to call a user supplied exception handler. */ |