aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tromey@adacore.com>2022-04-12 14:25:44 -0600
committerTom Tromey <tromey@adacore.com>2022-04-14 12:12:34 -0600
commit44ac251ad202da57e134f160b6831a56a82a8cf0 (patch)
tree148a8ed6b4e99309e17e9761b30873e5e64b1c0d /gdb
parentb17c7ab3808f5b781537514b28695dafaa29cb28 (diff)
downloadgdb-44ac251ad202da57e134f160b6831a56a82a8cf0.zip
gdb-44ac251ad202da57e134f160b6831a56a82a8cf0.tar.gz
gdb-44ac251ad202da57e134f160b6831a56a82a8cf0.tar.bz2
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/nat/windows-nat.c40
-rw-r--r--gdb/nat/windows-nat.h20
-rw-r--r--gdb/windows-nat.c40
3 files changed, 49 insertions, 51 deletions
diff --git a/gdb/nat/windows-nat.c b/gdb/nat/windows-nat.c
index a82aa89..9fdef46 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<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
diff --git a/gdb/nat/windows-nat.h b/gdb/nat/windows-nat.h
index 7f76ba0..522e267 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<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
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c
index 646ddda..581eb47 100644
--- a/gdb/windows-nat.c
+++ b/gdb/windows-nat.c
@@ -1055,46 +1055,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)
{