* 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:
parent
20738749f6
commit
c6eaf1f3f7
|
@ -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.
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue