diff options
author | Tom Tromey <tromey@adacore.com> | 2020-04-08 14:33:35 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2020-04-08 14:47:59 -0600 |
commit | e758e19c596f8d0683f6c8ca750eb4e79071523d (patch) | |
tree | a353862ef878e18d32918f5c5ed803836ada23cd /gdb/nat | |
parent | 8d30e395779603a8d36fa8bdfddba88a312552f4 (diff) | |
download | gdb-e758e19c596f8d0683f6c8ca750eb4e79071523d.zip gdb-e758e19c596f8d0683f6c8ca750eb4e79071523d.tar.gz gdb-e758e19c596f8d0683f6c8ca750eb4e79071523d.tar.bz2 |
Share some inferior-related Windows code
This adds a couple of functions to nat/windows-nat.c and changes gdb
and gdbserver to use them. One function checks the list of pending
stops for a match (not yet used by gdbserver, but will be in a
subsequent patch); and the other is a wrapper for ContinueDebugEvent
that always uses the last "real" stop event.
gdb/ChangeLog
2020-04-08 Tom Tromey <tromey@adacore.com>
* windows-nat.c (windows_continue): Use matching_pending_stop and
continue_last_debug_event.
* nat/windows-nat.h (matching_pending_stop)
(continue_last_debug_event): Declare.
* nat/windows-nat.c (DEBUG_EVENTS): New define.
(matching_pending_stop, continue_last_debug_event): New
functions.
gdbserver/ChangeLog
2020-04-08 Tom Tromey <tromey@adacore.com>
* win32-low.c (child_continue): Call continue_last_debug_event.
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/windows-nat.c | 46 | ||||
-rw-r--r-- | gdb/nat/windows-nat.h | 13 |
2 files changed, 59 insertions, 0 deletions
diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 6bbf41c..2c2454b 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -37,6 +37,10 @@ DWORD desired_stop_thread_id = -1; std::vector<pending_stop> pending_stops; EXCEPTION_RECORD siginfo_er; +/* Note that 'debug_events' must be locally defined in the relevant + functions. */ +#define DEBUG_EVENTS(x) if (debug_events) debug_printf x + windows_thread_info::~windows_thread_info () { CloseHandle (h); @@ -312,4 +316,46 @@ handle_exception (struct target_waitstatus *ourstatus, bool debug_exceptions) #undef DEBUG_EXCEPTION_SIMPLE } +/* See nat/windows-nat.h. */ + +bool +matching_pending_stop (bool debug_events) +{ + /* If there are pending stops, and we might plausibly hit one of + them, we don't want to actually continue the inferior -- we just + want to report the stop. In this case, we just pretend to + continue. See the comment by the definition of "pending_stops" + for details on why this is needed. */ + for (const auto &item : pending_stops) + { + if (desired_stop_thread_id == -1 + || desired_stop_thread_id == item.thread_id) + { + DEBUG_EVENTS (("windows_continue - pending stop anticipated, " + "desired=0x%x, item=0x%x\n", + desired_stop_thread_id, item.thread_id)); + return true; + } + } + + return false; +} + +/* See nat/windows-nat.h. */ + +BOOL +continue_last_debug_event (DWORD continue_status, bool debug_events) +{ + DEBUG_EVENTS (("ContinueDebugEvent (cpid=%d, ctid=0x%x, %s);\n", + (unsigned) last_wait_event.dwProcessId, + (unsigned) last_wait_event.dwThreadId, + continue_status == DBG_CONTINUE ? + "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED")); + + return ContinueDebugEvent (last_wait_event.dwProcessId, + last_wait_event.dwThreadId, + continue_status); +} + + } diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index a4e0b39..0e93165 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -225,6 +225,19 @@ typedef enum extern handle_exception_result handle_exception (struct target_waitstatus *ourstatus, bool debug_exceptions); +/* Return true if there is a pending stop matching + desired_stop_thread_id. If DEBUG_EVENTS is true, logging will be + enabled. */ + +extern bool matching_pending_stop (bool debug_events); + +/* A simple wrapper for ContinueDebugEvent that continues the last + waited-for event. If DEBUG_EVENTS is true, logging will be + enabled. */ + +extern BOOL continue_last_debug_event (DWORD continue_status, + bool debug_events); + } #endif |