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:58 -0600 |
commit | 3c76026df83bed7d97ed45e5b906b679a154b076 (patch) | |
tree | 01c44d3a79ed16ce070e5ad10c669e8be9ecb5de /gdb/nat | |
parent | 9d8679cc712d4c31d218cc141fe700d8e6394964 (diff) | |
download | gdb-3c76026df83bed7d97ed45e5b906b679a154b076.zip gdb-3c76026df83bed7d97ed45e5b906b679a154b076.tar.gz gdb-3c76026df83bed7d97ed45e5b906b679a154b076.tar.bz2 |
Share some Windows-related globals
This moves some Windows-related globals into nat/windows-nat.c,
sharing them between gdb and gdbserver.
gdb/ChangeLog
2020-04-08 Tom Tromey <tromey@adacore.com>
* windows-nat.c (current_process_handle, current_process_id)
(main_thread_id, last_sig, current_event, last_wait_event)
(current_windows_thread, desired_stop_thread_id, pending_stops)
(struct pending_stop, siginfo_er): Move to nat/windows-nat.c.
(display_selectors, fake_create_process)
(get_windows_debug_event): Update.
* nat/windows-nat.h (current_process_handle, current_process_id)
(main_thread_id, last_sig, current_event, last_wait_event)
(current_windows_thread, desired_stop_thread_id, pending_stops)
(struct pending_stop, siginfo_er): Move from windows-nat.c.
* nat/windows-nat.c (current_process_handle, current_process_id)
(main_thread_id, last_sig, current_event, last_wait_event)
(current_windows_thread, desired_stop_thread_id, pending_stops)
(siginfo_er): New globals. Move from windows-nat.c.
gdbserver/ChangeLog
2020-04-08 Tom Tromey <tromey@adacore.com>
* win32-low.c (current_process_handle, current_process_id)
(main_thread_id, last_sig, current_event, siginfo_er): Move to
nat/windows-nat.c.
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/windows-nat.c | 13 | ||||
-rw-r--r-- | gdb/nat/windows-nat.h | 57 |
2 files changed, 69 insertions, 1 deletions
diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 8217a98..80a1583 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -1,5 +1,5 @@ /* Internal interfaces for the Windows code - Copyright (C) 1995-2019 Free Software Foundation, Inc. + Copyright (C) 1995-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -22,6 +22,17 @@ namespace windows_nat { +HANDLE current_process_handle; +DWORD current_process_id; +DWORD main_thread_id; +enum gdb_signal last_sig = GDB_SIGNAL_0; +DEBUG_EVENT current_event; +DEBUG_EVENT last_wait_event; +windows_thread_info *current_windows_thread; +DWORD desired_stop_thread_id = -1; +std::vector<pending_stop> pending_stops; +EXCEPTION_RECORD siginfo_er; + windows_thread_info::~windows_thread_info () { CloseHandle (h); diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index 4176ed7..501147b 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -20,6 +20,9 @@ #define NAT_WINDOWS_NAT_H #include <windows.h> +#include <vector> + +#include "target/waitstatus.h" namespace windows_nat { @@ -111,6 +114,60 @@ enum thread_disposition_type extern windows_thread_info *thread_rec (ptid_t ptid, thread_disposition_type disposition); +/* Currently executing process */ +extern HANDLE current_process_handle; +extern DWORD current_process_id; +extern DWORD main_thread_id; +extern enum gdb_signal last_sig; + +/* The current debug event from WaitForDebugEvent or from a pending + stop. */ +extern DEBUG_EVENT current_event; + +/* The most recent event from WaitForDebugEvent. Unlike + current_event, this is guaranteed never to come from a pending + stop. This is important because only data from the most recent + event from WaitForDebugEvent can be used when calling + ContinueDebugEvent. */ +extern DEBUG_EVENT last_wait_event; + +/* Info on currently selected thread */ +extern windows_thread_info *current_windows_thread; + +/* The ID of the thread for which we anticipate a stop event. + Normally this is -1, meaning we'll accept an event in any + thread. */ +extern DWORD desired_stop_thread_id; + +/* A single pending stop. See "pending_stops" for more + information. */ +struct pending_stop +{ + /* The thread id. */ + DWORD thread_id; + + /* The target waitstatus we computed. */ + target_waitstatus status; + + /* The event. A few fields of this can be referenced after a stop, + and it seemed simplest to store the entire event. */ + DEBUG_EVENT event; +}; + +/* A vector of pending stops. Sometimes, Windows will report a stop + on a thread that has been ostensibly suspended. We believe what + happens here is that two threads hit a breakpoint simultaneously, + and the Windows kernel queues the stop events. However, this can + result in the strange effect of trying to single step thread A -- + leaving all other threads suspended -- and then seeing a stop in + thread B. To handle this scenario, we queue all such "pending" + stops here, and then process them once the step has completed. See + PR gdb/22992. */ +extern std::vector<pending_stop> pending_stops; + +/* Contents of $_siginfo */ +extern EXCEPTION_RECORD siginfo_er; + /* Return the name of the DLL referenced by H at ADDRESS. UNICODE determines what sort of string is read from the inferior. Returns the name of the DLL, or NULL on error. If a name is returned, it |