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.
This commit is contained in:
Tom Tromey
2022-04-12 14:25:44 -06:00
parent b17c7ab380
commit 44ac251ad2
4 changed files with 49 additions and 60 deletions

View File

@@ -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<char> 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

View File

@@ -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<char> 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

View File

@@ -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<char> 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)

View File

@@ -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)