From: Pedro Alves Date: Thu, 11 May 2023 11:27:27 +0000 (+0100) Subject: Windows gdb: Can't pass signal to thread other than last stopped thread X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=c74e2b803117c3b8da0d7b873caa755f22c8624e;p=thirdparty%2Fbinutils-gdb.git Windows gdb: Can't pass signal to thread other than last stopped thread Passing a signal to a thread other than the one that last reported an event will be later possible with DBG_REPLY_LATER and the Windows backend working in non-stop mode. With an all-stop backend that isn't possible, so at least don't incorrectly consider passing DBG_EXCEPTION_NOT_HANDLED if the thread that we're going to call ContinueDebugEvent for is not the one that the user issued "signal SIG" on. Approved-By: Tom Tromey Change-Id: I27092ecfbf0904ebce02dff07d9104d22f3d8f0e commit-id:30c8d0ce --- diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 2a61953f439..614d85ac8f7 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -790,10 +790,21 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig) if (sig != GDB_SIGNAL_0) { - if (windows_process->current_event.dwDebugEventCode + /* Note it is OK to call get_last_debug_event_ptid() from the + main thread here, because we know the process_thread thread + isn't waiting for an event at this point, so there's no data + race. */ + if (inferior_ptid != get_last_debug_event_ptid ()) + { + /* ContinueDebugEvent will be for a different thread. */ + DEBUG_EXCEPT ("Cannot continue with signal %d here. " + "Not last-event thread", sig); + } + else if (windows_process->current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT) { - DEBUG_EXCEPT ("Cannot continue with signal %d here.", sig); + DEBUG_EXCEPT ("Cannot continue with signal %d here. " + "Not stopped for EXCEPTION_DEBUG_EVENT", sig); } else if (sig == windows_process->last_sig) continue_status = DBG_EXCEPTION_NOT_HANDLED;