diff options
author | Tom Tromey <tromey@adacore.com> | 2022-03-31 13:41:02 -0600 |
---|---|---|
committer | Tom Tromey <tromey@adacore.com> | 2022-04-04 13:58:37 -0600 |
commit | 0578e87f93b09e4cc41d3982eb1672bcfc81042d (patch) | |
tree | f2781002de2cf155a7f4cc9ae5f0c7bf08d1a270 /gdb/windows-nat.c | |
parent | fc0b013e44e5a450631706bc25612b975cfbc692 (diff) | |
download | gdb-0578e87f93b09e4cc41d3982eb1672bcfc81042d.zip gdb-0578e87f93b09e4cc41d3982eb1672bcfc81042d.tar.gz gdb-0578e87f93b09e4cc41d3982eb1672bcfc81042d.tar.bz2 |
Remove some globals from nat/windows-nat.c
nat/windows-nat.c has a number of globals that it uses to communicate
with its clients (gdb and gdbserver). However, if we ever want the
Windows ports to be multi-inferior, globals won't work.
This patch takes a step toward that by moving most nat/windows-nat.c
globals into a new struct windows_process_info. Many functions are
converted to be methods on this object.
A couple of globals remain, as they are needed to truly be global due
to the way that the Windows debugging APIs work.
The clients still have a global for the current process. That is,
this patch is a step toward the end goal, but doesn't implement the
goal itself.
Diffstat (limited to 'gdb/windows-nat.c')
-rw-r--r-- | gdb/windows-nat.c | 356 |
1 files changed, 195 insertions, 161 deletions
diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index e732487..44c1950 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -74,6 +74,9 @@ using namespace windows_nat; +/* The current process. */ +static windows_process_info windows_process; + #undef STARTUPINFO #undef CreateProcess #undef GetModuleFileNameEx @@ -242,7 +245,7 @@ struct windows_nat_target final : public x86_nat_target<inf_child_target> bool stopped_by_sw_breakpoint () override { windows_thread_info *th - = thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); return th->stopped_at_software_breakpoint; } @@ -317,7 +320,8 @@ check (BOOL ok, const char *file, int line) /* See nat/windows-nat.h. */ windows_thread_info * -windows_nat::thread_rec (ptid_t ptid, thread_disposition_type disposition) +windows_nat::windows_process_info::thread_rec + (ptid_t ptid, thread_disposition_type disposition) { for (auto &th : thread_list) if (th->tid == ptid.lwp ()) @@ -361,14 +365,14 @@ windows_add_thread (ptid_t ptid, HANDLE h, void *tlb, bool main_thread_p) gdb_assert (ptid.lwp () != 0); - if ((th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT))) + if ((th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT))) return th; CORE_ADDR base = (CORE_ADDR) (uintptr_t) tlb; #ifdef __x86_64__ /* For WOW64 processes, this is actually the pointer to the 64bit TIB, and the 32bit TIB is exactly 2 pages after it. */ - if (wow64_process) + if (windows_process.wow64_process) base += 0x2000; #endif th = new windows_thread_info (ptid.lwp (), h, base); @@ -462,7 +466,7 @@ windows_fetch_one_register (struct regcache *regcache, char *context_ptr = (char *) &th->context; #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) context_ptr = (char *) &th->wow64_context; #endif @@ -524,7 +528,8 @@ windows_fetch_one_register (struct regcache *regcache, void windows_nat_target::fetch_registers (struct regcache *regcache, int r) { - windows_thread_info *th = thread_rec (regcache->ptid (), INVALIDATE_CONTEXT); + windows_thread_info *th + = windows_process.thread_rec (regcache->ptid (), INVALIDATE_CONTEXT); /* Check if TH exists. Windows sometimes uses a non-existent thread id in its events. */ @@ -547,7 +552,7 @@ windows_nat_target::fetch_registers (struct regcache *regcache, int r) else #endif #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) { th->wow64_context.ContextFlags = CONTEXT_DEBUGGER_DR; CHECK (Wow64GetThreadContext (th->h, &th->wow64_context)); @@ -606,7 +611,7 @@ windows_store_one_register (const struct regcache *regcache, char *context_ptr = (char *) &th->context; #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) context_ptr = (char *) &th->wow64_context; #endif @@ -619,7 +624,8 @@ windows_store_one_register (const struct regcache *regcache, void windows_nat_target::store_registers (struct regcache *regcache, int r) { - windows_thread_info *th = thread_rec (regcache->ptid (), INVALIDATE_CONTEXT); + windows_thread_info *th + = windows_process.thread_rec (regcache->ptid (), INVALIDATE_CONTEXT); /* Check if TH exists. Windows sometimes uses a non-existent thread id in its events. */ @@ -762,7 +768,8 @@ windows_make_so (const char *name, LPVOID load_addr) /* See nat/windows-nat.h. */ void -windows_nat::handle_load_dll (const char *dll_name, LPVOID base) +windows_nat::windows_process_info::handle_load_dll (const char *dll_name, + LPVOID base) { windows_solib *solib = windows_make_so (dll_name, base); DEBUG_EVENTS ("Loading dll \"%s\" at %s.", solib->name.c_str (), @@ -772,7 +779,7 @@ windows_nat::handle_load_dll (const char *dll_name, LPVOID base) /* See nat/windows-nat.h. */ void -windows_nat::handle_unload_dll () +windows_nat::windows_process_info::handle_unload_dll () { LPVOID lpBaseOfDll = current_event.u.UnloadDll.lpBaseOfDll; @@ -804,22 +811,6 @@ windows_nat::handle_unload_dll () host_address_to_string (lpBaseOfDll)); } -/* Call FUNC wrapped in a TRY/CATCH that swallows all GDB - exceptions. */ - -static void -catch_errors (void (*func) ()) -{ - try - { - func (); - } - catch (const gdb_exception &ex) - { - exception_print (gdb_stderr, ex); - } -} - /* Clear list of loaded DLLs. */ static void windows_clear_solib (void) @@ -849,7 +840,8 @@ signal_event_command (const char *args, int from_tty) /* See nat/windows-nat.h. */ int -windows_nat::handle_output_debug_string (struct target_waitstatus *ourstatus) +windows_nat::windows_process_info::handle_output_debug_string + (struct target_waitstatus *ourstatus) { int retval = 0; @@ -914,7 +906,7 @@ display_selector (HANDLE thread, DWORD sel) LDT_ENTRY info; BOOL ret; #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) ret = Wow64GetThreadSelectorEntry (thread, sel, &info); else #endif @@ -1003,12 +995,12 @@ display_selectors (const char * args, int from_tty) } windows_thread_info *current_windows_thread - = thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); if (!args) { #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) { gdb_puts ("Selector $cs\n"); display_selector (current_windows_thread->h, @@ -1064,7 +1056,8 @@ display_selectors (const char * args, int from_tty) /* See nat/windows-nat.h. */ bool -windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD *rec) +windows_nat::windows_process_info::handle_ms_vc_exception + (const EXCEPTION_RECORD *rec) { if (rec->NumberParameters >= 3 && (rec->ExceptionInformation[0] & 0xffffffff) == 0x1000) @@ -1103,7 +1096,8 @@ windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD *rec) /* See nat/windows-nat.h. */ bool -windows_nat::handle_access_violation (const EXCEPTION_RECORD *rec) +windows_nat::windows_process_info::handle_access_violation + (const EXCEPTION_RECORD *rec) { #ifdef __CYGWIN__ /* See if the access violation happened within the cygwin DLL @@ -1134,16 +1128,16 @@ windows_continue (DWORD continue_status, int id, int killed) { BOOL res; - desired_stop_thread_id = id; + windows_process.desired_stop_thread_id = id; - if (matching_pending_stop (debug_events)) + if (windows_process.matching_pending_stop (debug_events)) return TRUE; for (auto &th : thread_list) if (id == -1 || id == (int) th->tid) { #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) { if (th->debug_registers_changed) { @@ -1225,9 +1219,10 @@ windows_continue (DWORD continue_status, int id, int killed) static DWORD fake_create_process (void) { - current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE, - current_event.dwProcessId); - if (current_process_handle != NULL) + windows_process.handle + = OpenProcess (PROCESS_ALL_ACCESS, FALSE, + windows_process.current_event.dwProcessId); + if (windows_process.handle != NULL) open_process_used = 1; else { @@ -1235,12 +1230,12 @@ fake_create_process (void) (unsigned) GetLastError ()); /* We can not debug anything in that case. */ } - windows_add_thread (ptid_t (current_event.dwProcessId, 0, - current_event.dwThreadId), - current_event.u.CreateThread.hThread, - current_event.u.CreateThread.lpThreadLocalBase, + windows_add_thread (ptid_t (windows_process.current_event.dwProcessId, 0, + windows_process.current_event.dwThreadId), + windows_process.current_event.u.CreateThread.hThread, + windows_process.current_event.u.CreateThread.lpThreadLocalBase, true /* main_thread_p */); - return current_event.dwThreadId; + return windows_process.current_event.dwThreadId; } void @@ -1259,11 +1254,12 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig) if (sig != GDB_SIGNAL_0) { - if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT) + if (windows_process.current_event.dwDebugEventCode + != EXCEPTION_DEBUG_EVENT) { DEBUG_EXCEPT ("Cannot continue with signal %d here.", sig); } - else if (sig == last_sig) + else if (sig == windows_process.last_sig) continue_status = DBG_EXCEPTION_NOT_HANDLED; else #if 0 @@ -1287,20 +1283,20 @@ windows_nat_target::resume (ptid_t ptid, int step, enum gdb_signal sig) } #endif DEBUG_EXCEPT ("Can only continue with received signal %d.", - last_sig); + windows_process.last_sig); } - last_sig = GDB_SIGNAL_0; + windows_process.last_sig = GDB_SIGNAL_0; DEBUG_EXEC ("pid=%d, tid=0x%x, step=%d, sig=%d", ptid.pid (), (unsigned) ptid.lwp (), step, sig); /* Get context for currently selected thread. */ - th = thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); + th = windows_process.thread_rec (inferior_ptid, DONT_INVALIDATE_CONTEXT); if (th) { #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) { if (step) { @@ -1385,7 +1381,7 @@ ctrl_c_handler (DWORD event_type) return TRUE; #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) { /* Call DbgUiRemoteBreakin of the 32bit ntdll.dll in the target process. DebugBreakProcess would call the one of the 64bit ntdll.dll, which @@ -1400,7 +1396,7 @@ ctrl_c_handler (DWORD event_type) if (wow64_dbgbreak != nullptr) { - HANDLE thread = CreateRemoteThread (current_process_handle, NULL, + HANDLE thread = CreateRemoteThread (windows_process.handle, NULL, 0, (LPTHREAD_START_ROUTINE) wow64_dbgbreak, NULL, 0, NULL); if (thread) @@ -1410,7 +1406,7 @@ ctrl_c_handler (DWORD event_type) else #endif { - if (!DebugBreakProcess (current_process_handle)) + if (!DebugBreakProcess (windows_process.handle)) warning (_("Could not interrupt program. " "Press Ctrl-c in the program console.")); } @@ -1433,27 +1429,31 @@ windows_nat_target::get_windows_debug_event (int pid, /* If there is a relevant pending stop, report it now. See the comment by the definition of "pending_stops" for details on why this is needed. */ - gdb::optional<pending_stop> stop = fetch_pending_stop (debug_events); + gdb::optional<pending_stop> stop + = windows_process.fetch_pending_stop (debug_events); if (stop.has_value ()) { thread_id = stop->thread_id; *ourstatus = stop->status; - ptid_t ptid (current_event.dwProcessId, thread_id); - windows_thread_info *th = thread_rec (ptid, INVALIDATE_CONTEXT); + ptid_t ptid (windows_process.current_event.dwProcessId, thread_id); + windows_thread_info *th + = windows_process.thread_rec (ptid, INVALIDATE_CONTEXT); th->reload_context = true; return thread_id; } - last_sig = GDB_SIGNAL_0; + windows_process.last_sig = GDB_SIGNAL_0; + DEBUG_EVENT *current_event = &windows_process.current_event; - if (!(debug_event = wait_for_debug_event (¤t_event, 1000))) + if (!(debug_event = wait_for_debug_event (&windows_process.current_event, + 1000))) goto out; continue_status = DBG_CONTINUE; - event_code = current_event.dwDebugEventCode; + event_code = windows_process.current_event.dwDebugEventCode; ourstatus->set_spurious (); have_saved_context = 0; @@ -1461,12 +1461,12 @@ windows_nat_target::get_windows_debug_event (int pid, { case CREATE_THREAD_DEBUG_EVENT: DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "CREATE_THREAD_DEBUG_EVENT"); if (saw_create != 1) { - inferior *inf = find_inferior_pid (this, current_event.dwProcessId); + inferior *inf = find_inferior_pid (this, current_event->dwProcessId); if (!saw_create && inf->attach_flag) { /* Kludge around a Windows bug where first event is a create @@ -1479,64 +1479,64 @@ windows_nat_target::get_windows_debug_event (int pid, break; } /* Record the existence of this thread. */ - thread_id = current_event.dwThreadId; + thread_id = current_event->dwThreadId; windows_add_thread - (ptid_t (current_event.dwProcessId, current_event.dwThreadId, 0), - current_event.u.CreateThread.hThread, - current_event.u.CreateThread.lpThreadLocalBase, + (ptid_t (current_event->dwProcessId, current_event->dwThreadId, 0), + current_event->u.CreateThread.hThread, + current_event->u.CreateThread.lpThreadLocalBase, false /* main_thread_p */); break; case EXIT_THREAD_DEBUG_EVENT: DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "EXIT_THREAD_DEBUG_EVENT"); - windows_delete_thread (ptid_t (current_event.dwProcessId, - current_event.dwThreadId, 0), - current_event.u.ExitThread.dwExitCode, + windows_delete_thread (ptid_t (current_event->dwProcessId, + current_event->dwThreadId, 0), + current_event->u.ExitThread.dwExitCode, false /* main_thread_p */); break; case CREATE_PROCESS_DEBUG_EVENT: DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "CREATE_PROCESS_DEBUG_EVENT"); - CloseHandle (current_event.u.CreateProcessInfo.hFile); + CloseHandle (current_event->u.CreateProcessInfo.hFile); if (++saw_create != 1) break; - current_process_handle = current_event.u.CreateProcessInfo.hProcess; + windows_process.handle = current_event->u.CreateProcessInfo.hProcess; /* Add the main thread. */ windows_add_thread - (ptid_t (current_event.dwProcessId, - current_event.dwThreadId, 0), - current_event.u.CreateProcessInfo.hThread, - current_event.u.CreateProcessInfo.lpThreadLocalBase, + (ptid_t (current_event->dwProcessId, + current_event->dwThreadId, 0), + current_event->u.CreateProcessInfo.hThread, + current_event->u.CreateProcessInfo.lpThreadLocalBase, true /* main_thread_p */); - thread_id = current_event.dwThreadId; + thread_id = current_event->dwThreadId; break; case EXIT_PROCESS_DEBUG_EVENT: DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "EXIT_PROCESS_DEBUG_EVENT"); if (!windows_initialization_done) { target_terminal::ours (); target_mourn_inferior (inferior_ptid); error (_("During startup program exited with code 0x%x."), - (unsigned int) current_event.u.ExitProcess.dwExitCode); + (unsigned int) current_event->u.ExitProcess.dwExitCode); } else if (saw_create == 1) { - windows_delete_thread (ptid_t (current_event.dwProcessId, - current_event.dwThreadId, 0), + windows_delete_thread (ptid_t (current_event->dwProcessId, + current_event->dwThreadId, 0), 0, true /* main_thread_p */); - DWORD exit_status = current_event.u.ExitProcess.dwExitCode; + DWORD exit_status = current_event->u.ExitProcess.dwExitCode; /* If the exit status looks like a fatal exception, but we don't recognize the exception's code, make the original exit status value available, to avoid losing @@ -1548,50 +1548,64 @@ windows_nat_target::get_windows_debug_event (int pid, else ourstatus->set_signalled (gdb_signal_from_host (exit_signal)); - thread_id = current_event.dwThreadId; + thread_id = current_event->dwThreadId; } break; case LOAD_DLL_DEBUG_EVENT: DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "LOAD_DLL_DEBUG_EVENT"); - CloseHandle (current_event.u.LoadDll.hFile); + CloseHandle (current_event->u.LoadDll.hFile); if (saw_create != 1 || ! windows_initialization_done) break; - catch_errors (dll_loaded_event); + try + { + windows_process.dll_loaded_event (); + } + catch (const gdb_exception &ex) + { + exception_print (gdb_stderr, ex); + } ourstatus->set_loaded (); - thread_id = current_event.dwThreadId; + thread_id = current_event->dwThreadId; break; case UNLOAD_DLL_DEBUG_EVENT: DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "UNLOAD_DLL_DEBUG_EVENT"); if (saw_create != 1 || ! windows_initialization_done) break; - catch_errors (handle_unload_dll); + try + { + windows_process.handle_unload_dll (); + } + catch (const gdb_exception &ex) + { + exception_print (gdb_stderr, ex); + } ourstatus->set_loaded (); - thread_id = current_event.dwThreadId; + thread_id = current_event->dwThreadId; break; case EXCEPTION_DEBUG_EVENT: DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "EXCEPTION_DEBUG_EVENT"); if (saw_create != 1) break; - switch (handle_exception (ourstatus, debug_exceptions)) + switch (windows_process.handle_exception (ourstatus, debug_exceptions)) { case HANDLE_EXCEPTION_UNHANDLED: default: continue_status = DBG_EXCEPTION_NOT_HANDLED; break; case HANDLE_EXCEPTION_HANDLED: - thread_id = current_event.dwThreadId; + thread_id = current_event->dwThreadId; break; case HANDLE_EXCEPTION_IGNORED: continue_status = DBG_CONTINUE; @@ -1601,52 +1615,57 @@ windows_nat_target::get_windows_debug_event (int pid, case OUTPUT_DEBUG_STRING_EVENT: /* Message from the kernel. */ DEBUG_EVENTS ("kernel event for pid=%u tid=0x%x code=%s", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId, + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId, "OUTPUT_DEBUG_STRING_EVENT"); if (saw_create != 1) break; - thread_id = handle_output_debug_string (ourstatus); + thread_id = windows_process.handle_output_debug_string (ourstatus); break; default: if (saw_create != 1) break; gdb_printf ("gdb: kernel event for pid=%u tid=0x%x\n", - (unsigned) current_event.dwProcessId, - (unsigned) current_event.dwThreadId); + (unsigned) current_event->dwProcessId, + (unsigned) current_event->dwThreadId); gdb_printf (" unknown event code %u\n", - (unsigned) current_event.dwDebugEventCode); + (unsigned) current_event->dwDebugEventCode); break; } if (!thread_id || saw_create != 1) { - CHECK (windows_continue (continue_status, desired_stop_thread_id, 0)); + CHECK (windows_continue (continue_status, + windows_process.desired_stop_thread_id, 0)); } - else if (desired_stop_thread_id != -1 && desired_stop_thread_id != thread_id) + else if (windows_process.desired_stop_thread_id != -1 + && windows_process.desired_stop_thread_id != thread_id) { /* Pending stop. See the comment by the definition of "pending_stops" for details on why this is needed. */ DEBUG_EVENTS ("get_windows_debug_event - " "unexpected stop in 0x%x (expecting 0x%x)", - thread_id, desired_stop_thread_id); + thread_id, windows_process.desired_stop_thread_id); - if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT - && ((current_event.u.Exception.ExceptionRecord.ExceptionCode + if (current_event->dwDebugEventCode == EXCEPTION_DEBUG_EVENT + && ((current_event->u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) - || (current_event.u.Exception.ExceptionRecord.ExceptionCode + || (current_event->u.Exception.ExceptionRecord.ExceptionCode == STATUS_WX86_BREAKPOINT)) && windows_initialization_done) { - ptid_t ptid = ptid_t (current_event.dwProcessId, thread_id, 0); - windows_thread_info *th = thread_rec (ptid, INVALIDATE_CONTEXT); + ptid_t ptid = ptid_t (current_event->dwProcessId, thread_id, 0); + windows_thread_info *th + = windows_process.thread_rec (ptid, INVALIDATE_CONTEXT); th->stopped_at_software_breakpoint = true; th->pc_adjusted = false; } - pending_stops.push_back ({thread_id, *ourstatus, current_event}); + windows_process.pending_stops.push_back + ({thread_id, *ourstatus, windows_process.current_event}); thread_id = 0; - CHECK (windows_continue (continue_status, desired_stop_thread_id, 0)); + CHECK (windows_continue (continue_status, + windows_process.desired_stop_thread_id, 0)); } out: @@ -1702,20 +1721,23 @@ windows_nat_target::wait (ptid_t ptid, struct target_waitstatus *ourstatus, if (retval) { - ptid_t result = ptid_t (current_event.dwProcessId, retval, 0); + ptid_t result = ptid_t (windows_process.current_event.dwProcessId, + retval, 0); if (ourstatus->kind () != TARGET_WAITKIND_EXITED && ourstatus->kind () != TARGET_WAITKIND_SIGNALLED) { - windows_thread_info *th = thread_rec (result, INVALIDATE_CONTEXT); + windows_thread_info *th + = windows_process.thread_rec (result, INVALIDATE_CONTEXT); if (th != nullptr) { th->stopped_at_software_breakpoint = false; - if (current_event.dwDebugEventCode == EXCEPTION_DEBUG_EVENT - && ((current_event.u.Exception.ExceptionRecord.ExceptionCode + if (windows_process.current_event.dwDebugEventCode + == EXCEPTION_DEBUG_EVENT + && ((windows_process.current_event.u.Exception.ExceptionRecord.ExceptionCode == EXCEPTION_BREAKPOINT) - || (current_event.u.Exception.ExceptionRecord.ExceptionCode + || (windows_process.current_event.u.Exception.ExceptionRecord.ExceptionCode == STATUS_WX86_BREAKPOINT)) && windows_initialization_done) { @@ -1746,15 +1768,16 @@ windows_nat_target::do_initial_windows_stuff (DWORD pid, bool attaching) int i; struct inferior *inf; - last_sig = GDB_SIGNAL_0; + windows_process.last_sig = GDB_SIGNAL_0; open_process_used = 0; for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++) dr[i] = 0; #ifdef __CYGWIN__ cygwin_load_start = cygwin_load_end = 0; #endif - current_event.dwProcessId = pid; - memset (¤t_event, 0, sizeof (current_event)); + windows_process.current_event.dwProcessId = pid; + memset (&windows_process.current_event, 0, + sizeof (windows_process.current_event)); inf = current_inferior (); if (!inf->target_is_pushed (this)) inf->push_target (this); @@ -1764,9 +1787,10 @@ windows_nat_target::do_initial_windows_stuff (DWORD pid, bool attaching) init_wait_for_inferior (); #ifdef __x86_64__ - ignore_first_breakpoint = !attaching && wow64_process; + windows_process.ignore_first_breakpoint + = !attaching && windows_process.wow64_process; - if (!wow64_process) + if (!windows_process.wow64_process) { windows_set_context_register_offsets (amd64_mappings); windows_set_segment_register_p (amd64_windows_segment_register_p); @@ -1820,7 +1844,7 @@ windows_nat_target::do_initial_windows_stuff (DWORD pid, bool attaching) Rather than try to work around this sort of issue, it is much simpler to just ignore DLL load/unload events during the startup phase, and then process them all in one batch now. */ - windows_add_all_dlls (); + windows_process.add_all_dlls (); windows_initialization_done = 1; return; @@ -1918,7 +1942,7 @@ windows_nat_target::attach (const char *args, int from_tty) { BOOL wow64; if (IsWow64Process (h, &wow64)) - wow64_process = wow64; + windows_process.wow64_process = wow64; CloseHandle (h); } #endif @@ -1935,10 +1959,11 @@ windows_nat_target::detach (inferior *inf, int from_tty) ptid_t ptid = minus_one_ptid; resume (ptid, 0, GDB_SIGNAL_0); - if (!DebugActiveProcessStop (current_event.dwProcessId)) + if (!DebugActiveProcessStop (windows_process.current_event.dwProcessId)) { error (_("Can't detach process %u (error %u)"), - (unsigned) current_event.dwProcessId, (unsigned) GetLastError ()); + (unsigned) windows_process.current_event.dwProcessId, + (unsigned) GetLastError ()); detached = 0; } DebugSetProcessKillOnExit (FALSE); @@ -1972,18 +1997,20 @@ windows_get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len) cbNeeded = 0; #ifdef __x86_64__ - if (wow64_process) + if (windows_process.wow64_process) { - if (!EnumProcessModulesEx (current_process_handle, &dh_buf, - sizeof (HMODULE), &cbNeeded, - LIST_MODULES_32BIT) || !cbNeeded) + if (!EnumProcessModulesEx (windows_process.handle, + &dh_buf, sizeof (HMODULE), &cbNeeded, + LIST_MODULES_32BIT) + || !cbNeeded) return 0; } else #endif { - if (!EnumProcessModules (current_process_handle, &dh_buf, - sizeof (HMODULE), &cbNeeded) || !cbNeeded) + if (!EnumProcessModules (windows_process.handle, + &dh_buf, sizeof (HMODULE), &cbNeeded) + || !cbNeeded) return 0; } @@ -2007,7 +2034,7 @@ windows_get_exec_module_filename (char *exe_name_ret, size_t exe_name_max_len) error (_("Error converting executable filename to POSIX: %d."), errno); } #else - len = GetModuleFileNameEx (current_process_handle, + len = GetModuleFileNameEx (windows_process.handle, dh_buf, exe_name_ret, exe_name_max_len); if (len == 0) error (_("Error getting executable filename: %u."), @@ -2748,7 +2775,7 @@ windows_nat_target::create_inferior (const char *exec_file, #ifdef __x86_64__ BOOL wow64; if (IsWow64Process (pi.hProcess, &wow64)) - wow64_process = wow64; + windows_process.wow64_process = wow64; #endif CloseHandle (pi.hThread); @@ -2771,10 +2798,10 @@ windows_nat_target::mourn_inferior () x86_cleanup_dregs(); if (open_process_used) { - CHECK (CloseHandle (current_process_handle)); + CHECK (CloseHandle (windows_process.handle)); open_process_used = 0; } - siginfo_er.ExceptionCode = 0; + windows_process.siginfo_er.ExceptionCode = 0; inf_child_target::mourn_inferior (); } @@ -2785,7 +2812,8 @@ void windows_nat_target::interrupt () { DEBUG_EVENTS ("GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)"); - CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId)); + CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, + windows_process.current_event.dwProcessId)); registers_changed (); /* refresh register state */ } @@ -2804,19 +2832,19 @@ windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, { DEBUG_MEM ("write target memory, %s bytes at %s", pulongest (len), core_addr_to_string (memaddr)); - success = WriteProcessMemory (current_process_handle, + success = WriteProcessMemory (windows_process.handle, (LPVOID) (uintptr_t) memaddr, writebuf, len, &done); if (!success) lasterror = GetLastError (); - FlushInstructionCache (current_process_handle, + FlushInstructionCache (windows_process.handle, (LPCVOID) (uintptr_t) memaddr, len); } else { DEBUG_MEM ("read target memory, %s bytes at %s", pulongest (len), core_addr_to_string (memaddr)); - success = ReadProcessMemory (current_process_handle, + success = ReadProcessMemory (windows_process.handle, (LPCVOID) (uintptr_t) memaddr, readbuf, len, &done); if (!success) @@ -2832,15 +2860,16 @@ windows_xfer_memory (gdb_byte *readbuf, const gdb_byte *writebuf, void windows_nat_target::kill () { - CHECK (TerminateProcess (current_process_handle, 0)); + CHECK (TerminateProcess (windows_process.handle, 0)); for (;;) { if (!windows_continue (DBG_CONTINUE, -1, 1)) break; - if (!wait_for_debug_event (¤t_event, INFINITE)) + if (!wait_for_debug_event (&windows_process.current_event, INFINITE)) break; - if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT) + if (windows_process.current_event.dwDebugEventCode + == EXIT_PROCESS_DEBUG_EVENT) break; } @@ -2906,28 +2935,31 @@ static enum target_xfer_status windows_xfer_siginfo (gdb_byte *readbuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) { - char *buf = (char *) &siginfo_er; - size_t bufsize = sizeof (siginfo_er); + char *buf = (char *) &windows_process.siginfo_er; + size_t bufsize = sizeof (windows_process.siginfo_er); #ifdef __x86_64__ EXCEPTION_RECORD32 er32; - if (wow64_process) + if (windows_process.wow64_process) { buf = (char *) &er32; bufsize = sizeof (er32); - er32.ExceptionCode = siginfo_er.ExceptionCode; - er32.ExceptionFlags = siginfo_er.ExceptionFlags; - er32.ExceptionRecord = (uintptr_t) siginfo_er.ExceptionRecord; - er32.ExceptionAddress = (uintptr_t) siginfo_er.ExceptionAddress; - er32.NumberParameters = siginfo_er.NumberParameters; + er32.ExceptionCode = windows_process.siginfo_er.ExceptionCode; + er32.ExceptionFlags = windows_process.siginfo_er.ExceptionFlags; + er32.ExceptionRecord + = (uintptr_t) windows_process.siginfo_er.ExceptionRecord; + er32.ExceptionAddress + = (uintptr_t) windows_process.siginfo_er.ExceptionAddress; + er32.NumberParameters = windows_process.siginfo_er.NumberParameters; int i; for (i = 0; i < EXCEPTION_MAXIMUM_PARAMETERS; i++) - er32.ExceptionInformation[i] = siginfo_er.ExceptionInformation[i]; + er32.ExceptionInformation[i] + = windows_process.siginfo_er.ExceptionInformation[i]; } #endif - if (siginfo_er.ExceptionCode == 0) + if (windows_process.siginfo_er.ExceptionCode == 0) return TARGET_XFER_E_IO; if (readbuf == nullptr) @@ -2985,7 +3017,7 @@ windows_nat_target::get_tib_address (ptid_t ptid, CORE_ADDR *addr) { windows_thread_info *th; - th = thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + th = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); if (th == NULL) return false; @@ -3006,7 +3038,8 @@ windows_nat_target::get_ada_task_ptid (long lwp, ULONGEST thread) const char * windows_nat_target::thread_name (struct thread_info *thr) { - return thread_rec (thr->ptid, DONT_INVALIDATE_CONTEXT)->name.get (); + return windows_process.thread_rec (thr->ptid, + DONT_INVALIDATE_CONTEXT)->name.get (); } @@ -3178,8 +3211,9 @@ windows_nat_target::thread_alive (ptid_t ptid) { gdb_assert (ptid.lwp () != 0); - return (WaitForSingleObject (thread_rec (ptid, DONT_INVALIDATE_CONTEXT)->h, 0) - != WAIT_OBJECT_0); + windows_thread_info *th + = windows_process.thread_rec (ptid, DONT_INVALIDATE_CONTEXT); + return WaitForSingleObject (th->h, 0) != WAIT_OBJECT_0; } void _initialize_check_for_gdb_ini (); |