[Lldb-commits] [lldb] [lldb-dap] Implement `runInTerminal` for Windows (PR #121269)
Hu Jialun via lldb-commits
lldb-commits at lists.llvm.org
Thu May 22 07:17:50 PDT 2025
SuibianP wrote:
The FIFO file served two purposes,
- Send real target PID back to debugger
- Synchronisation: Prevent premature execution of target
And the original implementation 0f0462c states the reason against socket and signal,
> I'm using this instead of using a signal or a similar mechanism because I don't want the launcher program to wait indefinitely to be attached in case the debugger crashed. That would pollute the process list with a lot of hanging processes.
> I preferred not to use sockets because it requires a lot of code and I only need a pid. It would also require a lot of code when windows support is implemented.
I took a step back and feel that this is probably doable without elaborate IPCs. Below is what I am thinking of (haven't actually tried yet).
1. Always create a new process in suspension (`SIGSTOP`/`CREATE_SUSPENDED`)
2. Send the PID back to debugger
- POSIX, send signal and debugger can read `si_pid`
- Dead launcher: timed `sigsuspend` with `alarm` (Darwin does not have `sigtimedwait`)
- Dead debugger: `waitid(WNOHANG | WCONTINUED)` after timeout
- Windows, use `PostThreadMessage` with `GetMessage`
- Dead launcher: `MsgWaitForMultipleObjects`
- Dead debugger: `CheckRemoteDebuggerPresent` after timeout
3. Attach to process and resume as normal
There would still be platform-specific code, but presumably still less clutter than FIFO/socket.
Any comments @ashgti @walter-erquinigo?
https://github.com/llvm/llvm-project/pull/121269
More information about the lldb-commits
mailing list