From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from rock.gnat.com (rock.gnat.com [IPv6:2620:20:4000:0:a9e:1ff:fe9b:1d1]) by sourceware.org (Postfix) with ESMTP id 6440E3AAA047 for ; Fri, 13 Mar 2020 19:09:02 +0000 (GMT) Received: from localhost (localhost.localdomain [127.0.0.1]) by filtered-rock.gnat.com (Postfix) with ESMTP id 5D9B1561B4; Fri, 13 Mar 2020 15:09:02 -0400 (EDT) X-Virus-Scanned: Debian amavisd-new at gnat.com Received: from rock.gnat.com ([127.0.0.1]) by localhost (rock.gnat.com [127.0.0.1]) (amavisd-new, port 10024) with LMTP id fqdUFEAei1pN; Fri, 13 Mar 2020 15:09:02 -0400 (EDT) Received: from murgatroyd.Home (184-96-250-69.hlrn.qwest.net [184.96.250.69]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by rock.gnat.com (Postfix) with ESMTPSA id 085C5561B8; Fri, 13 Mar 2020 15:09:01 -0400 (EDT) From: Tom Tromey To: gdb-patches@sourceware.org Cc: Tom Tromey Subject: [PATCH v3 16/29] Share some Windows-related globals Date: Fri, 13 Mar 2020 13:08:42 -0600 Message-Id: <20200313190855.28662-17-tromey@adacore.com> X-Mailer: git-send-email 2.21.1 In-Reply-To: <20200313190855.28662-1-tromey@adacore.com> References: <20200313190855.28662-1-tromey@adacore.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-25.0 required=5.0 tests=GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_NONE, SPF_PASS autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 13 Mar 2020 19:09:03 -0000 This moves some Windows-related globals into nat/windows-nat.c, sharing them between gdb and gdbserver. gdb/ChangeLog 2020-03-13 Tom Tromey * 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-03-13 Tom Tromey * win32-low.c (current_process_handle, current_process_id) (main_thread_id, last_sig, current_event, siginfo_er): Move to nat/windows-nat.c. --- gdb/ChangeLog | 17 ++++++ gdb/nat/windows-nat.c | 13 ++++- gdb/nat/windows-nat.h | 57 +++++++++++++++++++ gdb/windows-nat.c | 125 +++++++++++++---------------------------- gdbserver/ChangeLog | 6 ++ gdbserver/win32-low.cc | 8 --- 6 files changed, 130 insertions(+), 96 deletions(-) diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 8217a985320..80a1583b884 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_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 4176ed7f660..501147b2c90 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -20,6 +20,9 @@ #define NAT_WINDOWS_NAT_H #include +#include + +#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_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 diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index c0b1b8521db..74b852ca603 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -244,28 +244,8 @@ static CORE_ADDR cygwin_get_dr (int i); static unsigned long cygwin_get_dr6 (void); static unsigned long cygwin_get_dr7 (void); -static enum gdb_signal last_sig = GDB_SIGNAL_0; -/* Set if a signal was received from the debugged process. */ - static std::vector thread_list; -/* The process and thread handles for the above context. */ - -/* The current debug event from WaitForDebugEvent or from a pending - stop. */ -static 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. */ -static DEBUG_EVENT last_wait_event; - -static HANDLE current_process_handle; /* Currently executing process */ -static windows_thread_info *current_thread; /* Info on currently selected thread */ -static EXCEPTION_RECORD siginfo_er; /* Contents of $_siginfo */ - /* Counts of things. */ static int exception_count = 0; static int event_count = 0; @@ -336,37 +316,6 @@ static const struct xlate_exception xlate[] = #endif /* 0 */ -/* 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. */ -static DWORD desired_stop_thread_id = -1; - -/* 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. */ -static std::vector pending_stops; - struct windows_nat_target final : public x86_nat_target { void close () override; @@ -387,7 +336,7 @@ struct windows_nat_target final : public x86_nat_target bool stopped_by_sw_breakpoint () override { - return current_thread->stopped_at_software_breakpoint; + return current_windows_thread->stopped_at_software_breakpoint; } bool supports_stopped_by_sw_breakpoint () override @@ -1207,7 +1156,7 @@ display_selector (HANDLE thread, DWORD sel) static void display_selectors (const char * args, int from_tty) { - if (!current_thread) + if (!current_windows_thread) { puts_filtered ("Impossible to display selectors now.\n"); return; @@ -1218,45 +1167,45 @@ display_selectors (const char * args, int from_tty) if (wow64_process) { puts_filtered ("Selector $cs\n"); - display_selector (current_thread->h, - current_thread->wow64_context.SegCs); + display_selector (current_windows_thread->h, + current_windows_thread->wow64_context.SegCs); puts_filtered ("Selector $ds\n"); - display_selector (current_thread->h, - current_thread->wow64_context.SegDs); + display_selector (current_windows_thread->h, + current_windows_thread->wow64_context.SegDs); puts_filtered ("Selector $es\n"); - display_selector (current_thread->h, - current_thread->wow64_context.SegEs); + display_selector (current_windows_thread->h, + current_windows_thread->wow64_context.SegEs); puts_filtered ("Selector $ss\n"); - display_selector (current_thread->h, - current_thread->wow64_context.SegSs); + display_selector (current_windows_thread->h, + current_windows_thread->wow64_context.SegSs); puts_filtered ("Selector $fs\n"); - display_selector (current_thread->h, - current_thread->wow64_context.SegFs); + display_selector (current_windows_thread->h, + current_windows_thread->wow64_context.SegFs); puts_filtered ("Selector $gs\n"); - display_selector (current_thread->h, - current_thread->wow64_context.SegGs); + display_selector (current_windows_thread->h, + current_windows_thread->wow64_context.SegGs); } else #endif { puts_filtered ("Selector $cs\n"); - display_selector (current_thread->h, - current_thread->context.SegCs); + display_selector (current_windows_thread->h, + current_windows_thread->context.SegCs); puts_filtered ("Selector $ds\n"); - display_selector (current_thread->h, - current_thread->context.SegDs); + display_selector (current_windows_thread->h, + current_windows_thread->context.SegDs); puts_filtered ("Selector $es\n"); - display_selector (current_thread->h, - current_thread->context.SegEs); + display_selector (current_windows_thread->h, + current_windows_thread->context.SegEs); puts_filtered ("Selector $ss\n"); - display_selector (current_thread->h, - current_thread->context.SegSs); + display_selector (current_windows_thread->h, + current_windows_thread->context.SegSs); puts_filtered ("Selector $fs\n"); - display_selector (current_thread->h, - current_thread->context.SegFs); + display_selector (current_windows_thread->h, + current_windows_thread->context.SegFs); puts_filtered ("Selector $gs\n"); - display_selector (current_thread->h, - current_thread->context.SegGs); + display_selector (current_windows_thread->h, + current_windows_thread->context.SegGs); } } else @@ -1264,7 +1213,7 @@ display_selectors (const char * args, int from_tty) int sel; sel = parse_and_eval_long (args); printf_filtered ("Selector \"%s\"\n",args); - display_selector (current_thread->h, sel); + display_selector (current_windows_thread->h, sel); } } @@ -1587,7 +1536,7 @@ fake_create_process (void) (unsigned) GetLastError ()); /* We can not debug anything in that case. */ } - current_thread + current_windows_thread = windows_add_thread (ptid_t (current_event.dwProcessId, current_event.dwThreadId, 0), current_event.u.CreateThread.hThread, @@ -1782,8 +1731,9 @@ windows_nat_target::get_windows_debug_event (int pid, current_event = iter->event; inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0); - current_thread = thread_rec (inferior_ptid, INVALIDATE_CONTEXT); - current_thread->reload_context = 1; + current_windows_thread = thread_rec (inferior_ptid, + INVALIDATE_CONTEXT); + current_windows_thread->reload_context = 1; DEBUG_EVENTS (("get_windows_debug_event - " "pending stop found in 0x%x (desired=0x%x)\n", @@ -2006,9 +1956,10 @@ windows_nat_target::get_windows_debug_event (int pid, else { inferior_ptid = ptid_t (current_event.dwProcessId, thread_id, 0); - current_thread = th; - if (!current_thread) - current_thread = thread_rec (inferior_ptid, INVALIDATE_CONTEXT); + current_windows_thread = th; + if (!current_windows_thread) + current_windows_thread = thread_rec (inferior_ptid, + INVALIDATE_CONTEXT); } out: @@ -2066,14 +2017,14 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, { ptid_t result = ptid_t (current_event.dwProcessId, retval, 0); - if (current_thread != nullptr) + if (current_windows_thread != nullptr) { - current_thread->stopped_at_software_breakpoint = false; + current_windows_thread->stopped_at_software_breakpoint = false; if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT && (current_event.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) && windows_initialization_done) - current_thread->stopped_at_software_breakpoint = true; + current_windows_thread->stopped_at_software_breakpoint = true; } return result; diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 810896e87ca..7060b6d1527 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -74,14 +74,6 @@ int using_threads = 1; /* Globals. */ static int attaching = 0; -static HANDLE current_process_handle = NULL; -static DWORD current_process_id = 0; -static DWORD main_thread_id = 0; -static EXCEPTION_RECORD siginfo_er; /* Contents of $_siginfo */ -static enum gdb_signal last_sig = GDB_SIGNAL_0; - -/* The current debug event from WaitForDebugEvent. */ -static DEBUG_EVENT current_event; /* A status that hasn't been reported to the core yet, and so win32_wait should return it next, instead of fetching the next -- 2.21.1