1 /* Low level interface to Windows debugging, for gdbserver.
2 Copyright (C) 2006-2022 Free Software Foundation, Inc.
4 Contributed by Leo Zayas. Based on "win32-nat.c" from GDB.
6 This file is part of GDB.
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 #include "gdb/fileio.h"
24 #include "mem-break.h"
25 #include "win32-low.h"
26 #include "gdbthread.h"
35 #include "gdbsupport/gdb_tilde_expand.h"
36 #include "gdbsupport/common-inferior.h"
37 #include "gdbsupport/gdb_wait.h"
39 using namespace windows_nat
;
42 #include <sys/cygwin.h>
45 #define OUTMSG(X) do { printf X; fflush (stderr); } while (0)
58 #define _T(x) TEXT (x)
62 #define COUNTOF(STR) (sizeof (STR) / sizeof ((STR)[0]))
65 int using_threads
= 1;
68 static int attaching
= 0;
70 /* A status that hasn't been reported to the core yet, and so
71 win32_wait should return it next, instead of fetching the next
72 debug event off the win32 API. */
73 static struct target_waitstatus cached_status
;
75 /* Non zero if an interrupt request is to be satisfied by suspending
77 static int soft_interrupt_requested
= 0;
79 /* Non zero if the inferior is stopped in a simulated breakpoint done
80 by suspending all the threads. */
81 static int faked_breakpoint
= 0;
83 /* True if current_process_handle needs to be closed. */
84 static bool open_process_used
= false;
86 const struct target_desc
*win32_tdesc
;
88 const struct target_desc
*wow64_win32_tdesc
;
91 #define NUM_REGS (the_low_target.num_regs ())
93 /* Get the thread ID from the current selected inferior (the current
96 current_thread_ptid (void)
101 /* The current debug event from WaitForDebugEvent. */
103 debug_event_ptid (DEBUG_EVENT
*event
)
105 return ptid_t (event
->dwProcessId
, event
->dwThreadId
, 0);
108 /* Get the thread context of the thread associated with TH. */
111 win32_get_thread_context (windows_thread_info
*th
)
115 memset (&th
->wow64_context
, 0, sizeof (WOW64_CONTEXT
));
118 memset (&th
->context
, 0, sizeof (CONTEXT
));
119 (*the_low_target
.get_thread_context
) (th
);
122 /* Set the thread context of the thread associated with TH. */
125 win32_set_thread_context (windows_thread_info
*th
)
129 Wow64SetThreadContext (th
->h
, &th
->wow64_context
);
132 SetThreadContext (th
->h
, &th
->context
);
135 /* Set the thread context of the thread associated with TH. */
138 win32_prepare_to_resume (windows_thread_info
*th
)
140 if (the_low_target
.prepare_to_resume
!= NULL
)
141 (*the_low_target
.prepare_to_resume
) (th
);
144 /* See win32-low.h. */
147 win32_require_context (windows_thread_info
*th
)
152 context_flags
= th
->wow64_context
.ContextFlags
;
155 context_flags
= th
->context
.ContextFlags
;
156 if (context_flags
== 0)
159 win32_get_thread_context (th
);
163 /* See nat/windows-nat.h. */
165 windows_thread_info
*
166 windows_nat::thread_rec (ptid_t ptid
, thread_disposition_type disposition
)
168 thread_info
*thread
= find_thread_ptid (ptid
);
172 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
173 if (disposition
!= DONT_INVALIDATE_CONTEXT
)
174 win32_require_context (th
);
178 /* Add a thread to the thread list. */
179 static windows_thread_info
*
180 child_add_thread (DWORD pid
, DWORD tid
, HANDLE h
, void *tlb
)
182 windows_thread_info
*th
;
183 ptid_t ptid
= ptid_t (pid
, tid
, 0);
185 if ((th
= thread_rec (ptid
, DONT_INVALIDATE_CONTEXT
)))
188 CORE_ADDR base
= (CORE_ADDR
) (uintptr_t) tlb
;
190 /* For WOW64 processes, this is actually the pointer to the 64bit TIB,
191 and the 32bit TIB is exactly 2 pages after it. */
193 base
+= 2 * 4096; /* page size = 4096 */
195 th
= new windows_thread_info (tid
, h
, base
);
197 add_thread (ptid
, th
);
199 if (the_low_target
.thread_added
!= NULL
)
200 (*the_low_target
.thread_added
) (th
);
205 /* Delete a thread from the list of threads. */
207 delete_thread_info (thread_info
*thread
)
209 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
211 remove_thread (thread
);
215 /* Delete a thread from the list of threads. */
217 child_delete_thread (DWORD pid
, DWORD tid
)
219 /* If the last thread is exiting, just return. */
220 if (all_threads
.size () == 1)
223 thread_info
*thread
= find_thread_ptid (ptid_t (pid
, tid
));
227 delete_thread_info (thread
);
230 /* These watchpoint related wrapper functions simply pass on the function call
231 if the low target has registered a corresponding function. */
234 win32_process_target::supports_z_point_type (char z_type
)
236 return (z_type
== Z_PACKET_SW_BP
237 || (the_low_target
.supports_z_point_type
!= NULL
238 && the_low_target
.supports_z_point_type (z_type
)));
242 win32_process_target::insert_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
243 int size
, raw_breakpoint
*bp
)
245 if (type
== raw_bkpt_type_sw
)
246 return insert_memory_breakpoint (bp
);
247 else if (the_low_target
.insert_point
!= NULL
)
248 return the_low_target
.insert_point (type
, addr
, size
, bp
);
250 /* Unsupported (see target.h). */
255 win32_process_target::remove_point (enum raw_bkpt_type type
, CORE_ADDR addr
,
256 int size
, raw_breakpoint
*bp
)
258 if (type
== raw_bkpt_type_sw
)
259 return remove_memory_breakpoint (bp
);
260 else if (the_low_target
.remove_point
!= NULL
)
261 return the_low_target
.remove_point (type
, addr
, size
, bp
);
263 /* Unsupported (see target.h). */
268 win32_process_target::stopped_by_watchpoint ()
270 if (the_low_target
.stopped_by_watchpoint
!= NULL
)
271 return the_low_target
.stopped_by_watchpoint ();
277 win32_process_target::stopped_data_address ()
279 if (the_low_target
.stopped_data_address
!= NULL
)
280 return the_low_target
.stopped_data_address ();
286 /* Transfer memory from/to the debugged process. */
288 child_xfer_memory (CORE_ADDR memaddr
, char *our
, int len
,
289 int write
, process_stratum_target
*target
)
294 uintptr_t addr
= (uintptr_t) memaddr
;
298 success
= WriteProcessMemory (current_process_handle
, (LPVOID
) addr
,
299 (LPCVOID
) our
, len
, &done
);
301 lasterror
= GetLastError ();
302 FlushInstructionCache (current_process_handle
, (LPCVOID
) addr
, len
);
306 success
= ReadProcessMemory (current_process_handle
, (LPCVOID
) addr
,
307 (LPVOID
) our
, len
, &done
);
309 lasterror
= GetLastError ();
311 if (!success
&& lasterror
== ERROR_PARTIAL_COPY
&& done
> 0)
314 return success
? done
: -1;
317 /* Clear out any old thread list and reinitialize it to a pristine
320 child_init_thread_list (void)
322 for_each_thread (delete_thread_info
);
325 /* Zero during the child initialization phase, and nonzero otherwise. */
327 static int child_initialization_done
= 0;
330 do_initial_child_stuff (HANDLE proch
, DWORD pid
, int attached
)
332 struct process_info
*proc
;
334 last_sig
= GDB_SIGNAL_0
;
336 current_process_handle
= proch
;
337 current_process_id
= pid
;
340 soft_interrupt_requested
= 0;
341 faked_breakpoint
= 0;
342 open_process_used
= true;
344 memset (¤t_event
, 0, sizeof (current_event
));
348 if (!IsWow64Process (proch
, &wow64
))
350 DWORD err
= GetLastError ();
351 error ("Check if WOW64 process failed (error %d): %s\n",
352 (int) err
, strwinerror (err
));
354 wow64_process
= wow64
;
357 && (Wow64GetThreadContext
== nullptr
358 || Wow64SetThreadContext
== nullptr))
359 error ("WOW64 debugging is not supported on this system.\n");
361 ignore_first_breakpoint
= !attached
&& wow64_process
;
364 proc
= add_process (pid
, attached
);
367 proc
->tdesc
= wow64_win32_tdesc
;
370 proc
->tdesc
= win32_tdesc
;
371 child_init_thread_list ();
372 child_initialization_done
= 0;
374 if (the_low_target
.initial_stuff
!= NULL
)
375 (*the_low_target
.initial_stuff
) ();
377 cached_status
.set_ignore ();
379 /* Flush all currently pending debug events (thread and dll list) up
380 to the initial breakpoint. */
383 struct target_waitstatus status
;
385 the_target
->wait (minus_one_ptid
, &status
, 0);
387 /* Note win32_wait doesn't return thread events. */
388 if (status
.kind () != TARGET_WAITKIND_LOADED
)
390 cached_status
= status
;
395 struct thread_resume resume
;
397 resume
.thread
= minus_one_ptid
;
398 resume
.kind
= resume_continue
;
401 the_target
->resume (&resume
, 1);
405 /* Now that the inferior has been started and all DLLs have been mapped,
406 we can iterate over all DLLs and load them in.
408 We avoid doing it any earlier because, on certain versions of Windows,
409 LOAD_DLL_DEBUG_EVENTs are sometimes not complete. In particular,
410 we have seen on Windows 8.1 that the ntdll.dll load event does not
411 include the DLL name, preventing us from creating an associated SO.
412 A possible explanation is that ntdll.dll might be mapped before
413 the SO info gets created by the Windows system -- ntdll.dll is
414 the first DLL to be reported via LOAD_DLL_DEBUG_EVENT and other DLLs
415 do not seem to suffer from that problem.
417 Rather than try to work around this sort of issue, it is much
418 simpler to just ignore DLL load/unload events during the startup
419 phase, and then process them all in one batch now. */
420 windows_add_all_dlls ();
422 child_initialization_done
= 1;
425 /* Resume all artificially suspended threads if we are continuing
428 continue_one_thread (thread_info
*thread
, int thread_id
)
430 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
432 if (thread_id
== -1 || thread_id
== th
->tid
)
434 win32_prepare_to_resume (th
);
438 DWORD
*context_flags
;
441 context_flags
= &th
->wow64_context
.ContextFlags
;
444 context_flags
= &th
->context
.ContextFlags
;
447 win32_set_thread_context (th
);
457 child_continue (DWORD continue_status
, int thread_id
)
459 desired_stop_thread_id
= thread_id
;
460 if (matching_pending_stop (debug_threads
))
463 /* The inferior will only continue after the ContinueDebugEvent
465 for_each_thread ([&] (thread_info
*thread
)
467 continue_one_thread (thread
, thread_id
);
469 faked_breakpoint
= 0;
471 return continue_last_debug_event (continue_status
, debug_threads
);
474 /* Fetch register(s) from the current thread context. */
476 child_fetch_inferior_registers (struct regcache
*regcache
, int r
)
479 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
481 if (r
== -1 || r
> NUM_REGS
)
482 child_fetch_inferior_registers (regcache
, NUM_REGS
);
484 for (regno
= 0; regno
< r
; regno
++)
485 (*the_low_target
.fetch_inferior_register
) (regcache
, th
, regno
);
488 /* Store a new register value into the current thread context. We don't
489 change the program's context until later, when we resume it. */
491 child_store_inferior_registers (struct regcache
*regcache
, int r
)
494 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
496 if (r
== -1 || r
== 0 || r
> NUM_REGS
)
497 child_store_inferior_registers (regcache
, NUM_REGS
);
499 for (regno
= 0; regno
< r
; regno
++)
500 (*the_low_target
.store_inferior_register
) (regcache
, th
, regno
);
503 /* Map the Windows error number in ERROR to a locale-dependent error
504 message string and return a pointer to it. Typically, the values
505 for ERROR come from GetLastError.
507 The string pointed to shall not be modified by the application,
508 but may be overwritten by a subsequent call to strwinerror
510 The strwinerror function does not change the current setting
514 strwinerror (DWORD error
)
516 static char buf
[1024];
518 DWORD lasterr
= GetLastError ();
519 DWORD chars
= FormatMessage (FORMAT_MESSAGE_FROM_SYSTEM
520 | FORMAT_MESSAGE_ALLOCATE_BUFFER
,
523 0, /* Default language */
529 /* If there is an \r\n appended, zap it. */
531 && msgbuf
[chars
- 2] == '\r'
532 && msgbuf
[chars
- 1] == '\n')
538 if (chars
> ((COUNTOF (buf
)) - 1))
540 chars
= COUNTOF (buf
) - 1;
545 wcstombs (buf
, msgbuf
, chars
+ 1);
547 strncpy (buf
, msgbuf
, chars
+ 1);
552 sprintf (buf
, "unknown win32 error (%u)", (unsigned) error
);
554 SetLastError (lasterr
);
559 create_process (const char *program
, char *args
,
560 DWORD flags
, PROCESS_INFORMATION
*pi
)
562 const std::string
&inferior_cwd
= get_inferior_cwd ();
564 size_t argslen
, proglen
;
566 proglen
= strlen (program
) + 1;
567 argslen
= strlen (args
) + proglen
;
569 STARTUPINFOA si
= { sizeof (STARTUPINFOA
) };
570 char *program_and_args
= (char *) alloca (argslen
+ 1);
572 strcpy (program_and_args
, program
);
573 strcat (program_and_args
, " ");
574 strcat (program_and_args
, args
);
575 ret
= CreateProcessA (program
, /* image name */
576 program_and_args
, /* command line */
579 TRUE
, /* inherit handles */
580 flags
, /* start flags */
581 NULL
, /* environment */
582 /* current directory */
583 (inferior_cwd
.empty ()
585 : gdb_tilde_expand (inferior_cwd
.c_str ()).c_str()),
586 &si
, /* start info */
592 /* Start a new process.
593 PROGRAM is the program name.
594 PROGRAM_ARGS is the vector containing the inferior's args.
595 Returns the new PID on success, -1 on failure. Registers the new
596 process with the process list. */
598 win32_process_target::create_inferior (const char *program
,
599 const std::vector
<char *> &program_args
)
601 client_state
&cs
= get_client_state ();
603 char real_path
[PATH_MAX
];
604 char *orig_path
, *new_path
, *path_ptr
;
608 PROCESS_INFORMATION pi
;
610 std::string str_program_args
= construct_inferior_arguments (program_args
);
611 char *args
= (char *) str_program_args
.c_str ();
613 /* win32_wait needs to know we're not attaching. */
617 error ("No executable specified, specify executable to debug.\n");
619 flags
= DEBUG_PROCESS
| DEBUG_ONLY_THIS_PROCESS
;
623 path_ptr
= getenv ("PATH");
626 int size
= cygwin_conv_path_list (CCP_POSIX_TO_WIN_A
, path_ptr
, NULL
, 0);
627 orig_path
= (char *) alloca (strlen (path_ptr
) + 1);
628 new_path
= (char *) alloca (size
);
629 strcpy (orig_path
, path_ptr
);
630 cygwin_conv_path_list (CCP_POSIX_TO_WIN_A
, path_ptr
, new_path
, size
);
631 setenv ("PATH", new_path
, 1);
633 cygwin_conv_path (CCP_POSIX_TO_WIN_A
, program
, real_path
, PATH_MAX
);
637 OUTMSG2 (("Command line is \"%s %s\"\n", program
, args
));
639 #ifdef CREATE_NEW_PROCESS_GROUP
640 flags
|= CREATE_NEW_PROCESS_GROUP
;
643 ret
= create_process (program
, args
, flags
, &pi
);
644 err
= GetLastError ();
645 if (!ret
&& err
== ERROR_FILE_NOT_FOUND
)
647 char *exename
= (char *) alloca (strlen (program
) + 5);
648 strcat (strcpy (exename
, program
), ".exe");
649 ret
= create_process (exename
, args
, flags
, &pi
);
650 err
= GetLastError ();
655 setenv ("PATH", orig_path
, 1);
660 error ("Error creating process \"%s %s\", (error %d): %s\n",
661 program
, args
, (int) err
, strwinerror (err
));
665 OUTMSG2 (("Process created: %s %s\n", program
, (char *) args
));
668 CloseHandle (pi
.hThread
);
670 do_initial_child_stuff (pi
.hProcess
, pi
.dwProcessId
, 0);
672 /* Wait till we are at 1st instruction in program, return new pid
673 (assuming success). */
674 cs
.last_ptid
= wait (ptid_t (current_process_id
), &cs
.last_status
, 0);
676 /* Necessary for handle_v_kill. */
677 signal_pid
= current_process_id
;
679 return current_process_id
;
682 /* Attach to a running process.
683 PID is the process ID to attach to, specified by the user
684 or a higher layer. */
686 win32_process_target::attach (unsigned long pid
)
691 h
= OpenProcess (PROCESS_ALL_ACCESS
, FALSE
, pid
);
694 if (DebugActiveProcess (pid
))
696 DebugSetProcessKillOnExit (FALSE
);
698 /* win32_wait needs to know we're attaching. */
700 do_initial_child_stuff (h
, pid
, 1);
707 err
= GetLastError ();
708 error ("Attach to process failed (error %d): %s\n",
709 (int) err
, strwinerror (err
));
712 /* See nat/windows-nat.h. */
715 windows_nat::handle_output_debug_string (struct target_waitstatus
*ourstatus
)
717 #define READ_BUFFER_LEN 1024
719 char s
[READ_BUFFER_LEN
+ 1] = { 0 };
720 DWORD nbytes
= current_event
.u
.DebugString
.nDebugStringLength
;
725 if (nbytes
> READ_BUFFER_LEN
)
726 nbytes
= READ_BUFFER_LEN
;
728 addr
= (CORE_ADDR
) (size_t) current_event
.u
.DebugString
.lpDebugStringData
;
730 if (current_event
.u
.DebugString
.fUnicode
)
732 /* The event tells us how many bytes, not chars, even
734 WCHAR buffer
[(READ_BUFFER_LEN
+ 1) / sizeof (WCHAR
)] = { 0 };
735 if (read_inferior_memory (addr
, (unsigned char *) buffer
, nbytes
) != 0)
737 wcstombs (s
, buffer
, (nbytes
+ 1) / sizeof (WCHAR
));
741 if (read_inferior_memory (addr
, (unsigned char *) s
, nbytes
) != 0)
745 if (!startswith (s
, "cYg"))
755 #undef READ_BUFFER_LEN
761 win32_clear_inferiors (void)
763 if (open_process_used
)
765 CloseHandle (current_process_handle
);
766 open_process_used
= false;
769 for_each_thread (delete_thread_info
);
770 siginfo_er
.ExceptionCode
= 0;
774 /* Implementation of target_ops::kill. */
777 win32_process_target::kill (process_info
*process
)
779 TerminateProcess (current_process_handle
, 0);
782 if (!child_continue (DBG_CONTINUE
, -1))
784 if (!wait_for_debug_event (¤t_event
, INFINITE
))
786 if (current_event
.dwDebugEventCode
== EXIT_PROCESS_DEBUG_EVENT
)
788 else if (current_event
.dwDebugEventCode
== OUTPUT_DEBUG_STRING_EVENT
)
789 handle_output_debug_string (nullptr);
792 win32_clear_inferiors ();
794 remove_process (process
);
798 /* Implementation of target_ops::detach. */
801 win32_process_target::detach (process_info
*process
)
803 struct thread_resume resume
;
804 resume
.thread
= minus_one_ptid
;
805 resume
.kind
= resume_continue
;
807 this->resume (&resume
, 1);
809 if (!DebugActiveProcessStop (current_process_id
))
812 DebugSetProcessKillOnExit (FALSE
);
813 remove_process (process
);
815 win32_clear_inferiors ();
820 win32_process_target::mourn (struct process_info
*process
)
822 remove_process (process
);
825 /* Implementation of target_ops::join. */
828 win32_process_target::join (int pid
)
830 HANDLE h
= OpenProcess (PROCESS_ALL_ACCESS
, FALSE
, pid
);
833 WaitForSingleObject (h
, INFINITE
);
838 /* Return true iff the thread with thread ID TID is alive. */
840 win32_process_target::thread_alive (ptid_t ptid
)
842 /* Our thread list is reliable; don't bother to poll target
844 return find_thread_ptid (ptid
) != NULL
;
847 /* Resume the inferior process. RESUME_INFO describes how we want
850 win32_process_target::resume (thread_resume
*resume_info
, size_t n
)
855 windows_thread_info
*th
;
856 DWORD continue_status
= DBG_CONTINUE
;
859 /* This handles the very limited set of resume packets that GDB can
860 currently produce. */
862 if (n
== 1 && resume_info
[0].thread
== minus_one_ptid
)
867 /* Yes, we're ignoring resume_info[0].thread. It'd be tricky to make
868 the Windows resume code do the right thing for thread switching. */
869 tid
= current_event
.dwThreadId
;
871 if (resume_info
[0].thread
!= minus_one_ptid
)
873 sig
= gdb_signal_from_host (resume_info
[0].sig
);
874 step
= resume_info
[0].kind
== resume_step
;
882 if (sig
!= GDB_SIGNAL_0
)
884 if (current_event
.dwDebugEventCode
!= EXCEPTION_DEBUG_EVENT
)
886 OUTMSG (("Cannot continue with signal %s here.\n",
887 gdb_signal_to_string (sig
)));
889 else if (sig
== last_sig
)
890 continue_status
= DBG_EXCEPTION_NOT_HANDLED
;
892 OUTMSG (("Can only continue with received signal %s.\n",
893 gdb_signal_to_string (last_sig
)));
896 last_sig
= GDB_SIGNAL_0
;
898 /* Get context for the currently selected thread. */
899 ptid
= debug_event_ptid (¤t_event
);
900 th
= thread_rec (ptid
, DONT_INVALIDATE_CONTEXT
);
903 win32_prepare_to_resume (th
);
905 DWORD
*context_flags
;
908 context_flags
= &th
->wow64_context
.ContextFlags
;
911 context_flags
= &th
->context
.ContextFlags
;
914 /* Move register values from the inferior into the thread
915 context structure. */
916 regcache_invalidate ();
920 if (the_low_target
.single_step
!= NULL
)
921 (*the_low_target
.single_step
) (th
);
923 error ("Single stepping is not supported "
924 "in this configuration.\n");
927 win32_set_thread_context (th
);
932 /* Allow continuing with the same signal that interrupted us.
933 Otherwise complain. */
935 child_continue (continue_status
, tid
);
938 /* See nat/windows-nat.h. */
941 windows_nat::handle_load_dll (const char *name
, LPVOID base
)
943 CORE_ADDR load_addr
= (CORE_ADDR
) (uintptr_t) base
;
945 char buf
[MAX_PATH
+ 1];
946 char buf2
[MAX_PATH
+ 1];
948 WIN32_FIND_DATAA w32_fd
;
949 HANDLE h
= FindFirstFileA (name
, &w32_fd
);
951 /* The symbols in a dll are offset by 0x1000, which is the
952 offset from 0 of the first byte in an image - because
953 of the file header and the section alignment. */
956 if (h
== INVALID_HANDLE_VALUE
)
963 char cwd
[MAX_PATH
+ 1];
965 if (GetCurrentDirectoryA (MAX_PATH
+ 1, cwd
))
967 p
= strrchr (buf
, '\\');
970 SetCurrentDirectoryA (buf
);
971 GetFullPathNameA (w32_fd
.cFileName
, MAX_PATH
, buf
, &p
);
972 SetCurrentDirectoryA (cwd
);
977 if (strcasecmp (buf
, "ntdll.dll") == 0)
979 GetSystemDirectoryA (buf
, sizeof (buf
));
980 strcat (buf
, "\\ntdll.dll");
984 cygwin_conv_path (CCP_WIN_A_TO_POSIX
, buf
, buf2
, sizeof (buf2
));
989 loaded_dll (buf2
, load_addr
);
992 /* See nat/windows-nat.h. */
995 windows_nat::handle_unload_dll ()
997 CORE_ADDR load_addr
=
998 (CORE_ADDR
) (uintptr_t) current_event
.u
.UnloadDll
.lpBaseOfDll
;
1000 /* The symbols in a dll are offset by 0x1000, which is the
1001 offset from 0 of the first byte in an image - because
1002 of the file header and the section alignment. */
1003 load_addr
+= 0x1000;
1004 unloaded_dll (NULL
, load_addr
);
1008 suspend_one_thread (thread_info
*thread
)
1010 windows_thread_info
*th
= (windows_thread_info
*) thread_target_data (thread
);
1016 fake_breakpoint_event (void)
1018 OUTMSG2(("fake_breakpoint_event\n"));
1020 faked_breakpoint
= 1;
1022 memset (¤t_event
, 0, sizeof (current_event
));
1023 current_event
.dwThreadId
= main_thread_id
;
1024 current_event
.dwDebugEventCode
= EXCEPTION_DEBUG_EVENT
;
1025 current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
1026 = EXCEPTION_BREAKPOINT
;
1028 for_each_thread (suspend_one_thread
);
1031 /* See nat/windows-nat.h. */
1034 windows_nat::handle_ms_vc_exception (const EXCEPTION_RECORD
*rec
)
1039 /* See nat/windows-nat.h. */
1042 windows_nat::handle_access_violation (const EXCEPTION_RECORD
*rec
)
1047 /* A helper function that will, if needed, set
1048 'stopped_at_software_breakpoint' on the thread and adjust the
1054 struct regcache
*regcache
= get_thread_regcache (current_thread
, 1);
1055 child_fetch_inferior_registers (regcache
, -1);
1057 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
1058 DONT_INVALIDATE_CONTEXT
);
1059 th
->stopped_at_software_breakpoint
= false;
1061 if (current_event
.dwDebugEventCode
== EXCEPTION_DEBUG_EVENT
1062 && ((current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
1063 == EXCEPTION_BREAKPOINT
)
1064 || (current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
1065 == STATUS_WX86_BREAKPOINT
))
1066 && child_initialization_done
)
1068 th
->stopped_at_software_breakpoint
= true;
1069 CORE_ADDR pc
= regcache_read_pc (regcache
);
1070 CORE_ADDR sw_breakpoint_pc
= pc
- the_low_target
.decr_pc_after_break
;
1071 regcache_write_pc (regcache
, sw_breakpoint_pc
);
1075 /* Get the next event from the child. */
1078 get_child_debug_event (DWORD
*continue_status
,
1079 struct target_waitstatus
*ourstatus
)
1083 last_sig
= GDB_SIGNAL_0
;
1084 ourstatus
->set_spurious ();
1085 *continue_status
= DBG_CONTINUE
;
1087 /* Check if GDB sent us an interrupt request. */
1088 check_remote_input_interrupt_request ();
1090 if (soft_interrupt_requested
)
1092 soft_interrupt_requested
= 0;
1093 fake_breakpoint_event ();
1099 gdb::optional
<pending_stop
> stop
= fetch_pending_stop (debug_threads
);
1100 if (stop
.has_value ())
1102 *ourstatus
= stop
->status
;
1103 current_event
= stop
->event
;
1104 ptid
= debug_event_ptid (¤t_event
);
1105 switch_to_thread (find_thread_ptid (ptid
));
1109 /* Keep the wait time low enough for comfortable remote
1110 interruption, but high enough so gdbserver doesn't become a
1112 if (!wait_for_debug_event (¤t_event
, 250))
1114 DWORD e
= GetLastError();
1116 if (e
== ERROR_PIPE_NOT_CONNECTED
)
1118 /* This will happen if the loader fails to succesfully
1119 load the application, e.g., if the main executable
1120 tries to pull in a non-existing export from a
1122 ourstatus
->set_exited (1);
1132 switch (current_event
.dwDebugEventCode
)
1134 case CREATE_THREAD_DEBUG_EVENT
:
1135 OUTMSG2 (("gdbserver: kernel event CREATE_THREAD_DEBUG_EVENT "
1136 "for pid=%u tid=%x)\n",
1137 (unsigned) current_event
.dwProcessId
,
1138 (unsigned) current_event
.dwThreadId
));
1140 /* Record the existence of this thread. */
1141 child_add_thread (current_event
.dwProcessId
,
1142 current_event
.dwThreadId
,
1143 current_event
.u
.CreateThread
.hThread
,
1144 current_event
.u
.CreateThread
.lpThreadLocalBase
);
1147 case EXIT_THREAD_DEBUG_EVENT
:
1148 OUTMSG2 (("gdbserver: kernel event EXIT_THREAD_DEBUG_EVENT "
1149 "for pid=%u tid=%x\n",
1150 (unsigned) current_event
.dwProcessId
,
1151 (unsigned) current_event
.dwThreadId
));
1152 child_delete_thread (current_event
.dwProcessId
,
1153 current_event
.dwThreadId
);
1155 switch_to_thread (get_first_thread ());
1158 case CREATE_PROCESS_DEBUG_EVENT
:
1159 OUTMSG2 (("gdbserver: kernel event CREATE_PROCESS_DEBUG_EVENT "
1160 "for pid=%u tid=%x\n",
1161 (unsigned) current_event
.dwProcessId
,
1162 (unsigned) current_event
.dwThreadId
));
1163 CloseHandle (current_event
.u
.CreateProcessInfo
.hFile
);
1165 if (open_process_used
)
1167 CloseHandle (current_process_handle
);
1168 open_process_used
= false;
1171 current_process_handle
= current_event
.u
.CreateProcessInfo
.hProcess
;
1172 main_thread_id
= current_event
.dwThreadId
;
1174 /* Add the main thread. */
1175 child_add_thread (current_event
.dwProcessId
,
1177 current_event
.u
.CreateProcessInfo
.hThread
,
1178 current_event
.u
.CreateProcessInfo
.lpThreadLocalBase
);
1181 case EXIT_PROCESS_DEBUG_EVENT
:
1182 OUTMSG2 (("gdbserver: kernel event EXIT_PROCESS_DEBUG_EVENT "
1183 "for pid=%u tid=%x\n",
1184 (unsigned) current_event
.dwProcessId
,
1185 (unsigned) current_event
.dwThreadId
));
1187 DWORD exit_status
= current_event
.u
.ExitProcess
.dwExitCode
;
1188 /* If the exit status looks like a fatal exception, but we
1189 don't recognize the exception's code, make the original
1190 exit status value available, to avoid losing information. */
1192 = WIFSIGNALED (exit_status
) ? WTERMSIG (exit_status
) : -1;
1193 if (exit_signal
== -1)
1194 ourstatus
->set_exited (exit_status
);
1196 ourstatus
->set_signalled (gdb_signal_from_host (exit_signal
));
1198 child_continue (DBG_CONTINUE
, desired_stop_thread_id
);
1201 case LOAD_DLL_DEBUG_EVENT
:
1202 OUTMSG2 (("gdbserver: kernel event LOAD_DLL_DEBUG_EVENT "
1203 "for pid=%u tid=%x\n",
1204 (unsigned) current_event
.dwProcessId
,
1205 (unsigned) current_event
.dwThreadId
));
1206 CloseHandle (current_event
.u
.LoadDll
.hFile
);
1207 if (! child_initialization_done
)
1209 dll_loaded_event ();
1211 ourstatus
->set_loaded ();
1214 case UNLOAD_DLL_DEBUG_EVENT
:
1215 OUTMSG2 (("gdbserver: kernel event UNLOAD_DLL_DEBUG_EVENT "
1216 "for pid=%u tid=%x\n",
1217 (unsigned) current_event
.dwProcessId
,
1218 (unsigned) current_event
.dwThreadId
));
1219 if (! child_initialization_done
)
1221 handle_unload_dll ();
1222 ourstatus
->set_loaded ();
1225 case EXCEPTION_DEBUG_EVENT
:
1226 OUTMSG2 (("gdbserver: kernel event EXCEPTION_DEBUG_EVENT "
1227 "for pid=%u tid=%x\n",
1228 (unsigned) current_event
.dwProcessId
,
1229 (unsigned) current_event
.dwThreadId
));
1230 if (handle_exception (ourstatus
, debug_threads
)
1231 == HANDLE_EXCEPTION_UNHANDLED
)
1232 *continue_status
= DBG_EXCEPTION_NOT_HANDLED
;
1235 case OUTPUT_DEBUG_STRING_EVENT
:
1236 /* A message from the kernel (or Cygwin). */
1237 OUTMSG2 (("gdbserver: kernel event OUTPUT_DEBUG_STRING_EVENT "
1238 "for pid=%u tid=%x\n",
1239 (unsigned) current_event
.dwProcessId
,
1240 (unsigned) current_event
.dwThreadId
));
1241 handle_output_debug_string (nullptr);
1245 OUTMSG2 (("gdbserver: kernel event unknown "
1246 "for pid=%u tid=%x code=%x\n",
1247 (unsigned) current_event
.dwProcessId
,
1248 (unsigned) current_event
.dwThreadId
,
1249 (unsigned) current_event
.dwDebugEventCode
));
1253 ptid
= debug_event_ptid (¤t_event
);
1255 if (desired_stop_thread_id
!= -1 && desired_stop_thread_id
!= ptid
.lwp ())
1257 /* Pending stop. See the comment by the definition of
1258 "pending_stops" for details on why this is needed. */
1259 OUTMSG2 (("get_windows_debug_event - "
1260 "unexpected stop in 0x%lx (expecting 0x%x)\n",
1261 ptid
.lwp (), desired_stop_thread_id
));
1263 pending_stops
.push_back ({(DWORD
) ptid
.lwp (), *ourstatus
, current_event
});
1264 ourstatus
->set_spurious ();
1267 switch_to_thread (find_thread_ptid (ptid
));
1272 /* Wait for the inferior process to change state.
1273 STATUS will be filled in with a response code to send to GDB.
1274 Returns the signal which caused the process to stop. */
1276 win32_process_target::wait (ptid_t ptid
, target_waitstatus
*ourstatus
,
1277 target_wait_flags options
)
1279 if (cached_status
.kind () != TARGET_WAITKIND_IGNORE
)
1281 /* The core always does a wait after creating the inferior, and
1282 do_initial_child_stuff already ran the inferior to the
1283 initial breakpoint (or an exit, if creating the process
1284 fails). Report it now. */
1285 *ourstatus
= cached_status
;
1286 cached_status
.set_ignore ();
1287 return debug_event_ptid (¤t_event
);
1292 DWORD continue_status
;
1293 if (!get_child_debug_event (&continue_status
, ourstatus
))
1296 switch (ourstatus
->kind ())
1298 case TARGET_WAITKIND_EXITED
:
1299 OUTMSG2 (("Child exited with retcode = %x\n",
1300 ourstatus
->exit_status ()));
1301 win32_clear_inferiors ();
1302 return ptid_t (current_event
.dwProcessId
);
1303 case TARGET_WAITKIND_STOPPED
:
1304 case TARGET_WAITKIND_SIGNALLED
:
1305 case TARGET_WAITKIND_LOADED
:
1307 OUTMSG2 (("Child Stopped with signal = %d \n",
1308 ourstatus
->sig ()));
1310 return debug_event_ptid (¤t_event
);
1313 OUTMSG (("Ignoring unknown internal event, %d\n",
1314 ourstatus
->kind ()));
1316 case TARGET_WAITKIND_SPURIOUS
:
1317 /* do nothing, just continue */
1318 child_continue (continue_status
, desired_stop_thread_id
);
1324 /* Fetch registers from the inferior process.
1325 If REGNO is -1, fetch all registers; otherwise, fetch at least REGNO. */
1327 win32_process_target::fetch_registers (regcache
*regcache
, int regno
)
1329 child_fetch_inferior_registers (regcache
, regno
);
1332 /* Store registers to the inferior process.
1333 If REGNO is -1, store all registers; otherwise, store at least REGNO. */
1335 win32_process_target::store_registers (regcache
*regcache
, int regno
)
1337 child_store_inferior_registers (regcache
, regno
);
1340 /* Read memory from the inferior process. This should generally be
1341 called through read_inferior_memory, which handles breakpoint shadowing.
1342 Read LEN bytes at MEMADDR into a buffer at MYADDR. */
1344 win32_process_target::read_memory (CORE_ADDR memaddr
, unsigned char *myaddr
,
1347 return child_xfer_memory (memaddr
, (char *) myaddr
, len
, 0, 0) != len
;
1350 /* Write memory to the inferior process. This should generally be
1351 called through write_inferior_memory, which handles breakpoint shadowing.
1352 Write LEN bytes from the buffer at MYADDR to MEMADDR.
1353 Returns 0 on success and errno on failure. */
1355 win32_process_target::write_memory (CORE_ADDR memaddr
,
1356 const unsigned char *myaddr
, int len
)
1358 return child_xfer_memory (memaddr
, (char *) myaddr
, len
, 1, 0) != len
;
1361 /* Send an interrupt request to the inferior process. */
1363 win32_process_target::request_interrupt ()
1365 if (GenerateConsoleCtrlEvent (CTRL_BREAK_EVENT
, current_process_id
))
1368 /* GenerateConsoleCtrlEvent can fail if process id being debugged is
1369 not a process group id.
1370 Fallback to XP/Vista 'DebugBreakProcess', which generates a
1371 breakpoint exception in the interior process. */
1373 if (DebugBreakProcess (current_process_handle
))
1376 /* Last resort, suspend all threads manually. */
1377 soft_interrupt_requested
= 1;
1381 win32_process_target::supports_hardware_single_step ()
1387 win32_process_target::supports_qxfer_siginfo ()
1392 /* Write Windows signal info. */
1395 win32_process_target::qxfer_siginfo (const char *annex
,
1396 unsigned char *readbuf
,
1397 unsigned const char *writebuf
,
1398 CORE_ADDR offset
, int len
)
1400 if (siginfo_er
.ExceptionCode
== 0)
1403 if (readbuf
== nullptr)
1406 char *buf
= (char *) &siginfo_er
;
1407 size_t bufsize
= sizeof (siginfo_er
);
1410 EXCEPTION_RECORD32 er32
;
1413 buf
= (char *) &er32
;
1414 bufsize
= sizeof (er32
);
1416 er32
.ExceptionCode
= siginfo_er
.ExceptionCode
;
1417 er32
.ExceptionFlags
= siginfo_er
.ExceptionFlags
;
1418 er32
.ExceptionRecord
= (uintptr_t) siginfo_er
.ExceptionRecord
;
1419 er32
.ExceptionAddress
= (uintptr_t) siginfo_er
.ExceptionAddress
;
1420 er32
.NumberParameters
= siginfo_er
.NumberParameters
;
1422 for (i
= 0; i
< EXCEPTION_MAXIMUM_PARAMETERS
; i
++)
1423 er32
.ExceptionInformation
[i
] = siginfo_er
.ExceptionInformation
[i
];
1427 if (offset
> bufsize
)
1430 if (offset
+ len
> bufsize
)
1431 len
= bufsize
- offset
;
1433 memcpy (readbuf
, buf
+ offset
, len
);
1439 win32_process_target::supports_get_tib_address ()
1444 /* Write Windows OS Thread Information Block address. */
1447 win32_process_target::get_tib_address (ptid_t ptid
, CORE_ADDR
*addr
)
1449 windows_thread_info
*th
;
1450 th
= thread_rec (ptid
, DONT_INVALIDATE_CONTEXT
);
1454 *addr
= th
->thread_local_base
;
1458 /* Implementation of the target_ops method "sw_breakpoint_from_kind". */
1461 win32_process_target::sw_breakpoint_from_kind (int kind
, int *size
)
1463 *size
= the_low_target
.breakpoint_len
;
1464 return the_low_target
.breakpoint
;
1468 win32_process_target::stopped_by_sw_breakpoint ()
1470 windows_thread_info
*th
= thread_rec (current_thread_ptid (),
1471 DONT_INVALIDATE_CONTEXT
);
1472 return th
== nullptr ? false : th
->stopped_at_software_breakpoint
;
1476 win32_process_target::supports_stopped_by_sw_breakpoint ()
1482 win32_process_target::read_pc (struct regcache
*regcache
)
1484 return (*the_low_target
.get_pc
) (regcache
);
1488 win32_process_target::write_pc (struct regcache
*regcache
, CORE_ADDR pc
)
1490 return (*the_low_target
.set_pc
) (regcache
, pc
);
1493 /* The win32 target ops object. */
1495 static win32_process_target the_win32_target
;
1497 /* Initialize the Win32 backend. */
1499 initialize_low (void)
1501 set_target_ops (&the_win32_target
);
1502 the_low_target
.arch_setup ();
1504 initialize_loadable ();