diff options
author | Tom Tromey <tromey@adacore.com> | 2022-04-13 08:45:34 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-04-14 12:12:35 -0600 |
commit | 8bbdbd6985d8d7615bab69f97f07e8bb78fb98f8 (patch) | |
tree | 75278187c8faf5a564fc459afc9e29aa2be382fc /gdb/nat | |
parent | 1ea519ec192d68397d8b22f55072fc7ba0c5e36c (diff) | |
download | fsf-binutils-gdb-8bbdbd6985d8d7615bab69f97f07e8bb78fb98f8.zip fsf-binutils-gdb-8bbdbd6985d8d7615bab69f97f07e8bb78fb98f8.tar.gz fsf-binutils-gdb-8bbdbd6985d8d7615bab69f97f07e8bb78fb98f8.tar.bz2 |
Use GetThreadDescription on Windows
Windows 10 introduced SetThreadDescription and GetThreadDescription, a
simpler way to set a thread's name. This changes gdb and gdbserver to
use this convention when it is available.
This is part of PR win32/29050.
Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=29050
Diffstat (limited to 'gdb/nat')
-rw-r--r-- | gdb/nat/windows-nat.c | 37 | ||||
-rw-r--r-- | gdb/nat/windows-nat.h | 5 |
2 files changed, 42 insertions, 0 deletions
diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c index 9fdef46..bd1b945 100644 --- a/gdb/nat/windows-nat.c +++ b/gdb/nat/windows-nat.c @@ -58,6 +58,10 @@ Wow64GetThreadSelectorEntry_ftype *Wow64GetThreadSelectorEntry; #endif GenerateConsoleCtrlEvent_ftype *GenerateConsoleCtrlEvent; +#define GetThreadDescription dyn_GetThreadDescription +typedef HRESULT WINAPI (GetThreadDescription_ftype) (HANDLE, PWSTR *); +static GetThreadDescription_ftype *GetThreadDescription; + /* Note that 'debug_events' must be locally defined in the relevant functions. */ #define DEBUG_EVENTS(fmt, ...) \ @@ -106,6 +110,29 @@ windows_thread_info::resume () suspended = 0; } +const char * +windows_thread_info::thread_name () +{ + if (GetThreadDescription != nullptr) + { + PWSTR value; + HRESULT result = GetThreadDescription (h, &value); + if (SUCCEEDED (result)) + { + size_t needed = wcstombs (nullptr, value, 0); + if (needed != (size_t) -1) + { + name.reset ((char *) xmalloc (needed)); + if (wcstombs (name.get (), value, needed) == (size_t) -1) + name.reset (); + } + LocalFree (value); + } + } + + return name.get (); +} + /* 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 @@ -662,6 +689,7 @@ initialize_loadable () GPA (hm, Wow64GetThreadSelectorEntry); #endif GPA (hm, GenerateConsoleCtrlEvent); + GPA (hm, GetThreadDescription); } /* Set variables to dummy versions of these processes if the function @@ -718,6 +746,15 @@ initialize_loadable () OpenProcessToken = bad; } + /* On some versions of Windows, this function is only available in + KernelBase.dll, not kernel32.dll. */ + if (GetThreadDescription == nullptr) + { + hm = LoadLibrary (TEXT ("KernelBase.dll")); + if (hm) + GPA (hm, GetThreadDescription); + } + #undef GPA return result; diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h index 522e267..29fd0a3 100644 --- a/gdb/nat/windows-nat.h +++ b/gdb/nat/windows-nat.h @@ -51,6 +51,11 @@ struct windows_thread_info /* Resume the thread if it has been suspended. */ void resume (); + /* Return the thread's name, or nullptr if not known. The name is + stored in this thread and is guaranteed to live until at least + the next call. */ + const char *thread_name (); + /* The Win32 thread identifier. */ DWORD tid; |