diff options
-rw-r--r-- | gdb/nat/windows-nat.c | 40 | ||||
-rw-r--r-- | gdb/nat/windows-nat.h | 20 | ||||
-rw-r--r-- | gdb/windows-nat.c | 40 | ||||
-rw-r--r-- | 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 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) { diff --git a/gdbserver/win32-low.cc b/gdbserver/win32-low.cc index 8437c69..8fde3e9 100644 --- a/gdbserver/win32-low.cc +++ b/gdbserver/win32-low.cc @@ -1042,15 +1042,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) { |