1 /* Target-vector operations for controlling win32 child processes, for GDB.
2 Copyright 1995, 1996, 1997, 1998, 1999, 2000 Free Software Foundation, Inc.
3 Contributed by Cygnus Solutions, A Red Hat Company.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without eve nthe implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA.
23 /* by Steve Chamberlain, sac@cygnus.com */
25 /* We assume we're being built with and will be used for cygwin. */
28 #include "frame.h" /* required by inferior.h */
34 #include <sys/types.h>
39 #include <sys/cygwin.h>
44 #include "gdb_string.h"
45 #include "gdbthread.h"
47 #include <sys/param.h>
50 /* The ui's event loop. */
51 extern int (*ui_loop_hook) (int signo);
53 /* If we're not using the old Cygwin header file set, define the
54 following which never should have been in the generic Win32 API
55 headers in the first place since they were our own invention... */
56 #ifndef _GNU_H_WINDOWS_H
59 FLAG_TRACE_BIT = 0x100,
60 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
63 #include <sys/procfs.h>
66 /* The string sent by cygwin when it processes a signal.
67 FIXME: This should be in a cygwin include file. */
68 #define CYGWIN_SIGNAL_STRING "cygwin: signal"
70 #define CHECK(x) check (x, __FILE__,__LINE__)
71 #define DEBUG_EXEC(x) if (debug_exec) printf x
72 #define DEBUG_EVENTS(x) if (debug_events) printf x
73 #define DEBUG_MEM(x) if (debug_memory) printf x
74 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf x
76 /* Forward declaration */
77 extern struct target_ops child_ops;
79 static void child_stop (void);
80 static int win32_child_thread_alive (int);
81 void child_kill_inferior (void);
83 static int last_sig = 0; /* Set if a signal was received from the
85 /* Thread information structure used to track information that is
86 not available in gdb's thread structure. */
87 typedef struct thread_info_struct
89 struct thread_info_struct *next;
99 static thread_info thread_head;
101 /* The process and thread handles for the above context. */
103 static DEBUG_EVENT current_event; /* The current debug event from
105 static HANDLE current_process_handle; /* Currently executing process */
106 static thread_info *current_thread; /* Info on currently selected thread */
107 static DWORD main_thread_id; /* Thread ID of the main thread */
109 /* Counts of things. */
110 static int exception_count = 0;
111 static int event_count = 0;
114 static int new_console = 0;
115 static int new_group = 1;
116 static int debug_exec = 0; /* show execution */
117 static int debug_events = 0; /* show events from kernel */
118 static int debug_memory = 0; /* show target memory accesses */
119 static int debug_exceptions = 0; /* show target exceptions */
121 /* This vector maps GDB's idea of a register's number into an address
122 in the win32 exception context vector.
124 It also contains the bit mask needed to load the register in question.
126 One day we could read a reg, we could inspect the context we
127 already have loaded, if it doesn't have the bit set that we need,
128 we read that set of registers in using GetThreadContext. If the
129 context already contains what we need, we just unpack it. Then to
130 write a register, first we have to ensure that the context contains
131 the other regs of the group, and then we copy the info in and set
134 #define context_offset(x) ((int)&(((CONTEXT *)NULL)->x))
135 static const int mappings[] =
137 context_offset (Eax),
138 context_offset (Ecx),
139 context_offset (Edx),
140 context_offset (Ebx),
141 context_offset (Esp),
142 context_offset (Ebp),
143 context_offset (Esi),
144 context_offset (Edi),
145 context_offset (Eip),
146 context_offset (EFlags),
147 context_offset (SegCs),
148 context_offset (SegSs),
149 context_offset (SegDs),
150 context_offset (SegEs),
151 context_offset (SegFs),
152 context_offset (SegGs),
153 context_offset (FloatSave.RegisterArea[0 * 10]),
154 context_offset (FloatSave.RegisterArea[1 * 10]),
155 context_offset (FloatSave.RegisterArea[2 * 10]),
156 context_offset (FloatSave.RegisterArea[3 * 10]),
157 context_offset (FloatSave.RegisterArea[4 * 10]),
158 context_offset (FloatSave.RegisterArea[5 * 10]),
159 context_offset (FloatSave.RegisterArea[6 * 10]),
160 context_offset (FloatSave.RegisterArea[7 * 10]),
161 context_offset (FloatSave.ControlWord),
162 context_offset (FloatSave.StatusWord),
163 context_offset (FloatSave.TagWord),
164 context_offset (FloatSave.ErrorSelector),
165 context_offset (FloatSave.ErrorOffset),
166 context_offset (FloatSave.DataSelector),
167 context_offset (FloatSave.DataOffset),
168 context_offset (FloatSave.ErrorSelector)
171 #undef context_offset
173 /* This vector maps the target's idea of an exception (extracted
174 from the DEBUG_EVENT structure) to GDB's idea. */
176 struct xlate_exception
179 enum target_signal us;
182 static const struct xlate_exception
185 {EXCEPTION_ACCESS_VIOLATION, TARGET_SIGNAL_SEGV},
186 {STATUS_STACK_OVERFLOW, TARGET_SIGNAL_SEGV},
187 {EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
188 {DBG_CONTROL_C, TARGET_SIGNAL_INT},
189 {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
192 /* Find a thread record given a thread id.
193 If get_context then also retrieve the context for this
196 thread_rec (DWORD id, int get_context)
200 for (th = &thread_head; (th = th->next) != NULL;)
203 if (!th->suspend_count && get_context)
205 if (get_context > 0 && id != current_event.dwThreadId)
206 th->suspend_count = SuspendThread (th->h) + 1;
207 else if (get_context < 0)
208 th->suspend_count = -1;
210 th->context.ContextFlags = CONTEXT_DEBUGGER;
211 GetThreadContext (th->h, &th->context);
219 /* Add a thread to the thread list */
221 child_add_thread (DWORD id, HANDLE h)
225 if ((th = thread_rec (id, FALSE)))
228 th = (thread_info *) xmalloc (sizeof (*th));
229 memset (th, 0, sizeof (*th));
232 th->next = thread_head.next;
233 thread_head.next = th;
238 /* Clear out any old thread list and reintialize it to a
241 child_init_thread_list (void)
243 thread_info *th = &thread_head;
245 DEBUG_EVENTS (("gdb: child_init_thread_list\n"));
247 while (th->next != NULL)
249 thread_info *here = th->next;
250 th->next = here->next;
251 (void) CloseHandle (here->h);
256 /* Delete a thread from the list of threads */
258 child_delete_thread (DWORD id)
263 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (id));
266 for (th = &thread_head;
267 th->next != NULL && th->next->id != id;
271 if (th->next != NULL)
273 thread_info *here = th->next;
274 th->next = here->next;
275 CloseHandle (here->h);
281 check (BOOL ok, const char *file, int line)
284 printf_filtered ("error return %s:%d was %lu\n", file, line, GetLastError ());
288 do_child_fetch_inferior_registers (int r)
290 char *context_offset = ((char *) ¤t_thread->context) + mappings[r];
294 l = *((long *) context_offset) & 0xffff;
295 supply_register (r, (char *) &l);
297 else if (r == FOP_REGNUM)
299 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
300 supply_register (r, (char *) &l);
303 supply_register (r, context_offset);
306 for (r = 0; r < NUM_REGS; r++)
307 do_child_fetch_inferior_registers (r);
312 child_fetch_inferior_registers (int r)
314 current_thread = thread_rec (inferior_pid, TRUE);
315 do_child_fetch_inferior_registers (r);
319 do_child_store_inferior_registers (int r)
322 read_register_gen (r, ((char *) ¤t_thread->context) + mappings[r]);
325 for (r = 0; r < NUM_REGS; r++)
326 do_child_store_inferior_registers (r);
330 /* Store a new register value into the current thread context */
332 child_store_inferior_registers (int r)
334 current_thread = thread_rec (inferior_pid, TRUE);
335 do_child_store_inferior_registers (r);
338 static int psapi_loaded = 0;
339 static HMODULE psapi_module_handle = NULL;
340 static BOOL WINAPI (*psapi_EnumProcessModules) (HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
341 static BOOL WINAPI (*psapi_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, DWORD) = NULL;
342 static DWORD WINAPI (*psapi_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, DWORD) = NULL;
345 psapi_get_dll_name (DWORD BaseAddress, char *dll_name_ret)
351 HMODULE *DllHandle = dh_buf;
356 psapi_EnumProcessModules == NULL ||
357 psapi_GetModuleInformation == NULL ||
358 psapi_GetModuleFileNameExA == NULL)
363 psapi_module_handle = LoadLibrary ("psapi.dll");
364 if (!psapi_module_handle)
366 /* printf_unfiltered ("error loading psapi.dll: %u", GetLastError ()); */
369 psapi_EnumProcessModules = GetProcAddress (psapi_module_handle, "EnumProcessModules");
370 psapi_GetModuleInformation = GetProcAddress (psapi_module_handle, "GetModuleInformation");
371 psapi_GetModuleFileNameExA = (void *) GetProcAddress (psapi_module_handle,
372 "GetModuleFileNameExA");
373 if (psapi_EnumProcessModules == NULL ||
374 psapi_GetModuleInformation == NULL ||
375 psapi_GetModuleFileNameExA == NULL)
380 ok = (*psapi_EnumProcessModules) (current_process_handle,
385 if (!ok || !cbNeeded)
388 DllHandle = (HMODULE *) alloca (cbNeeded);
392 ok = (*psapi_EnumProcessModules) (current_process_handle,
399 for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
401 if (!(*psapi_GetModuleInformation) (current_process_handle,
405 error ("Can't get module info");
407 len = (*psapi_GetModuleFileNameExA) (current_process_handle,
412 error ("Error getting dll name: %u\n", GetLastError ());
414 if ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
419 dll_name_ret[0] = '\0';
423 /* Encapsulate the information required in a call to
424 symbol_file_add_args */
425 struct safe_symbol_file_add_args
429 struct section_addr_info *addrs;
432 struct ui_file *err, *out;
436 /* Call symbol_file_add with stderr redirected. We don't care if there
439 safe_symbol_file_add_stub (void *argv)
441 #define p ((struct safe_symbol_file_add_args *)argv)
442 p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
447 /* Restore gdb's stderr after calling symbol_file_add */
449 safe_symbol_file_add_cleanup (void *p)
451 #define sp ((struct safe_symbol_file_add_args *)p)
452 gdb_flush (gdb_stderr);
453 gdb_flush (gdb_stdout);
454 ui_file_delete (gdb_stderr);
455 ui_file_delete (gdb_stdout);
456 gdb_stderr = sp->err;
457 gdb_stdout = sp->out;
461 /* symbol_file_add wrapper that prevents errors from being displayed. */
462 static struct objfile *
463 safe_symbol_file_add (char *name, int from_tty,
464 struct section_addr_info *addrs,
465 int mainline, int flags)
467 struct safe_symbol_file_add_args p;
468 struct cleanup *cleanup;
470 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
474 gdb_flush (gdb_stderr);
475 gdb_flush (gdb_stdout);
476 gdb_stderr = ui_file_new ();
477 gdb_stdout = ui_file_new ();
479 p.from_tty = from_tty;
481 p.mainline = mainline;
483 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
485 do_cleanups (cleanup);
489 /* Maintain a linked list of "so" information. */
492 struct so_stuff *next, **last;
496 solib_start, *solib_end;
498 /* Remember the maximum DLL length for printing in info dll command. */
499 int max_dll_name_len;
502 register_loaded_dll (const char *name, DWORD load_addr)
505 so = (struct so_stuff *) xmalloc (sizeof (struct so_stuff) + strlen (name) + 8 + 2);
506 so->load_addr = load_addr;
507 strcpy (so->name, name);
509 solib_end->next = so;
514 /* Wait for child to do something. Return pid of child, or -1 in case
515 of error; store status through argument pointer OURSTATUS. */
517 handle_load_dll (PTR dummy ATTRIBUTE_UNUSED)
519 LOAD_DLL_DEBUG_INFO *event = ¤t_event.u.LoadDll;
522 char dll_buf[MAX_PATH + 1];
523 char *dll_name = NULL;
527 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
529 if (!psapi_get_dll_name ((DWORD) (event->lpBaseOfDll), dll_buf))
530 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
534 /* Attempt to read the name of the dll that was detected.
535 This is documented to work only when actively debugging
536 a program. It will not work for attached processes. */
537 if (dll_name == NULL || *dll_name == '\0')
539 DWORD size = event->fUnicode ? sizeof (WCHAR) : sizeof (char);
543 ReadProcessMemory (current_process_handle,
544 (LPCVOID) event->lpImageName,
545 (char *) &dll_name_ptr,
546 sizeof (dll_name_ptr), &done);
548 /* See if we could read the address of a string, and that the
549 address isn't null. */
551 if (done != sizeof (dll_name_ptr) || !dll_name_ptr)
556 ReadProcessMemory (current_process_handle,
557 (LPCVOID) (dll_name_ptr + len * size),
563 while ((b[0] != 0 || b[size - 1] != 0) && done == size);
565 dll_name = alloca (len);
569 WCHAR *unicode_dll_name = (WCHAR *) alloca (len * sizeof (WCHAR));
570 ReadProcessMemory (current_process_handle,
571 (LPCVOID) dll_name_ptr,
573 len * sizeof (WCHAR),
576 WideCharToMultiByte (CP_ACP, 0,
577 unicode_dll_name, len,
578 dll_name, len, 0, 0);
582 ReadProcessMemory (current_process_handle,
583 (LPCVOID) dll_name_ptr,
593 (void) strlwr (dll_name);
595 while ((p = strchr (dll_name, '\\')))
598 register_loaded_dll (dll_name, (DWORD) event->lpBaseOfDll + 0x1000);
599 len = strlen (dll_name);
600 if (len > max_dll_name_len)
601 max_dll_name_len = len;
606 /* Return name of last loaded DLL. */
608 child_solib_loaded_library_pathname (int pid ATTRIBUTE_UNUSED)
610 return !solib_end || !solib_end->name[0] ? NULL : solib_end->name;
613 /* Clear list of loaded DLLs. */
615 child_clear_solibs (void)
617 struct so_stuff *so, *so1 = solib_start.next;
619 while ((so = so1) != NULL)
625 solib_start.next = NULL;
626 solib_end = &solib_start;
627 max_dll_name_len = sizeof ("DLL Name") - 1;
630 /* Add DLL symbol information. */
632 solib_symbols_add (char *name, CORE_ADDR load_addr)
634 struct section_addr_info section_addrs;
636 /* The symbols in a dll are offset by 0x1000, which is the
637 the offset from 0 of the first byte in an image - because
638 of the file header and the section alignment. */
640 if (!name || !name[0])
643 memset (§ion_addrs, 0, sizeof (section_addrs));
644 section_addrs.other[0].name = ".text";
645 section_addrs.other[0].addr = load_addr;
646 safe_symbol_file_add (name, 0, §ion_addrs, 0, OBJF_SHARED);
651 /* Load DLL symbol info. */
653 dll_symbol_command (char *args, int from_tty ATTRIBUTE_UNUSED)
659 error ("dll-symbols requires a file name");
662 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
664 char *newargs = (char *) alloca (n + 4 + 1);
665 strcpy (newargs, args);
666 strcat (newargs, ".dll");
670 safe_symbol_file_add (args, 0, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
673 /* List currently loaded DLLs. */
675 info_dll_command (char *ignore ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
677 struct so_stuff *so = &solib_start;
682 printf ("%*s Load Address\n", -max_dll_name_len, "DLL Name");
683 while ((so = so->next) != NULL)
684 printf_filtered ("%*s %08lx\n", -max_dll_name_len, so->name, so->load_addr);
689 /* Handle DEBUG_STRING output from child process.
690 Cygwin prepends its messages with a "cygwin:". Interpret this as
691 a Cygwin signal. Otherwise just print the string as a warning. */
693 handle_output_debug_string (struct target_waitstatus *ourstatus)
698 if (!target_read_string
699 ((CORE_ADDR) current_event.u.DebugString.lpDebugStringData, &s, 1024, 0)
703 if (strncmp (s, CYGWIN_SIGNAL_STRING, sizeof (CYGWIN_SIGNAL_STRING) - 1) != 0)
705 if (strncmp (s, "cYg", 3) != 0)
711 int sig = strtol (s + sizeof (CYGWIN_SIGNAL_STRING) - 1, &p, 0);
712 gotasig = target_signal_from_host (sig);
713 ourstatus->value.sig = gotasig;
715 ourstatus->kind = TARGET_WAITKIND_STOPPED;
723 handle_exception (struct target_waitstatus *ourstatus)
726 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
728 ourstatus->kind = TARGET_WAITKIND_STOPPED;
730 /* Record the context of the current thread */
731 th = thread_rec (current_event.dwThreadId, -1);
735 case EXCEPTION_ACCESS_VIOLATION:
736 DEBUG_EXCEPT (("gdb: Target exception ACCESS_VIOLATION at 0x%08lx\n",
737 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
738 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
741 case STATUS_FLOAT_UNDERFLOW:
742 case STATUS_FLOAT_DIVIDE_BY_ZERO:
743 case STATUS_FLOAT_OVERFLOW:
744 case STATUS_INTEGER_DIVIDE_BY_ZERO:
745 DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
746 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
747 ourstatus->value.sig = TARGET_SIGNAL_FPE;
750 case STATUS_STACK_OVERFLOW:
751 DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
752 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
753 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
755 case EXCEPTION_BREAKPOINT:
756 DEBUG_EXCEPT (("gdb: Target exception BREAKPOINT at 0x%08lx\n",
757 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
758 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
761 DEBUG_EXCEPT (("gdb: Target exception CONTROL_C at 0x%08lx\n",
762 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
763 ourstatus->value.sig = TARGET_SIGNAL_INT;
764 last_sig = SIGINT; /* FIXME - should check pass state */
766 case EXCEPTION_SINGLE_STEP:
767 DEBUG_EXCEPT (("gdb: Target exception SINGLE_STEP at 0x%08lx\n",
768 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
769 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
771 case EXCEPTION_ILLEGAL_INSTRUCTION:
772 DEBUG_EXCEPT (("gdb: Target exception SINGLE_ILL at 0x%08lx\n",
773 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
774 ourstatus->value.sig = TARGET_SIGNAL_ILL;
778 printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
779 current_event.u.Exception.ExceptionRecord.ExceptionCode,
780 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
781 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
788 /* Resume all artificially suspended threads if we are continuing
791 child_continue (DWORD continue_status, int id)
797 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, DBG_CONTINUE);\n",
798 current_event.dwProcessId, current_event.dwThreadId));
799 res = ContinueDebugEvent (current_event.dwProcessId,
800 current_event.dwThreadId,
804 for (th = &thread_head; (th = th->next) != NULL;)
805 if (((id == -1) || (id == (int) th->id)) && th->suspend_count)
807 for (i = 0; i < th->suspend_count; i++)
808 (void) ResumeThread (th->h);
809 th->suspend_count = 0;
815 /* Get the next event from the child. Return 1 if the event requires
816 handling by WFI (or whatever).
819 get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourstatus)
822 DWORD continue_status, event_code;
823 thread_info *th = NULL;
824 static thread_info dummy_thread_info;
829 if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
833 continue_status = DBG_CONTINUE;
835 event_code = current_event.dwDebugEventCode;
836 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
840 case CREATE_THREAD_DEBUG_EVENT:
841 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
842 (unsigned) current_event.dwProcessId,
843 (unsigned) current_event.dwThreadId,
844 "CREATE_THREAD_DEBUG_EVENT"));
845 /* Record the existence of this thread */
846 th = child_add_thread (current_event.dwThreadId,
847 current_event.u.CreateThread.hThread);
849 printf_unfiltered ("[New %s]\n",
850 target_pid_to_str (current_event.dwThreadId));
851 retval = current_event.dwThreadId;
854 case EXIT_THREAD_DEBUG_EVENT:
855 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
856 (unsigned) current_event.dwProcessId,
857 (unsigned) current_event.dwThreadId,
858 "EXIT_THREAD_DEBUG_EVENT"));
859 child_delete_thread (current_event.dwThreadId);
860 th = &dummy_thread_info;
863 case CREATE_PROCESS_DEBUG_EVENT:
864 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
865 (unsigned) current_event.dwProcessId,
866 (unsigned) current_event.dwThreadId,
867 "CREATE_PROCESS_DEBUG_EVENT"));
868 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
870 main_thread_id = current_event.dwThreadId;
871 /* Add the main thread */
873 th = child_add_thread (current_event.dwProcessId,
874 current_event.u.CreateProcessInfo.hProcess);
876 th = child_add_thread (main_thread_id,
877 current_event.u.CreateProcessInfo.hThread);
878 retval = ourstatus->value.related_pid = current_event.dwThreadId;
881 case EXIT_PROCESS_DEBUG_EVENT:
882 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
883 (unsigned) current_event.dwProcessId,
884 (unsigned) current_event.dwThreadId,
885 "EXIT_PROCESS_DEBUG_EVENT"));
886 ourstatus->kind = TARGET_WAITKIND_EXITED;
887 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
888 CloseHandle (current_process_handle);
889 retval = main_thread_id;
892 case LOAD_DLL_DEBUG_EVENT:
893 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
894 (unsigned) current_event.dwProcessId,
895 (unsigned) current_event.dwThreadId,
896 "LOAD_DLL_DEBUG_EVENT"));
897 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
898 registers_changed (); /* mark all regs invalid */
899 ourstatus->kind = TARGET_WAITKIND_LOADED;
900 ourstatus->value.integer = 0;
901 retval = main_thread_id;
904 case UNLOAD_DLL_DEBUG_EVENT:
905 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
906 (unsigned) current_event.dwProcessId,
907 (unsigned) current_event.dwThreadId,
908 "UNLOAD_DLL_DEBUG_EVENT"));
909 break; /* FIXME: don't know what to do here */
911 case EXCEPTION_DEBUG_EVENT:
912 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
913 (unsigned) current_event.dwProcessId,
914 (unsigned) current_event.dwThreadId,
915 "EXCEPTION_DEBUG_EVENT"));
916 handle_exception (ourstatus);
917 retval = current_event.dwThreadId;
920 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
921 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
922 (unsigned) current_event.dwProcessId,
923 (unsigned) current_event.dwThreadId,
924 "OUTPUT_DEBUG_STRING_EVENT"));
925 if (handle_output_debug_string (ourstatus))
926 retval = main_thread_id;
930 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
931 (DWORD) current_event.dwProcessId,
932 (DWORD) current_event.dwThreadId);
933 printf_unfiltered (" unknown event code %ld\n",
934 current_event.dwDebugEventCode);
939 CHECK (child_continue (continue_status, -1));
942 current_thread = th ? : thread_rec (current_event.dwThreadId, TRUE);
943 inferior_pid = retval;
950 /* Wait for interesting events to occur in the target process. */
952 child_wait (int pid, struct target_waitstatus *ourstatus)
954 /* We loop when we get a non-standard exception rather than return
955 with a SPURIOUS because resume can try and step or modify things,
956 which needs a current_thread->h. But some of these exceptions mark
957 the birth or death of threads, which mean that the current thread
958 isn't necessarily what you think it is. */
962 int retval = get_child_debug_event (pid, ourstatus);
969 if (ui_loop_hook != NULL)
970 detach = ui_loop_hook (0);
973 child_kill_inferior ();
979 do_initial_child_stuff (DWORD pid)
981 extern int stop_after_trap;
986 current_event.dwProcessId = pid;
987 memset (¤t_event, 0, sizeof (current_event));
988 push_target (&child_ops);
989 child_init_thread_list ();
990 child_clear_solibs ();
991 clear_proceed_status ();
992 init_wait_for_inferior ();
994 target_terminal_init ();
995 target_terminal_inferior ();
1000 wait_for_inferior ();
1001 if (stop_signal != TARGET_SIGNAL_TRAP)
1002 resume (0, stop_signal);
1006 stop_after_trap = 0;
1010 /* Attach to process PID, then initialize for debugging it. */
1013 child_attach (char *args, int from_tty)
1016 DWORD pid = strtoul (args, 0, 0);
1019 error_no_arg ("process-id to attach");
1021 ok = DebugActiveProcess (pid);
1024 error ("Can't attach to process.");
1028 char *exec_file = (char *) get_exec_file (0);
1031 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1032 target_pid_to_str (pid));
1034 printf_unfiltered ("Attaching to %s\n",
1035 target_pid_to_str (pid));
1037 gdb_flush (gdb_stdout);
1040 do_initial_child_stuff (pid);
1041 target_terminal_ours ();
1045 child_detach (char *args ATTRIBUTE_UNUSED, int from_tty)
1049 char *exec_file = get_exec_file (0);
1052 printf_unfiltered ("Detaching from program: %s %s\n", exec_file,
1053 target_pid_to_str (inferior_pid));
1054 gdb_flush (gdb_stdout);
1057 unpush_target (&child_ops);
1060 /* Print status information about what we're accessing. */
1063 child_files_info (struct target_ops *ignore ATTRIBUTE_UNUSED)
1065 printf_unfiltered ("\tUsing the running image of %s %s.\n",
1066 attach_flag ? "attached" : "child", target_pid_to_str (inferior_pid));
1071 child_open (char *arg ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
1073 error ("Use the \"run\" command to start a Unix child process.");
1076 /* Start an inferior win32 child process and sets inferior_pid to its pid.
1077 EXEC_FILE is the file to run.
1078 ALLARGS is a string containing the arguments to the program.
1079 ENV is the environment vector to pass. Errors reported with error(). */
1082 child_create_inferior (char *exec_file, char *allargs, char **env)
1084 char real_path[MAXPATHLEN];
1090 PROCESS_INFORMATION pi;
1096 error ("No executable specified, use `target exec'.\n");
1098 memset (&si, 0, sizeof (si));
1099 si.cb = sizeof (si);
1101 cygwin_conv_to_win32_path (exec_file, real_path);
1103 flags = DEBUG_ONLY_THIS_PROCESS;
1106 flags |= CREATE_NEW_PROCESS_GROUP;
1109 flags |= CREATE_NEW_CONSOLE;
1111 args = alloca (strlen (real_path) + strlen (allargs) + 2);
1113 strcpy (args, real_path);
1116 strcat (args, allargs);
1118 /* Prepare the environment vars for CreateProcess. */
1120 /* This code use to assume all env vars were file names and would
1121 translate them all to win32 style. That obviously doesn't work in the
1122 general case. The current rule is that we only translate PATH.
1123 We need to handle PATH because we're about to call CreateProcess and
1124 it uses PATH to find DLL's. Fortunately PATH has a well-defined value
1125 in both posix and win32 environments. cygwin.dll will change it back
1126 to posix style if necessary. */
1128 static const char *conv_path_names[] =
1134 /* CreateProcess takes the environment list as a null terminated set of
1135 strings (i.e. two nulls terminate the list). */
1137 /* Get total size for env strings. */
1138 for (envlen = 0, i = 0; env[i] && *env[i]; i++)
1142 for (j = 0; conv_path_names[j]; j++)
1144 len = strlen (conv_path_names[j]);
1145 if (strncmp (conv_path_names[j], env[i], len) == 0)
1147 if (cygwin_posix_path_list_p (env[i] + len))
1149 + cygwin_posix_to_win32_path_list_buf_size (env[i] + len);
1151 envlen += strlen (env[i]) + 1;
1155 if (conv_path_names[j] == NULL)
1156 envlen += strlen (env[i]) + 1;
1159 winenv = alloca (envlen + 1);
1161 /* Copy env strings into new buffer. */
1162 for (temp = winenv, i = 0; env[i] && *env[i]; i++)
1166 for (j = 0; conv_path_names[j]; j++)
1168 len = strlen (conv_path_names[j]);
1169 if (strncmp (conv_path_names[j], env[i], len) == 0)
1171 if (cygwin_posix_path_list_p (env[i] + len))
1173 memcpy (temp, env[i], len);
1174 cygwin_posix_to_win32_path_list (env[i] + len, temp + len);
1177 strcpy (temp, env[i]);
1181 if (conv_path_names[j] == NULL)
1182 strcpy (temp, env[i]);
1184 temp += strlen (temp) + 1;
1187 /* Final nil string to terminate new env. */
1191 ret = CreateProcess (0,
1192 args, /* command line */
1193 NULL, /* Security */
1195 TRUE, /* inherit handles */
1196 flags, /* start flags */
1198 NULL, /* current directory */
1202 error ("Error creating process %s, (error %d)\n", exec_file, GetLastError ());
1204 do_initial_child_stuff (pi.dwProcessId);
1206 /* child_continue (DBG_CONTINUE, -1); */
1207 proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0);
1211 child_mourn_inferior (void)
1213 (void) child_continue (DBG_CONTINUE, -1);
1214 unpush_target (&child_ops);
1215 generic_mourn_inferior ();
1218 /* Send a SIGINT to the process group. This acts just like the user typed a
1219 ^C on the controlling terminal. */
1224 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1225 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1226 registers_changed (); /* refresh register state */
1230 child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
1231 int write, struct target_ops *target ATTRIBUTE_UNUSED)
1236 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
1237 len, (DWORD) memaddr));
1238 WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
1240 FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
1244 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
1245 len, (DWORD) memaddr));
1246 ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our, len,
1253 child_kill_inferior (void)
1255 CHECK (TerminateProcess (current_process_handle, 0));
1259 if (!child_continue (DBG_CONTINUE, -1))
1261 if (!WaitForDebugEvent (¤t_event, INFINITE))
1263 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
1267 CHECK (CloseHandle (current_process_handle));
1269 /* this may fail in an attached process so don't check. */
1270 (void) CloseHandle (current_thread->h);
1271 target_mourn_inferior (); /* or just child_mourn_inferior? */
1275 child_resume (int pid, int step, enum target_signal sig)
1278 DWORD continue_status = last_sig > 0 && last_sig < NSIG ?
1279 DBG_EXCEPTION_NOT_HANDLED : DBG_CONTINUE;
1283 DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
1286 /* Get context for currently selected thread */
1287 th = thread_rec (current_event.dwThreadId, FALSE);
1292 /* Single step by setting t bit */
1293 child_fetch_inferior_registers (PS_REGNUM);
1294 th->context.EFlags |= FLAG_TRACE_BIT;
1297 if (th->context.ContextFlags)
1299 CHECK (SetThreadContext (th->h, &th->context));
1300 th->context.ContextFlags = 0;
1304 /* Allow continuing with the same signal that interrupted us.
1305 Otherwise complain. */
1307 child_continue (continue_status, pid);
1311 child_prepare_to_store (void)
1313 /* Do nothing, since we can store individual regs */
1317 child_can_run (void)
1323 child_close (int x ATTRIBUTE_UNUSED)
1325 DEBUG_EVENTS (("gdb: child_close, inferior_pid=%d\n", inferior_pid));
1328 struct target_ops child_ops;
1331 init_child_ops (void)
1333 child_ops.to_shortname = "child";
1334 child_ops.to_longname = "Win32 child process";
1335 child_ops.to_doc = "Win32 child process (started by the \"run\" command).";
1336 child_ops.to_open = child_open;
1337 child_ops.to_close = child_close;
1338 child_ops.to_attach = child_attach;
1339 child_ops.to_detach = child_detach;
1340 child_ops.to_resume = child_resume;
1341 child_ops.to_wait = child_wait;
1342 child_ops.to_fetch_registers = child_fetch_inferior_registers;
1343 child_ops.to_store_registers = child_store_inferior_registers;
1344 child_ops.to_prepare_to_store = child_prepare_to_store;
1345 child_ops.to_xfer_memory = child_xfer_memory;
1346 child_ops.to_files_info = child_files_info;
1347 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
1348 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
1349 child_ops.to_terminal_init = terminal_init_inferior;
1350 child_ops.to_terminal_inferior = terminal_inferior;
1351 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
1352 child_ops.to_terminal_ours = terminal_ours;
1353 child_ops.to_terminal_info = child_terminal_info;
1354 child_ops.to_kill = child_kill_inferior;
1355 child_ops.to_load = 0;
1356 child_ops.to_lookup_symbol = 0;
1357 child_ops.to_create_inferior = child_create_inferior;
1358 child_ops.to_mourn_inferior = child_mourn_inferior;
1359 child_ops.to_can_run = child_can_run;
1360 child_ops.to_notice_signals = 0;
1361 child_ops.to_thread_alive = win32_child_thread_alive;
1362 child_ops.to_pid_to_str = cygwin_pid_to_str;
1363 child_ops.to_stop = child_stop;
1364 child_ops.to_stratum = process_stratum;
1365 child_ops.DONT_USE = 0;
1366 child_ops.to_has_all_memory = 1;
1367 child_ops.to_has_memory = 1;
1368 child_ops.to_has_stack = 1;
1369 child_ops.to_has_registers = 1;
1370 child_ops.to_has_execution = 1;
1371 child_ops.to_sections = 0;
1372 child_ops.to_sections_end = 0;
1373 child_ops.to_magic = OPS_MAGIC;
1377 _initialize_inftarg (void)
1381 add_com ("dll-symbols", class_files, dll_symbol_command,
1382 "Load dll library symbols from FILE.");
1385 add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
1387 add_show_from_set (add_set_cmd ("new-console", class_support, var_boolean,
1388 (char *) &new_console,
1389 "Set creation of new console when creating child process.",
1393 add_show_from_set (add_set_cmd ("new-group", class_support, var_boolean,
1394 (char *) &new_group,
1395 "Set creation of new group when creating child process.",
1399 add_show_from_set (add_set_cmd ("debugexec", class_support, var_boolean,
1400 (char *) &debug_exec,
1401 "Set whether to display execution in child process.",
1405 add_show_from_set (add_set_cmd ("debugevents", class_support, var_boolean,
1406 (char *) &debug_events,
1407 "Set whether to display kernel events in child process.",
1411 add_show_from_set (add_set_cmd ("debugmemory", class_support, var_boolean,
1412 (char *) &debug_memory,
1413 "Set whether to display memory accesses in child process.",
1417 add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean,
1418 (char *) &debug_exceptions,
1419 "Set whether to display kernel exceptions in child process.",
1423 add_info ("dll", info_dll_command, "Status of loaded DLLs.");
1424 add_info_alias ("sharedlibrary", "dll", 1);
1426 add_target (&child_ops);
1429 /* Determine if the thread referenced by "pid" is alive
1430 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
1431 it means that the pid has died. Otherwise it is assumed to be alive. */
1433 win32_child_thread_alive (int pid)
1435 return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
1439 /* Convert pid to printable format. */
1441 cygwin_pid_to_str (int pid)
1443 static char buf[80];
1444 if ((DWORD) pid == current_event.dwProcessId)
1445 sprintf (buf, "process %d", pid);
1447 sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
1452 core_dll_symbols_add (char *dll_name, DWORD base_addr)
1454 struct objfile *objfile;
1455 char *objfile_basename;
1456 const char *dll_basename;
1458 if (!(dll_basename = strrchr (dll_name, '/')))
1459 dll_basename = dll_name;
1463 ALL_OBJFILES (objfile)
1465 objfile_basename = strrchr (objfile->name, '/');
1467 if (objfile_basename &&
1468 strcmp (dll_basename, objfile_basename + 1) == 0)
1470 printf_unfiltered ("%08lx:%s (symbols previously loaded)\n",
1471 base_addr, dll_name);
1476 register_loaded_dll (dll_name, base_addr + 0x1000);
1477 solib_symbols_add (dll_name, (CORE_ADDR) base_addr + 0x1000);
1485 struct target_ops *target;
1488 map_code_section_args;
1491 map_single_dll_code_section (bfd * abfd, asection * sect, PTR obj)
1495 struct section_table *new_target_sect_ptr;
1497 map_code_section_args *args = (map_code_section_args *) obj;
1498 struct target_ops *target = args->target;
1499 if (sect->flags & SEC_CODE)
1501 update_coreops = core_ops.to_sections == target->to_sections;
1503 if (target->to_sections)
1505 old = target->to_sections_end - target->to_sections;
1506 target->to_sections = (struct section_table *)
1507 xrealloc ((char *) target->to_sections,
1508 (sizeof (struct section_table)) * (1 + old));
1513 target->to_sections = (struct section_table *)
1514 xmalloc ((sizeof (struct section_table)));
1516 target->to_sections_end = target->to_sections + (1 + old);
1518 /* Update the to_sections field in the core_ops structure
1522 core_ops.to_sections = target->to_sections;
1523 core_ops.to_sections_end = target->to_sections_end;
1525 new_target_sect_ptr = target->to_sections + old;
1526 new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
1527 new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
1528 bfd_section_size (abfd, sect);;
1529 new_target_sect_ptr->the_bfd_section = sect;
1530 new_target_sect_ptr->bfd = abfd;
1535 dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
1538 map_code_section_args map_args;
1539 asection *lowest_sect;
1541 if (dll_name == NULL || target == NULL)
1543 name = xstrdup (dll_name);
1544 dll_bfd = bfd_openr (name, "pei-i386");
1545 if (dll_bfd == NULL)
1548 if (bfd_check_format (dll_bfd, bfd_object))
1550 lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
1551 if (lowest_sect == NULL)
1553 map_args.target = target;
1554 map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
1556 bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (PTR) (&map_args));
1563 core_section_load_dll_symbols (bfd * abfd, asection * sect, PTR obj)
1565 struct target_ops *target = (struct target_ops *) obj;
1570 char *dll_name = NULL;
1572 struct win32_pstatus *pstatus;
1575 if (strncmp (sect->name, ".module", 7))
1578 buf = (char *) xmalloc (sect->_raw_size + 1);
1581 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
1584 if (!bfd_get_section_contents (abfd, sect, buf, 0, sect->_raw_size))
1587 pstatus = (struct win32_pstatus *) buf;
1589 memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
1590 dll_name_size = pstatus->data.module_info.module_name_size;
1591 if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > sect->_raw_size)
1594 dll_name = (char *) xmalloc (dll_name_size + 1);
1597 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
1600 strncpy (dll_name, pstatus->data.module_info.module_name, dll_name_size);
1602 while ((p = strchr (dll_name, '\\')))
1605 if (!core_dll_symbols_add (dll_name, (DWORD) base_addr))
1606 printf_unfiltered ("%s: Failed to load dll symbols.\n", dll_name);
1608 if (!dll_code_sections_add (dll_name, (DWORD) base_addr + 0x1000, target))
1609 printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
1620 child_solib_add (char *filename ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED, struct target_ops *target)
1624 child_clear_solibs ();
1625 bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols, target);
1629 if (solib_end && solib_end->name)
1630 solib_symbols_add (solib_end->name, solib_end->load_addr);
1635 fetch_elf_core_registers (char *core_reg_sect,
1636 unsigned core_reg_size,
1641 if (core_reg_size < sizeof (CONTEXT))
1643 error ("Core file register section too small (%u bytes).", core_reg_size);
1646 for (r = 0; r < NUM_REGS; r++)
1647 supply_register (r, core_reg_sect + mappings[r]);
1650 static struct core_fns win32_elf_core_fns =
1652 bfd_target_elf_flavour,
1653 default_check_format,
1654 default_core_sniffer,
1655 fetch_elf_core_registers,
1660 _initialize_core_win32 ()
1662 add_core_fns (&win32_elf_core_fns);