From patchwork Tue Nov 26 17:11:32 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Simon Marchi (Code Review)" X-Patchwork-Id: 36235 Received: (qmail 119311 invoked by alias); 26 Nov 2019 17:21:56 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 119245 invoked by uid 89); 26 Nov 2019 17:21:56 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3 autolearn=ham version=3.3.1 spammy=ds, es, ss X-HELO: mx1.osci.io Received: from polly.osci.io (HELO mx1.osci.io) (8.43.85.229) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Tue, 26 Nov 2019 17:21:53 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id EEB3420C52; Tue, 26 Nov 2019 12:11:55 -0500 (EST) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [IPv6:2620:52:3:1:5054:ff:fe06:16ca]) by mx1.osci.io (Postfix) with ESMTP id 1903220D4A for ; Tue, 26 Nov 2019 12:11:32 -0500 (EST) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 6135128174 for ; Tue, 26 Nov 2019 12:11:32 -0500 (EST) X-Gerrit-PatchSet: 1 Date: Tue, 26 Nov 2019 12:11:32 -0500 From: "Tom Tromey (Code Review)" To: gdb-patches@sourceware.org Message-ID: Auto-Submitted: auto-generated X-Gerrit-MessageType: newchange Subject: [review] Share some Windows-related globals X-Gerrit-Change-Id: I3f861053e285afa3b3fff2d7892fdee2e59ab2c0 X-Gerrit-Change-Number: 710 X-Gerrit-ChangeURL: X-Gerrit-Commit: f9c7eb195a4ba1c7145b9d7cb867a50c86743402 References: Reply-To: tromey@sourceware.org, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Disposition: inline User-Agent: Gerrit/3.0.3-79-g83ff7f88f1 Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/710 ...................................................................... Share some Windows-related globals This moves some Windows-related globals into nat/windows-nat.c, sharing them between gdb and gdbserver. gdb/ChangeLog 2019-11-26 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): 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): 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): New globals. Move from windows-nat.c. gdb/gdbserver/ChangeLog 2019-11-26 Tom Tromey * win32-low.c (current_process_handle, current_process_id) (main_thread_id, last_sig, current_event): Move to nat/windows-nat.c. Change-Id: I3f861053e285afa3b3fff2d7892fdee2e59ab2c0 --- M gdb/ChangeLog M gdb/gdbserver/ChangeLog M gdb/gdbserver/win32-low.c M gdb/nat/windows-nat.c M gdb/nat/windows-nat.h M gdb/windows-nat.c 6 files changed, 114 insertions(+), 80 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 911c6a1..b0921f9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,22 @@ 2019-11-26 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): 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): 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): + New globals. Move from windows-nat.c. + +2019-11-26 Tom Tromey + * windows-nat.c (get_image_name): Move to nat/windows-nat.c. (handle_load_dll): Update. * nat/windows-nat.c (get_image_name): Move from windows-nat.c. diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index fff6640..8349b8d 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,11 @@ 2019-11-26 Tom Tromey + * win32-low.c (current_process_handle, current_process_id) + (main_thread_id, last_sig, current_event): Move to + nat/windows-nat.c. + +2019-11-26 Tom Tromey + * win32-low.c (get_image_name): Remove. (handle_load_dll): Update. diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c index a458b6e..4cf60b2 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -71,13 +71,6 @@ /* Globals. */ static int attaching = 0; -static HANDLE current_process_handle = NULL; -static DWORD current_process_id = 0; -static DWORD main_thread_id = 0; -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 diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index e0ebe3a..57bbae1 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -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; + + windows_thread_info::~windows_thread_info () { CloseHandle (h); diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index e38b69e..de53f2f 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -21,6 +21,8 @@ #include +#include "target/waitstatus.h" + namespace windows_nat { @@ -105,6 +107,58 @@ 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; + + /* 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 1752010..fad3952 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -213,26 +213,8 @@ 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 */ /* Counts of things. */ static int exception_count = 0; @@ -300,37 +282,6 @@ #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; @@ -351,7 +302,7 @@ bool stopped_by_sw_breakpoint () override { - return current_thread->stopped_at_breakpoint; + return current_windows_thread->stopped_at_breakpoint; } bool supports_stopped_by_sw_breakpoint () override @@ -1094,7 +1045,7 @@ 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; @@ -1103,30 +1054,30 @@ { 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 { 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); } } @@ -1400,7 +1351,7 @@ (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, @@ -1563,8 +1514,9 @@ 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", @@ -1773,9 +1725,10 @@ 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: @@ -1833,14 +1786,14 @@ { ptid_t result = ptid_t (current_event.dwProcessId, retval, 0); - if (current_thread != nullptr) + if (current_windows_thread != nullptr) { - current_thread->stopped_at_breakpoint = false; + current_windows_thread->stopped_at_breakpoint = false; if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT && (current_event.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) && windows_initialization_done) - current_thread->stopped_at_breakpoint = true; + current_windows_thread->stopped_at_breakpoint = true; } return result;