Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Pedro Alves <pedro@palves.net>
To: gdb-patches@sourceware.org
Cc: Tom Tromey <tom@tromey.com>
Subject: [pushed 18/28] Windows gdbserver: Eliminate soft-interrupt mechanism
Date: Fri, 24 Apr 2026 21:44:58 +0100	[thread overview]
Message-ID: <20260424204508.1343973-19-pedro@palves.net> (raw)
In-Reply-To: <20260424204508.1343973-1-pedro@palves.net>

I noticed that faked_breakpoint is write only.  And then I hacked
win32_process_target::request_interrupt to force it to stop threads
using the soft_interrupt_requested mechanism (which suspends threads,
and then fakes a breakpoint event in the main thread), and saw that it
no longer works -- gdbserver crashes accessing a NULL current_thread,
because fake_breakpoint_event does not switch to a thread.

This code was originally added for Windows CE, as neither
GenerateConsoleCtrlEvent nor DebugBreakProcess worked there.  Windows
CE support has since been removed.

We nowadays require Windows XP or later, and XP has DebugBreakProcess.

The soft_interrupt_requested mechanism has other problems, like for
example faking the event in the main thread, even if that thread was
previously stopped, due to scheduler-locking.

A following patch will add a similar mechanism stopping all threads
with SuspendThread to native GDB, for non-stop mode, which doesn't
have these problems.  It's different enough from this old code that I
think we should just rip the old code out, and reimplement it from
scratch (based on gdb's version) when we need it.

Approved-By: Tom Tromey <tom@tromey.com>
Change-Id: I89e98233a9c40c6dcba7c8e1dacee08603843fb1
---
 gdbserver/win32-low.cc | 39 +--------------------------------------
 gdbserver/win32-low.h  |  8 --------
 2 files changed, 1 insertion(+), 46 deletions(-)

diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc
index be01940d158..5caec960082 100644
--- a/gdbserver/win32-low.cc
+++ b/gdbserver/win32-low.cc
@@ -289,8 +289,6 @@ do_initial_child_stuff (HANDLE proch, DWORD pid, int attached)
   windows_process.process_id = pid;
   windows_process.main_thread_id = 0;
 
-  windows_process.soft_interrupt_requested = 0;
-  windows_process.faked_breakpoint = 0;
   windows_process.open_process_used = true;
 
   memset (&windows_process.current_event, 0,
@@ -407,7 +405,6 @@ child_continue_for_kill (DWORD continue_status, int thread_id)
     {
       continue_one_thread (thread, thread_id);
     });
-  windows_process.faked_breakpoint = 0;
 
   return continue_last_debug_event (continue_status, debug_threads);
 }
@@ -907,30 +904,6 @@ suspend_one_thread (thread_info *thread)
   th->suspend ();
 }
 
-static void
-fake_breakpoint_event (void)
-{
-  OUTMSG2(("fake_breakpoint_event\n"));
-
-  windows_process.faked_breakpoint = 1;
-
-  memset (&windows_process.current_event, 0,
-	  sizeof (windows_process.current_event));
-  windows_process.current_event.dwThreadId = windows_process.main_thread_id;
-  windows_process.current_event.dwDebugEventCode = EXCEPTION_DEBUG_EVENT;
-  windows_process.current_event.u.Exception.ExceptionRecord.ExceptionCode
-    = EXCEPTION_BREAKPOINT;
-
-  /* On aarch64, hardware breakpoints also get EXCEPTION_BREAKPOINT,
-     but they can be recognized with ExceptionInformation.  */
-  windows_process.current_event.u.Exception.ExceptionRecord.NumberParameters
-    = 1;
-  windows_process.current_event.u.Exception.ExceptionRecord
-    .ExceptionInformation[0] = 0;
-
-  for_each_thread (suspend_one_thread);
-}
-
 /* See nat/windows-nat.h.  */
 
 bool
@@ -983,13 +956,6 @@ get_child_debug_event (DWORD *continue_status,
 
   DEBUG_EVENT *current_event = &windows_process.current_event;
 
-  if (windows_process.soft_interrupt_requested)
-    {
-      windows_process.soft_interrupt_requested = 0;
-      fake_breakpoint_event ();
-      goto gotevent;
-    }
-
   windows_process.attaching = 0;
   {
     process_info *proc = find_process_pid (windows_process.process_id);
@@ -1030,8 +996,6 @@ get_child_debug_event (DWORD *continue_status,
       }
   }
 
- gotevent:
-
   switch (current_event->dwDebugEventCode)
     {
     case CREATE_THREAD_DEBUG_EVENT:
@@ -1285,8 +1249,7 @@ win32_process_target::request_interrupt ()
   if (DebugBreakProcess (windows_process.handle))
     return;
 
-  /* Last resort, suspend all threads manually.  */
-  windows_process.soft_interrupt_requested = 1;
+  OUTMSG2 (("Could not interrupt.\n"));
 }
 
 bool
diff --git a/gdbserver/win32-low.h b/gdbserver/win32-low.h
index 402254fdad5..9c672bfce1a 100644
--- a/gdbserver/win32-low.h
+++ b/gdbserver/win32-low.h
@@ -191,14 +191,6 @@ struct gdbserver_windows_process : public windows_nat::windows_process_info
      debug event off the win32 API.  */
   struct target_waitstatus cached_status;
 
-  /* Non zero if an interrupt request is to be satisfied by suspending
-     all threads.  */
-  int soft_interrupt_requested = 0;
-
-  /* Non zero if the inferior is stopped in a simulated breakpoint done
-     by suspending all the threads.  */
-  int faked_breakpoint = 0;
-
   /* True if current_process_handle needs to be closed.  */
   bool open_process_used = false;
 
-- 
2.53.0


  parent reply	other threads:[~2026-04-24 20:47 UTC|newest]

Thread overview: 32+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-04-24 20:44 [pushed 00/28] Windows non-stop prep Pedro Alves
2026-04-24 20:44 ` [pushed 01/28] Windows gdb+gdbserver: New find_thread, replaces thread_rec(DONT_INVALIDATE_CONTEXT) Pedro Alves
2026-04-24 20:44 ` [pushed 02/28] Windows gdb: handle_output_debug_string return type Pedro Alves
2026-04-24 20:44 ` [pushed 03/28] Windows gdb: Eliminate reload_context Pedro Alves
2026-04-24 20:44 ` [pushed 04/28] Windows gdb+gdbserver: Eliminate thread_rec(INVALIDATE_CONTEXT) calls Pedro Alves
2026-04-24 20:44 ` [pushed 05/28] Windows gdb+gdbserver: Eliminate DONT_SUSPEND Pedro Alves
2026-04-24 20:44 ` [pushed 06/28] Windows gdb+gdbserver: Eliminate windows_process_info::thread_rec Pedro Alves
2026-04-24 20:44 ` [pushed 07/28] Windows gdb: Simplify windows_nat_target::wait Pedro Alves
2026-04-26 12:52   ` Hannes Domani
2026-04-27 12:09     ` [pushed/ob] Restore windows_nat_target::wait is_sw_breakpoint change Pedro Alves
2026-04-24 20:44 ` [pushed 08/28] Windows gdb+gdbserver: Move suspending thread to when returning event Pedro Alves
2026-04-24 20:44 ` [pushed 09/28] Windows gdb: Introduce continue_last_debug_event_main_thread Pedro Alves
2026-04-24 20:44 ` [pushed 10/28] Windows gdb: Introduce windows_continue_flags Pedro Alves
2026-04-24 20:44 ` [pushed 11/28] Windows gdb: Factor code out of windows_nat_target::windows_continue Pedro Alves
2026-04-24 20:44 ` [pushed 12/28] Windows gdb: Pending stop and current_event Pedro Alves
2026-04-24 20:44 ` [pushed 13/28] Windows gdb+gdbserver: Elim desired_stop_thread_id / rework pending_stops Pedro Alves
2026-04-24 20:44 ` [pushed 14/28] Windows gdb+gdbserver: Introduce get_last_debug_event_ptid Pedro Alves
2026-04-24 20:44 ` [pushed 15/28] Windows gdb: Can't pass signal to thread other than last stopped thread Pedro Alves
2026-04-24 20:44 ` [pushed 16/28] Windows gdbserver: Fix scheduler-locking Pedro Alves
2026-04-24 20:44 ` [pushed 17/28] Windows gdb: Enable "set scheduler-locking on" Pedro Alves
2026-04-27 12:57   ` [pushed] Mention Windows scheduler-locking in NEWS (Re: [pushed 17/28] Windows gdb: Enable "set scheduler-locking on") Pedro Alves
2026-04-24 20:44 ` Pedro Alves [this message]
2026-04-24 20:44 ` [pushed 19/28] Windows gdb+gdbserver: Make current_event per-thread state Pedro Alves
2026-04-24 20:45 ` [pushed 20/28] Windows gdb+gdbserver: Make last_sig " Pedro Alves
2026-04-24 20:45 ` [pushed 21/28] Windows gdb+gdbserver: Make siginfo_er " Pedro Alves
2026-04-24 20:45 ` [pushed 22/28] Add backpointer from windows_thread_info to windows_process_info Pedro Alves
2026-04-24 20:45 ` [pushed 23/28] Windows gdb+gdbserver: Share $_siginfo reading code Pedro Alves
2026-04-24 20:45 ` [pushed 24/28] Windows gdb+gdbserver: Eliminate struct pending_stop Pedro Alves
2026-04-24 20:45 ` [pushed 25/28] Windows gdb: Change serial_event management Pedro Alves
2026-04-24 20:45 ` [pushed 26/28] Windows gdb: cygwin_set_dr => windows_set_dr, etc Pedro Alves
2026-04-24 20:45 ` [pushed 27/28] Windows gdb: Move debug macros to windows-nat.h Pedro Alves
2026-04-24 20:45 ` [pushed 28/28] Windows gdb: Avoid writing debug registers if watchpoint hit pending Pedro Alves

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20260424204508.1343973-19-pedro@palves.net \
    --to=pedro@palves.net \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox