On Jan 25 20:03, Jon Turney wrote:
> On 25/01/2024 18:21, Corinna Vinschen wrote:
> > On Jan 25 14:50, Jon Turney wrote:
> > > On 24/01/2024 14:39, Corinna Vinschen wrote:
> > > > On Jan 24 13:28, Jon Turney wrote:
> > > > > On 23/01/2024 14:29, Corinna Vinschen wrote:
> > > > > > On Jan 23 14:20, Jon Turney wrote:
> [...]
> > > So this situation with a JIT debugger is even stranger than my emendations
> > > to the documentation say.
> > > 
> > > Because we're hitting try_to_debug() in exception::handle(), which has 
> > > some
> > > code to replay the exception via ExceptionContinueExecution (which I guess
> > > the debugger will catch as a first-chance) (and goes into a mode where it
> > > ignores the next half-million exceptions... no idea what that's about!)
> > > 
> > > That's not the same as signal_exit() with a coredumping signal (haven't
> > > checked if those are all generated from exceptions, but seems probable, so
> > > the try_to_debug() there maybe isn't doing anything?), where we're going 
> > > to
> > > exit thereafter.
> > 
> > try_to_debug() is only calling IsDebuggerPresent() as test, and that's
> > nothing but a flag in the PEB which is set by the OS after a debugger
> > attached to the process.  So the test is by definition extremely
> > flaky, if the debugger is connecting and disconnecting, as you
> > already pointed out.
> > 
> > I'm wondering if we can't define our own way to attach to a process,
> > allowing to "WaitForDebugger" as long as the debugger is a Cygwin
> > debugger.  If we define a matching function (along the lines of
> > prctl(2) on Linux), we could change our debuggers, core dumpers
> > and stracers to call this attach function.
> > 
> > The idea would be to define some shared mutex object, the inferior
> > waits for and the debugger releases after having attached.
> > 
> > Is there really any need to support non-Cygwin debuggers?
> 
> idk
> 
> I think something like that used to exist a long time ago, see commit
> 8abeff1ead5f3824c70111bc0ff74ff835dafa55

Yeah, just, as was the default at the time, without any trace of a
*rational* why it has been removed.  Also, it was too simple anyway.

First, if we want to support WIndows debugger, the inferior has to check
if the debugger is a Cygwin or native debugger.  If a native debugger,
just stick to what we have today.  Otherwise:

- Create a named mutex with a reproducible name (no need to use
  the name as parameter) and immediately grab it.
- Call CreateProcess to start the debugger with CREATE_SUSPENDED
  flag.
- Create a HANDLE array with the mutex and the process HANDLE.
- Call ResumeThread on the primary debugger thread.
- Call WFMO with timeout.

Later on, the debugger either fails and exits or it calls
ReleaseMutex after having attached to the process.

- WFMO returns
- If the mutex has triggered, we're being debugged (but check
  IsDebuggerPresent() just to be sure)
- If the process has triggered, the debugger exited
- If the timeout triggers... oh well.

> That long predates my involvement with cygwin so I've no idea why that was
> removed.

It doesn't predate mine, but I know just as much as you do.
Maybe the mailing list archives help, but tht's no safe bet.

> > > The practical upshot of this is if the JIT debugger doesn't terminate or 
> > > fix
> > > the erroring process, we'll just replay the faulting instruction and 
> > > invoke
> > > the JIT debugger again.
> > 
> > Hmm, ok.  This signal stuff *is* complicated and I'd be happy
> > if anybody finds out how to fix that...
> 
> To be clear, not a problem with "core dumping signals", as the process now
> always end up exiting, one way or another.
> 
> It's only a problem when someone has set "CYGWIN=error_start:true" or
> something equally dumb.

Ok.


Corinna

Reply via email to