* DevNotes: Add entry cgf-000025.

* exceptions.cc (_cygtls::signal_debugger): Reorganize to avoid contacting the
debugger if we have already done so via the exception handler.  Eliminate need
for goto.  Remove an ifdef in favor of just allocating a larger buffer.
This commit is contained in:
Christopher Faylor 2014-03-29 21:16:09 +00:00
parent 20738749f6
commit c6eaf1f3f7
3 changed files with 30 additions and 27 deletions

View File

@ -1,3 +1,11 @@
2014-03-29 Christopher Faylor <me.cygwin2014@cgf.cx>
* DevNotes: Add entry cgf-000025.
* exceptions.cc (_cygtls::signal_debugger): Reorganize to avoid
contacting the debugger if we have already done so via the exception
handler. Eliminate need for goto. Remove an ifdef in favor of just
allocating a larger buffer.
2014-03-28 Corinna Vinschen <corinna@vinschen.de>
* dcrt0.cc (dll_crt0_0): Install myfault exception handler on x86_64.

View File

@ -1,3 +1,11 @@
2014-03-29 cgf-000025
Reorganized _cygtls::signal_debugger to avoid sending anything to the
debugger if we've seen an exception. I think it used to work that way
and I changed it without noting why. It sure seems like, if we don't do
this, gdb will see two signals and, it really does, when there has been
a Windows-recognized exception.
2014-02-15 cgf-000024
Wow. It's hard getting the screen handling stuff working correctly when

View File

@ -1461,42 +1461,29 @@ _cygtls::call_signal_handler ()
void
_cygtls::signal_debugger (siginfo_t& si)
{
HANDLE th = NULL;
if (isinitialized () && being_debugged ())
HANDLE th;
/* If si.si_cyg is set then the signal was already sent to the debugger. */
if (isinitialized () && !si.si_cyg && (th = (HANDLE) *this)
&& being_debugged () && SuspendThread (th) >= 0)
{
CONTEXT c;
CONTEXT *pc;
if (si.si_cyg)
pc = ((cygwin_exception *) si.si_cyg)->context ();
else if (!(th = (HANDLE) *this))
return;
else
c.ContextFlags = CONTEXT_FULL;
if (GetThreadContext (th, &c))
{
SuspendThread (th);
c.ContextFlags = CONTEXT_FULL;
if (!GetThreadContext (th, &c))
goto out;
if (incyg)
#ifdef __x86_64__
c.Rip = retaddr ();
#else
c.Eip = retaddr ();
#endif
pc = &c;
memcpy (&thread_context, &c, (&thread_context._internal -
(unsigned char *) &thread_context));
/* Enough space for 32/64 bit addresses */
char sigmsg[2 * sizeof (_CYGWIN_SIGNAL_STRING " ffffffff ffffffffffffffff")];
__small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %d %y %p", si.si_signo,
thread_id, &thread_context);
OutputDebugString (sigmsg);
}
memcpy (&thread_context, pc, (&thread_context._internal -
(unsigned char *) &thread_context));
#ifdef __x86_64__
char sigmsg[2 * sizeof (_CYGWIN_SIGNAL_STRING " ffffffff ffffffffffffffff")];
#else
char sigmsg[2 * sizeof (_CYGWIN_SIGNAL_STRING " ffffffff ffffffff")];
#endif
__small_sprintf (sigmsg, _CYGWIN_SIGNAL_STRING " %d %y %p", si.si_signo,
thread_id, &thread_context);
OutputDebugString (sigmsg);
ResumeThread (th);
}
out:
if (th)
ResumeThread (th);
}