From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19022 invoked by alias); 29 Oct 2019 18:16:04 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 18748 invoked by uid 89); 29 Oct 2019 18:15:58 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-21.2 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3 autolearn=ham version=3.3.1 spammy=ds, fs, ss, gs 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, 29 Oct 2019 18:15:54 +0000 Received: by mx1.osci.io (Postfix, from userid 994) id 2F9DA2131E; Tue, 29 Oct 2019 13:58:09 -0400 (EDT) Received: from gnutoolchain-gerrit.osci.io (gnutoolchain-gerrit.osci.io [8.43.85.239]) by mx1.osci.io (Postfix) with ESMTP id ACE5B20555 for ; Tue, 29 Oct 2019 13:57:55 -0400 (EDT) Received: from localhost (localhost [127.0.0.1]) by gnutoolchain-gerrit.osci.io (Postfix) with ESMTP id 8D49020AF6 for ; Tue, 29 Oct 2019 13:57:55 -0400 (EDT) X-Gerrit-PatchSet: 1 Date: Tue, 29 Oct 2019 18:16:00 -0000 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: I9fbc0f8d65ed3f79d3b5061504141e5472b03057 X-Gerrit-Change-Number: 419 X-Gerrit-ChangeURL: X-Gerrit-Commit: 43776b7718df0c0d1af23d23f4988859e8f46056 References: Reply-To: tromey@sourceware.org, gdb-patches@sourceware.org MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Content-Disposition: inline User-Agent: Gerrit/3.0.3-74-g460fb0f7e9 Content-Type: text/plain; charset=UTF-8 X-SW-Source: 2019-10/txt/msg01033.txt.bz2 Change URL: https://gnutoolchain-gerrit.osci.io/r/c/binutils-gdb/+/419 ...................................................................... Share some Windows-related globals This moves some Windows-related globals into nat/windows-nat.c, sharing them between gdb and gdbserver. Change-Id: I3f861053e285afa3b3fff2d7892fdee2e59ab2c0 gdb/ChangeLog 2019-10-29 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) (last_stop_was_breakpoint, 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) (last_stop_was_breakpoint): Declare. (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) (last_stop_was_breakpoint): New globals. Move from windows-nat.c. gdb/gdbserver/ChangeLog 2019-10-29 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: I9fbc0f8d65ed3f79d3b5061504141e5472b03057 --- 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, 117 insertions(+), 80 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 3ef67ab..4434f9a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,24 @@ 2019-10-29 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) + (last_stop_was_breakpoint, 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) + (last_stop_was_breakpoint): Declare. + (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) + (last_stop_was_breakpoint): New globals. Move from windows-nat.c. + +2019-10-29 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 8a5acb8..646ca7f 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,11 @@ 2019-10-29 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-10-29 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 3b55bb5..70ce6fd 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -22,6 +22,18 @@ 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; +bool last_stop_was_breakpoint = false; + + windows_thread_info::~windows_thread_info () { CloseHandle (h); diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index 0ee24e8..c497d73 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 { @@ -101,6 +103,62 @@ 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; + +/* This is true if the most recently reported stop was due to a + breakpoint. */ +extern bool last_stop_was_breakpoint; + + /* 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 0533f64..3762af3 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,41 +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; - -/* This is true if the most recently reported stop was due to a - breakpoint. */ -static bool last_stop_was_breakpoint = false; - struct windows_nat_target final : public x86_nat_target { void close () override; @@ -1073,7 +1020,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; @@ -1082,30 +1029,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); } } @@ -1380,7 +1327,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, @@ -1543,8 +1490,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", @@ -1744,9 +1692,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: -- Gerrit-Project: binutils-gdb Gerrit-Branch: master Gerrit-Change-Id: I9fbc0f8d65ed3f79d3b5061504141e5472b03057 Gerrit-Change-Number: 419 Gerrit-PatchSet: 1 Gerrit-Owner: Tom Tromey Gerrit-MessageType: newchange