From 44ac251ad202da57e134f160b6831a56a82a8cf0 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 12 Apr 2022 14:25:44 -0600 Subject: [PATCH] Share handle_ms_vc_exception with gdbserver Currently, gdb's native Windows target implements the exception-based approach for setting thread names, but gdbserver does not. This patch moves handle_ms_vc_exception to the shared nat/windows-nat.c code, as preparation for adding this support to gdbserver. --- gdb/nat/windows-nat.c | 40 ++++++++++++++++++++++++++++++++++++++++ gdb/nat/windows-nat.h | 20 +++++++++----------- gdb/windows-nat.c | 40 ---------------------------------------- gdbserver/win32-low.cc | 9 --------- 4 files changed, 49 insertions(+), 60 deletions(-) diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index a82aa89b085..9fdef463760 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -19,6 +19,7 @@ #include "gdbsupport/common-defs.h" #include "nat/windows-nat.h" #include "gdbsupport/common-debug.h" +#include "target/target.h" #ifdef __CYGWIN__ #define __USEWIDE @@ -162,6 +163,45 @@ get_image_name (HANDLE h, void *address, int unicode) return buf; } +/* See nat/windows-nat.h. */ + +bool +windows_process_info::handle_ms_vc_exception (const EXCEPTION_RECORD *rec) +{ + if (rec->NumberParameters >= 3 + && (rec->ExceptionInformation[0] & 0xffffffff) == 0x1000) + { + DWORD named_thread_id; + windows_thread_info *named_thread; + CORE_ADDR thread_name_target; + + thread_name_target = rec->ExceptionInformation[1]; + named_thread_id = (DWORD) (0xffffffff & rec->ExceptionInformation[2]); + + if (named_thread_id == (DWORD) -1) + named_thread_id = current_event.dwThreadId; + + named_thread = thread_rec (ptid_t (current_event.dwProcessId, + named_thread_id, 0), + DONT_INVALIDATE_CONTEXT); + if (named_thread != NULL) + { + int thread_name_len; + gdb::unique_xmalloc_ptr thread_name + = target_read_string (thread_name_target, 1025, &thread_name_len); + if (thread_name_len > 0) + { + thread_name.get ()[thread_name_len - 1] = '\0'; + named_thread->name = std::move (thread_name); + } + } + + return true; + } + + return false; +} + /* The exception thrown by a program to tell the debugger the name of a thread. The exception record contains an ID of a thread and a name to give it. This exception has no documented name, but MSDN diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index 7f76ba0e58f..522e267176d 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -92,7 +92,7 @@ struct windows_thread_info adjustments if the registers are read multiple times. */ bool pc_adjusted = false; - /* The name of the thread, allocated by xmalloc. */ + /* The name of the thread. */ gdb::unique_xmalloc_ptr name; }; @@ -213,16 +213,6 @@ struct windows_process_info void handle_unload_dll (); - /* Handle MS_VC_EXCEPTION when processing a stop. MS_VC_EXCEPTION is - somewhat undocumented but is used to tell the debugger the name of - a thread. - - Return true if the exception was handled; return false otherwise. - - This function must be supplied by the embedding application. */ - - bool handle_ms_vc_exception (const EXCEPTION_RECORD *rec); - /* When EXCEPTION_ACCESS_VIOLATION is processed, we give the embedding application a chance to change it to be considered "unhandled". This function must be supplied by the embedding application. If it @@ -256,6 +246,14 @@ struct windows_process_info private: + /* Handle MS_VC_EXCEPTION when processing a stop. MS_VC_EXCEPTION is + somewhat undocumented but is used to tell the debugger the name of + a thread. + + Return true if the exception was handled; return false otherwise. */ + + bool handle_ms_vc_exception (const EXCEPTION_RECORD *rec); + /* Iterate over all DLLs currently mapped by our inferior, looking for a DLL which is loaded at LOAD_ADDR. If found, add the DLL to our list of solibs; otherwise do nothing. LOAD_ADDR NULL means add all diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 646ddda7328..581eb47e7ba 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -1054,46 +1054,6 @@ display_selectors (const char * args, int from_tty) /* See nat/windows-nat.h. */ -bool -windows_nat::windows_process_info::handle_ms_vc_exception - (const EXCEPTION_RECORD *rec) -{ - if (rec->NumberParameters >= 3 - && (rec->ExceptionInformation[0] & 0xffffffff) == 0x1000) - { - DWORD named_thread_id; - windows_thread_info *named_thread; - CORE_ADDR thread_name_target; - - thread_name_target = rec->ExceptionInformation[1]; - named_thread_id = (DWORD) (0xffffffff & rec->ExceptionInformation[2]); - - if (named_thread_id == (DWORD) -1) - named_thread_id = current_event.dwThreadId; - - named_thread = thread_rec (ptid_t (current_event.dwProcessId, - named_thread_id, 0), - DONT_INVALIDATE_CONTEXT); - if (named_thread != NULL) - { - int thread_name_len; - gdb::unique_xmalloc_ptr thread_name - = target_read_string (thread_name_target, 1025, &thread_name_len); - if (thread_name_len > 0) - { - thread_name.get ()[thread_name_len - 1] = '\0'; - named_thread->name = std::move (thread_name); - } - } - - return true; - } - - return false; -} - -/* See nat/windows-nat.h. */ - bool windows_nat::windows_process_info::handle_access_violation (const EXCEPTION_RECORD *rec) diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 8437c69e1cc..8fde3e95b2d 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -1041,15 +1041,6 @@ fake_breakpoint_event (void) /* See nat/windows-nat.h. */ -bool -windows_nat::windows_process_info::handle_ms_vc_exception - (const EXCEPTION_RECORD *rec) -{ - return false; -} - -/* See nat/windows-nat.h. */ - bool windows_nat::windows_process_info::handle_access_violation (const EXCEPTION_RECORD *rec) -- 2.30.2