1 /* Target-vector operations for controlling win32 child processes, for GDB.
2 Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001
3 Free Software Foundation, Inc.
4 Contributed by Cygnus Solutions, A Red Hat Company.
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 2 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 eve nthe 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, write to the Free Software
20 Foundation, Inc., 59 Temple Place - Suite 330,
21 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 */
33 #include "completer.h"
36 #include <sys/types.h>
41 #include <sys/cygwin.h>
46 #include "gdb_string.h"
47 #include "gdbthread.h"
49 #include <sys/param.h>
52 /* The ui's event loop. */
53 extern int (*ui_loop_hook) (int signo);
55 /* If we're not using the old Cygwin header file set, define the
56 following which never should have been in the generic Win32 API
57 headers in the first place since they were our own invention... */
58 #ifndef _GNU_H_WINDOWS_H
61 FLAG_TRACE_BIT = 0x100,
62 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
65 #include <sys/procfs.h>
68 /* The string sent by cygwin when it processes a signal.
69 FIXME: This should be in a cygwin include file. */
70 #define CYGWIN_SIGNAL_STRING "cygwin: signal"
72 #define CHECK(x) check (x, __FILE__,__LINE__)
73 #define DEBUG_EXEC(x) if (debug_exec) printf x
74 #define DEBUG_EVENTS(x) if (debug_events) printf x
75 #define DEBUG_MEM(x) if (debug_memory) printf x
76 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf x
78 /* Forward declaration */
79 extern struct target_ops child_ops;
81 static void child_stop (void);
82 static int win32_child_thread_alive (ptid_t);
83 void child_kill_inferior (void);
85 static int last_sig = 0; /* Set if a signal was received from the
87 /* Thread information structure used to track information that is
88 not available in gdb's thread structure. */
89 typedef struct thread_info_struct
91 struct thread_info_struct *next;
101 static thread_info thread_head;
103 /* The process and thread handles for the above context. */
105 static DEBUG_EVENT current_event; /* The current debug event from
107 static HANDLE current_process_handle; /* Currently executing process */
108 static thread_info *current_thread; /* Info on currently selected thread */
109 static DWORD main_thread_id; /* Thread ID of the main thread */
111 /* Counts of things. */
112 static int exception_count = 0;
113 static int event_count = 0;
116 static int new_console = 0;
117 static int new_group = 1;
118 static int debug_exec = 0; /* show execution */
119 static int debug_events = 0; /* show events from kernel */
120 static int debug_memory = 0; /* show target memory accesses */
121 static int debug_exceptions = 0; /* show target exceptions */
123 /* This vector maps GDB's idea of a register's number into an address
124 in the win32 exception context vector.
126 It also contains the bit mask needed to load the register in question.
128 One day we could read a reg, we could inspect the context we
129 already have loaded, if it doesn't have the bit set that we need,
130 we read that set of registers in using GetThreadContext. If the
131 context already contains what we need, we just unpack it. Then to
132 write a register, first we have to ensure that the context contains
133 the other regs of the group, and then we copy the info in and set
136 #define context_offset(x) ((int)&(((CONTEXT *)NULL)->x))
137 static const int mappings[] =
139 context_offset (Eax),
140 context_offset (Ecx),
141 context_offset (Edx),
142 context_offset (Ebx),
143 context_offset (Esp),
144 context_offset (Ebp),
145 context_offset (Esi),
146 context_offset (Edi),
147 context_offset (Eip),
148 context_offset (EFlags),
149 context_offset (SegCs),
150 context_offset (SegSs),
151 context_offset (SegDs),
152 context_offset (SegEs),
153 context_offset (SegFs),
154 context_offset (SegGs),
155 context_offset (FloatSave.RegisterArea[0 * 10]),
156 context_offset (FloatSave.RegisterArea[1 * 10]),
157 context_offset (FloatSave.RegisterArea[2 * 10]),
158 context_offset (FloatSave.RegisterArea[3 * 10]),
159 context_offset (FloatSave.RegisterArea[4 * 10]),
160 context_offset (FloatSave.RegisterArea[5 * 10]),
161 context_offset (FloatSave.RegisterArea[6 * 10]),
162 context_offset (FloatSave.RegisterArea[7 * 10]),
163 context_offset (FloatSave.ControlWord),
164 context_offset (FloatSave.StatusWord),
165 context_offset (FloatSave.TagWord),
166 context_offset (FloatSave.ErrorSelector),
167 context_offset (FloatSave.ErrorOffset),
168 context_offset (FloatSave.DataSelector),
169 context_offset (FloatSave.DataOffset),
170 context_offset (FloatSave.ErrorSelector)
173 #undef context_offset
175 /* This vector maps the target's idea of an exception (extracted
176 from the DEBUG_EVENT structure) to GDB's idea. */
178 struct xlate_exception
181 enum target_signal us;
184 static const struct xlate_exception
187 {EXCEPTION_ACCESS_VIOLATION, TARGET_SIGNAL_SEGV},
188 {STATUS_STACK_OVERFLOW, TARGET_SIGNAL_SEGV},
189 {EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
190 {DBG_CONTROL_C, TARGET_SIGNAL_INT},
191 {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
194 /* Find a thread record given a thread id.
195 If get_context then also retrieve the context for this
198 thread_rec (DWORD id, int get_context)
202 for (th = &thread_head; (th = th->next) != NULL;)
205 if (!th->suspend_count && get_context)
207 if (get_context > 0 && id != current_event.dwThreadId)
208 th->suspend_count = SuspendThread (th->h) + 1;
209 else if (get_context < 0)
210 th->suspend_count = -1;
212 th->context.ContextFlags = CONTEXT_DEBUGGER;
213 GetThreadContext (th->h, &th->context);
221 /* Add a thread to the thread list */
223 child_add_thread (DWORD id, HANDLE h)
227 if ((th = thread_rec (id, FALSE)))
230 th = (thread_info *) xmalloc (sizeof (*th));
231 memset (th, 0, sizeof (*th));
234 th->next = thread_head.next;
235 thread_head.next = th;
236 add_thread (pid_to_ptid (id));
240 /* Clear out any old thread list and reintialize it to a
243 child_init_thread_list (void)
245 thread_info *th = &thread_head;
247 DEBUG_EVENTS (("gdb: child_init_thread_list\n"));
249 while (th->next != NULL)
251 thread_info *here = th->next;
252 th->next = here->next;
253 (void) CloseHandle (here->h);
258 /* Delete a thread from the list of threads */
260 child_delete_thread (DWORD id)
265 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (pid_to_ptid (id)));
266 delete_thread (pid_to_ptid (id));
268 for (th = &thread_head;
269 th->next != NULL && th->next->id != id;
273 if (th->next != NULL)
275 thread_info *here = th->next;
276 th->next = here->next;
277 CloseHandle (here->h);
283 check (BOOL ok, const char *file, int line)
286 printf_filtered ("error return %s:%d was %lu\n", file, line, GetLastError ());
290 do_child_fetch_inferior_registers (int r)
292 char *context_offset = ((char *) ¤t_thread->context) + mappings[r];
296 l = *((long *) context_offset) & 0xffff;
297 supply_register (r, (char *) &l);
299 else if (r == FOP_REGNUM)
301 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
302 supply_register (r, (char *) &l);
305 supply_register (r, context_offset);
308 for (r = 0; r < NUM_REGS; r++)
309 do_child_fetch_inferior_registers (r);
314 child_fetch_inferior_registers (int r)
316 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
317 do_child_fetch_inferior_registers (r);
321 do_child_store_inferior_registers (int r)
324 read_register_gen (r, ((char *) ¤t_thread->context) + mappings[r]);
327 for (r = 0; r < NUM_REGS; r++)
328 do_child_store_inferior_registers (r);
332 /* Store a new register value into the current thread context */
334 child_store_inferior_registers (int r)
336 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
337 do_child_store_inferior_registers (r);
340 static int psapi_loaded = 0;
341 static HMODULE psapi_module_handle = NULL;
342 static BOOL WINAPI (*psapi_EnumProcessModules) (HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
343 static BOOL WINAPI (*psapi_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, DWORD) = NULL;
344 static DWORD WINAPI (*psapi_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, DWORD) = NULL;
347 psapi_get_dll_name (DWORD BaseAddress, char *dll_name_ret)
353 HMODULE *DllHandle = dh_buf;
358 psapi_EnumProcessModules == NULL ||
359 psapi_GetModuleInformation == NULL ||
360 psapi_GetModuleFileNameExA == NULL)
365 psapi_module_handle = LoadLibrary ("psapi.dll");
366 if (!psapi_module_handle)
368 /* printf_unfiltered ("error loading psapi.dll: %u", GetLastError ()); */
371 psapi_EnumProcessModules = GetProcAddress (psapi_module_handle, "EnumProcessModules");
372 psapi_GetModuleInformation = GetProcAddress (psapi_module_handle, "GetModuleInformation");
373 psapi_GetModuleFileNameExA = (void *) GetProcAddress (psapi_module_handle,
374 "GetModuleFileNameExA");
375 if (psapi_EnumProcessModules == NULL ||
376 psapi_GetModuleInformation == NULL ||
377 psapi_GetModuleFileNameExA == NULL)
382 ok = (*psapi_EnumProcessModules) (current_process_handle,
387 if (!ok || !cbNeeded)
390 DllHandle = (HMODULE *) alloca (cbNeeded);
394 ok = (*psapi_EnumProcessModules) (current_process_handle,
401 for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
403 if (!(*psapi_GetModuleInformation) (current_process_handle,
407 error ("Can't get module info");
409 len = (*psapi_GetModuleFileNameExA) (current_process_handle,
414 error ("Error getting dll name: %u\n", GetLastError ());
416 if ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
421 dll_name_ret[0] = '\0';
425 /* Encapsulate the information required in a call to
426 symbol_file_add_args */
427 struct safe_symbol_file_add_args
431 struct section_addr_info *addrs;
434 struct ui_file *err, *out;
438 /* Maintain a linked list of "so" information. */
441 struct so_stuff *next, **last;
445 solib_start, *solib_end;
447 /* Call symbol_file_add with stderr redirected. We don't care if there
450 safe_symbol_file_add_stub (void *argv)
452 #define p ((struct safe_symbol_file_add_args *)argv)
453 struct so_stuff *so = solib_start.next;
455 while ((so = so->next))
456 if (strcasecmp (so->name, p->name) == 0)
458 p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
463 /* Restore gdb's stderr after calling symbol_file_add */
465 safe_symbol_file_add_cleanup (void *p)
467 #define sp ((struct safe_symbol_file_add_args *)p)
468 gdb_flush (gdb_stderr);
469 gdb_flush (gdb_stdout);
470 /* ui_file_delete (gdb_stderr); */
471 ui_file_delete (gdb_stdout);
472 /* gdb_stderr = sp->err; */
473 gdb_stdout = sp->out;
477 /* symbol_file_add wrapper that prevents errors from being displayed. */
478 static struct objfile *
479 safe_symbol_file_add (char *name, int from_tty,
480 struct section_addr_info *addrs,
481 int mainline, int flags)
483 struct safe_symbol_file_add_args p;
484 struct cleanup *cleanup;
486 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
490 gdb_flush (gdb_stderr);
491 gdb_flush (gdb_stdout);
492 /* gdb_stderr = ui_file_new (); */
493 gdb_stdout = ui_file_new ();
495 p.from_tty = from_tty;
497 p.mainline = mainline;
499 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
501 do_cleanups (cleanup);
505 /* Remember the maximum DLL length for printing in info dll command. */
506 int max_dll_name_len;
509 register_loaded_dll (const char *name, DWORD load_addr)
512 so = (struct so_stuff *) xmalloc (sizeof (struct so_stuff) + strlen (name) + 8 + 2);
513 so->load_addr = load_addr;
514 strcpy (so->name, name);
516 solib_end->next = so;
521 /* Wait for child to do something. Return pid of child, or -1 in case
522 of error; store status through argument pointer OURSTATUS. */
524 handle_load_dll (void *dummy ATTRIBUTE_UNUSED)
526 LOAD_DLL_DEBUG_INFO *event = ¤t_event.u.LoadDll;
529 char dll_buf[MAX_PATH + 1];
530 char *dll_name = NULL;
534 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
536 if (!psapi_get_dll_name ((DWORD) (event->lpBaseOfDll), dll_buf))
537 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
541 /* Attempt to read the name of the dll that was detected.
542 This is documented to work only when actively debugging
543 a program. It will not work for attached processes. */
544 if (dll_name == NULL || *dll_name == '\0')
546 DWORD size = event->fUnicode ? sizeof (WCHAR) : sizeof (char);
550 ReadProcessMemory (current_process_handle,
551 (LPCVOID) event->lpImageName,
552 (char *) &dll_name_ptr,
553 sizeof (dll_name_ptr), &done);
555 /* See if we could read the address of a string, and that the
556 address isn't null. */
558 if (done != sizeof (dll_name_ptr) || !dll_name_ptr)
563 ReadProcessMemory (current_process_handle,
564 (LPCVOID) (dll_name_ptr + len * size),
570 while ((b[0] != 0 || b[size - 1] != 0) && done == size);
572 dll_name = alloca (len);
576 WCHAR *unicode_dll_name = (WCHAR *) alloca (len * sizeof (WCHAR));
577 ReadProcessMemory (current_process_handle,
578 (LPCVOID) dll_name_ptr,
580 len * sizeof (WCHAR),
583 WideCharToMultiByte (CP_ACP, 0,
584 unicode_dll_name, len,
585 dll_name, len, 0, 0);
589 ReadProcessMemory (current_process_handle,
590 (LPCVOID) dll_name_ptr,
600 (void) strlwr (dll_name);
602 while ((p = strchr (dll_name, '\\')))
605 register_loaded_dll (dll_name, (DWORD) event->lpBaseOfDll + 0x1000);
606 len = strlen (dll_name);
607 if (len > max_dll_name_len)
608 max_dll_name_len = len;
613 /* Return name of last loaded DLL. */
615 child_solib_loaded_library_pathname (int pid ATTRIBUTE_UNUSED)
617 return !solib_end || !solib_end->name[0] ? NULL : solib_end->name;
620 /* Clear list of loaded DLLs. */
622 child_clear_solibs (void)
624 struct so_stuff *so, *so1 = solib_start.next;
626 while ((so = so1) != NULL)
632 solib_start.next = NULL;
633 solib_end = &solib_start;
634 max_dll_name_len = sizeof ("DLL Name") - 1;
637 /* Add DLL symbol information. */
639 solib_symbols_add (char *name, int from_tty, CORE_ADDR load_addr)
641 struct section_addr_info section_addrs;
643 /* The symbols in a dll are offset by 0x1000, which is the
644 the offset from 0 of the first byte in an image - because
645 of the file header and the section alignment. */
647 if (!name || !name[0])
650 memset (§ion_addrs, 0, sizeof (section_addrs));
651 section_addrs.other[0].name = ".text";
652 section_addrs.other[0].addr = load_addr;
653 safe_symbol_file_add (name, from_tty, 0, 0, OBJF_SHARED);
658 /* Load DLL symbol info. */
660 dll_symbol_command (char *args, int from_tty ATTRIBUTE_UNUSED)
666 error ("dll-symbols requires a file name");
669 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
671 char *newargs = (char *) alloca (n + 4 + 1);
672 strcpy (newargs, args);
673 strcat (newargs, ".dll");
677 safe_symbol_file_add (args, 0, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
680 /* List currently loaded DLLs. */
682 info_dll_command (char *ignore ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
684 struct so_stuff *so = &solib_start;
689 printf ("%*s Load Address\n", -max_dll_name_len, "DLL Name");
690 while ((so = so->next) != NULL)
691 printf_filtered ("%*s %08lx\n", -max_dll_name_len, so->name, so->load_addr);
696 /* Handle DEBUG_STRING output from child process.
697 Cygwin prepends its messages with a "cygwin:". Interpret this as
698 a Cygwin signal. Otherwise just print the string as a warning. */
700 handle_output_debug_string (struct target_waitstatus *ourstatus)
705 if (!target_read_string
706 ((CORE_ADDR) current_event.u.DebugString.lpDebugStringData, &s, 1024, 0)
710 if (strncmp (s, CYGWIN_SIGNAL_STRING, sizeof (CYGWIN_SIGNAL_STRING) - 1) != 0)
712 if (strncmp (s, "cYg", 3) != 0)
718 int sig = strtol (s + sizeof (CYGWIN_SIGNAL_STRING) - 1, &p, 0);
719 gotasig = target_signal_from_host (sig);
720 ourstatus->value.sig = gotasig;
722 ourstatus->kind = TARGET_WAITKIND_STOPPED;
730 handle_exception (struct target_waitstatus *ourstatus)
733 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
735 ourstatus->kind = TARGET_WAITKIND_STOPPED;
737 /* Record the context of the current thread */
738 th = thread_rec (current_event.dwThreadId, -1);
742 case EXCEPTION_ACCESS_VIOLATION:
743 DEBUG_EXCEPT (("gdb: Target exception ACCESS_VIOLATION at 0x%08lx\n",
744 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
745 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
748 case STATUS_FLOAT_UNDERFLOW:
749 case STATUS_FLOAT_DIVIDE_BY_ZERO:
750 case STATUS_FLOAT_OVERFLOW:
751 case STATUS_INTEGER_DIVIDE_BY_ZERO:
752 DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
753 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
754 ourstatus->value.sig = TARGET_SIGNAL_FPE;
757 case STATUS_STACK_OVERFLOW:
758 DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
759 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
760 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
762 case EXCEPTION_BREAKPOINT:
763 DEBUG_EXCEPT (("gdb: Target exception BREAKPOINT at 0x%08lx\n",
764 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
765 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
768 DEBUG_EXCEPT (("gdb: Target exception CONTROL_C at 0x%08lx\n",
769 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
770 ourstatus->value.sig = TARGET_SIGNAL_INT;
771 last_sig = SIGINT; /* FIXME - should check pass state */
773 case EXCEPTION_SINGLE_STEP:
774 DEBUG_EXCEPT (("gdb: Target exception SINGLE_STEP at 0x%08lx\n",
775 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
776 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
778 case EXCEPTION_ILLEGAL_INSTRUCTION:
779 DEBUG_EXCEPT (("gdb: Target exception SINGLE_ILL at 0x%08lx\n",
780 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
781 ourstatus->value.sig = TARGET_SIGNAL_ILL;
785 if (current_event.u.Exception.dwFirstChance)
787 printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
788 current_event.u.Exception.ExceptionRecord.ExceptionCode,
789 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
790 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
797 /* Resume all artificially suspended threads if we are continuing
800 child_continue (DWORD continue_status, int id)
806 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, DBG_CONTINUE);\n",
807 current_event.dwProcessId, current_event.dwThreadId));
808 res = ContinueDebugEvent (current_event.dwProcessId,
809 current_event.dwThreadId,
813 for (th = &thread_head; (th = th->next) != NULL;)
814 if (((id == -1) || (id == (int) th->id)) && th->suspend_count)
816 for (i = 0; i < th->suspend_count; i++)
817 (void) ResumeThread (th->h);
818 th->suspend_count = 0;
824 /* Get the next event from the child. Return 1 if the event requires
825 handling by WFI (or whatever).
828 get_child_debug_event (int pid ATTRIBUTE_UNUSED, struct target_waitstatus *ourstatus)
831 DWORD continue_status, event_code;
832 thread_info *th = NULL;
833 static thread_info dummy_thread_info;
838 if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
842 continue_status = DBG_CONTINUE;
844 event_code = current_event.dwDebugEventCode;
845 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
849 case CREATE_THREAD_DEBUG_EVENT:
850 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
851 (unsigned) current_event.dwProcessId,
852 (unsigned) current_event.dwThreadId,
853 "CREATE_THREAD_DEBUG_EVENT"));
854 /* Record the existence of this thread */
855 th = child_add_thread (current_event.dwThreadId,
856 current_event.u.CreateThread.hThread);
858 printf_unfiltered ("[New %s]\n",
860 pid_to_ptid (current_event.dwThreadId)));
861 retval = current_event.dwThreadId;
864 case EXIT_THREAD_DEBUG_EVENT:
865 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
866 (unsigned) current_event.dwProcessId,
867 (unsigned) current_event.dwThreadId,
868 "EXIT_THREAD_DEBUG_EVENT"));
869 child_delete_thread (current_event.dwThreadId);
870 th = &dummy_thread_info;
873 case CREATE_PROCESS_DEBUG_EVENT:
874 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
875 (unsigned) current_event.dwProcessId,
876 (unsigned) current_event.dwThreadId,
877 "CREATE_PROCESS_DEBUG_EVENT"));
878 CloseHandle (current_event.u.CreateProcessInfo.hFile);
879 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
881 main_thread_id = current_event.dwThreadId;
882 /* Add the main thread */
884 th = child_add_thread (current_event.dwProcessId,
885 current_event.u.CreateProcessInfo.hProcess);
887 th = child_add_thread (main_thread_id,
888 current_event.u.CreateProcessInfo.hThread);
889 retval = ourstatus->value.related_pid = current_event.dwThreadId;
892 case EXIT_PROCESS_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 "EXIT_PROCESS_DEBUG_EVENT"));
897 ourstatus->kind = TARGET_WAITKIND_EXITED;
898 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
899 CloseHandle (current_process_handle);
900 retval = main_thread_id;
903 case LOAD_DLL_DEBUG_EVENT:
904 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
905 (unsigned) current_event.dwProcessId,
906 (unsigned) current_event.dwThreadId,
907 "LOAD_DLL_DEBUG_EVENT"));
908 CloseHandle (current_event.u.LoadDll.hFile);
909 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
910 registers_changed (); /* mark all regs invalid */
911 ourstatus->kind = TARGET_WAITKIND_LOADED;
912 ourstatus->value.integer = 0;
913 retval = main_thread_id;
916 case UNLOAD_DLL_DEBUG_EVENT:
917 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
918 (unsigned) current_event.dwProcessId,
919 (unsigned) current_event.dwThreadId,
920 "UNLOAD_DLL_DEBUG_EVENT"));
921 break; /* FIXME: don't know what to do here */
923 case EXCEPTION_DEBUG_EVENT:
924 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
925 (unsigned) current_event.dwProcessId,
926 (unsigned) current_event.dwThreadId,
927 "EXCEPTION_DEBUG_EVENT"));
928 if (handle_exception (ourstatus))
929 retval = current_event.dwThreadId;
932 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
933 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
934 (unsigned) current_event.dwProcessId,
935 (unsigned) current_event.dwThreadId,
936 "OUTPUT_DEBUG_STRING_EVENT"));
937 if (handle_output_debug_string (ourstatus))
938 retval = main_thread_id;
942 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
943 (DWORD) current_event.dwProcessId,
944 (DWORD) current_event.dwThreadId);
945 printf_unfiltered (" unknown event code %ld\n",
946 current_event.dwDebugEventCode);
951 CHECK (child_continue (continue_status, -1));
954 current_thread = th ? : thread_rec (current_event.dwThreadId, TRUE);
955 inferior_ptid = pid_to_ptid (retval);
962 /* Wait for interesting events to occur in the target process. */
964 child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
966 int pid = PIDGET (ptid);
968 /* We loop when we get a non-standard exception rather than return
969 with a SPURIOUS because resume can try and step or modify things,
970 which needs a current_thread->h. But some of these exceptions mark
971 the birth or death of threads, which mean that the current thread
972 isn't necessarily what you think it is. */
976 int retval = get_child_debug_event (pid, ourstatus);
978 return pid_to_ptid (retval);
983 if (ui_loop_hook != NULL)
984 detach = ui_loop_hook (0);
987 child_kill_inferior ();
993 do_initial_child_stuff (DWORD pid)
995 extern int stop_after_trap;
1000 current_event.dwProcessId = pid;
1001 memset (¤t_event, 0, sizeof (current_event));
1002 push_target (&child_ops);
1003 child_init_thread_list ();
1004 child_clear_solibs ();
1005 clear_proceed_status ();
1006 init_wait_for_inferior ();
1008 target_terminal_init ();
1009 target_terminal_inferior ();
1013 stop_after_trap = 1;
1014 wait_for_inferior ();
1015 if (stop_signal != TARGET_SIGNAL_TRAP)
1016 resume (0, stop_signal);
1020 stop_after_trap = 0;
1024 /* Attach to process PID, then initialize for debugging it. */
1027 child_attach (char *args, int from_tty)
1033 error_no_arg ("process-id to attach");
1035 pid = strtoul (args, 0, 0);
1036 ok = DebugActiveProcess (pid);
1039 error ("Can't attach to process.");
1043 char *exec_file = (char *) get_exec_file (0);
1046 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1047 target_pid_to_str (pid_to_ptid (pid)));
1049 printf_unfiltered ("Attaching to %s\n",
1050 target_pid_to_str (pid_to_ptid (pid)));
1052 gdb_flush (gdb_stdout);
1055 do_initial_child_stuff (pid);
1056 target_terminal_ours ();
1060 child_detach (char *args ATTRIBUTE_UNUSED, int from_tty)
1064 char *exec_file = get_exec_file (0);
1067 printf_unfiltered ("Detaching from program: %s %s\n", exec_file,
1068 target_pid_to_str (inferior_ptid));
1069 gdb_flush (gdb_stdout);
1071 inferior_ptid = null_ptid;
1072 unpush_target (&child_ops);
1075 /* Print status information about what we're accessing. */
1078 child_files_info (struct target_ops *ignore ATTRIBUTE_UNUSED)
1080 printf_unfiltered ("\tUsing the running image of %s %s.\n",
1081 attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
1086 child_open (char *arg ATTRIBUTE_UNUSED, int from_tty ATTRIBUTE_UNUSED)
1088 error ("Use the \"run\" command to start a Unix child process.");
1091 /* Start an inferior win32 child process and sets inferior_ptid to its pid.
1092 EXEC_FILE is the file to run.
1093 ALLARGS is a string containing the arguments to the program.
1094 ENV is the environment vector to pass. Errors reported with error(). */
1097 child_create_inferior (char *exec_file, char *allargs, char **env)
1099 char real_path[MAXPATHLEN];
1105 PROCESS_INFORMATION pi;
1111 error ("No executable specified, use `target exec'.\n");
1113 memset (&si, 0, sizeof (si));
1114 si.cb = sizeof (si);
1116 cygwin_conv_to_win32_path (exec_file, real_path);
1118 flags = DEBUG_ONLY_THIS_PROCESS;
1121 flags |= CREATE_NEW_PROCESS_GROUP;
1124 flags |= CREATE_NEW_CONSOLE;
1126 args = alloca (strlen (real_path) + strlen (allargs) + 2);
1128 strcpy (args, real_path);
1131 strcat (args, allargs);
1133 /* Prepare the environment vars for CreateProcess. */
1135 /* This code use to assume all env vars were file names and would
1136 translate them all to win32 style. That obviously doesn't work in the
1137 general case. The current rule is that we only translate PATH.
1138 We need to handle PATH because we're about to call CreateProcess and
1139 it uses PATH to find DLL's. Fortunately PATH has a well-defined value
1140 in both posix and win32 environments. cygwin.dll will change it back
1141 to posix style if necessary. */
1143 static const char *conv_path_names[] =
1149 /* CreateProcess takes the environment list as a null terminated set of
1150 strings (i.e. two nulls terminate the list). */
1152 /* Get total size for env strings. */
1153 for (envlen = 0, i = 0; env[i] && *env[i]; i++)
1157 for (j = 0; conv_path_names[j]; j++)
1159 len = strlen (conv_path_names[j]);
1160 if (strncmp (conv_path_names[j], env[i], len) == 0)
1162 if (cygwin_posix_path_list_p (env[i] + len))
1164 + cygwin_posix_to_win32_path_list_buf_size (env[i] + len);
1166 envlen += strlen (env[i]) + 1;
1170 if (conv_path_names[j] == NULL)
1171 envlen += strlen (env[i]) + 1;
1174 winenv = alloca (envlen + 1);
1176 /* Copy env strings into new buffer. */
1177 for (temp = winenv, i = 0; env[i] && *env[i]; i++)
1181 for (j = 0; conv_path_names[j]; j++)
1183 len = strlen (conv_path_names[j]);
1184 if (strncmp (conv_path_names[j], env[i], len) == 0)
1186 if (cygwin_posix_path_list_p (env[i] + len))
1188 memcpy (temp, env[i], len);
1189 cygwin_posix_to_win32_path_list (env[i] + len, temp + len);
1192 strcpy (temp, env[i]);
1196 if (conv_path_names[j] == NULL)
1197 strcpy (temp, env[i]);
1199 temp += strlen (temp) + 1;
1202 /* Final nil string to terminate new env. */
1206 ret = CreateProcess (0,
1207 args, /* command line */
1208 NULL, /* Security */
1210 TRUE, /* inherit handles */
1211 flags, /* start flags */
1213 NULL, /* current directory */
1217 error ("Error creating process %s, (error %d)\n", exec_file, GetLastError ());
1219 CloseHandle (pi.hThread);
1220 CloseHandle (pi.hProcess);
1221 do_initial_child_stuff (pi.dwProcessId);
1223 /* child_continue (DBG_CONTINUE, -1); */
1224 proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0);
1228 child_mourn_inferior (void)
1230 (void) child_continue (DBG_CONTINUE, -1);
1231 unpush_target (&child_ops);
1232 generic_mourn_inferior ();
1235 /* Send a SIGINT to the process group. This acts just like the user typed a
1236 ^C on the controlling terminal. */
1241 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1242 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1243 registers_changed (); /* refresh register state */
1247 child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
1248 int write, struct mem_attrib *mem ATTRIBUTE_UNUSED,
1249 struct target_ops *target ATTRIBUTE_UNUSED)
1254 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
1255 len, (DWORD) memaddr));
1256 WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
1258 FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
1262 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
1263 len, (DWORD) memaddr));
1264 ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our, len,
1271 child_kill_inferior (void)
1273 CHECK (TerminateProcess (current_process_handle, 0));
1277 if (!child_continue (DBG_CONTINUE, -1))
1279 if (!WaitForDebugEvent (¤t_event, INFINITE))
1281 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
1285 CHECK (CloseHandle (current_process_handle));
1287 /* this may fail in an attached process so don't check. */
1288 (void) CloseHandle (current_thread->h);
1289 target_mourn_inferior (); /* or just child_mourn_inferior? */
1293 child_resume (ptid_t ptid, int step, enum target_signal sig)
1296 DWORD continue_status = last_sig > 0 && last_sig < NSIG ?
1297 DBG_EXCEPTION_NOT_HANDLED : DBG_CONTINUE;
1298 int pid = PIDGET (ptid);
1302 DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
1305 /* Get context for currently selected thread */
1306 th = thread_rec (current_event.dwThreadId, FALSE);
1311 /* Single step by setting t bit */
1312 child_fetch_inferior_registers (PS_REGNUM);
1313 th->context.EFlags |= FLAG_TRACE_BIT;
1316 if (th->context.ContextFlags)
1318 CHECK (SetThreadContext (th->h, &th->context));
1319 th->context.ContextFlags = 0;
1323 /* Allow continuing with the same signal that interrupted us.
1324 Otherwise complain. */
1326 child_continue (continue_status, pid);
1330 child_prepare_to_store (void)
1332 /* Do nothing, since we can store individual regs */
1336 child_can_run (void)
1342 child_close (int x ATTRIBUTE_UNUSED)
1344 DEBUG_EVENTS (("gdb: child_close, inferior_ptid=%d\n",
1345 PIDGET (inferior_ptid)));
1348 struct target_ops child_ops;
1351 init_child_ops (void)
1353 child_ops.to_shortname = "child";
1354 child_ops.to_longname = "Win32 child process";
1355 child_ops.to_doc = "Win32 child process (started by the \"run\" command).";
1356 child_ops.to_open = child_open;
1357 child_ops.to_close = child_close;
1358 child_ops.to_attach = child_attach;
1359 child_ops.to_detach = child_detach;
1360 child_ops.to_resume = child_resume;
1361 child_ops.to_wait = child_wait;
1362 child_ops.to_fetch_registers = child_fetch_inferior_registers;
1363 child_ops.to_store_registers = child_store_inferior_registers;
1364 child_ops.to_prepare_to_store = child_prepare_to_store;
1365 child_ops.to_xfer_memory = child_xfer_memory;
1366 child_ops.to_files_info = child_files_info;
1367 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
1368 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
1369 child_ops.to_terminal_init = terminal_init_inferior;
1370 child_ops.to_terminal_inferior = terminal_inferior;
1371 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
1372 child_ops.to_terminal_ours = terminal_ours;
1373 child_ops.to_terminal_info = child_terminal_info;
1374 child_ops.to_kill = child_kill_inferior;
1375 child_ops.to_load = 0;
1376 child_ops.to_lookup_symbol = 0;
1377 child_ops.to_create_inferior = child_create_inferior;
1378 child_ops.to_mourn_inferior = child_mourn_inferior;
1379 child_ops.to_can_run = child_can_run;
1380 child_ops.to_notice_signals = 0;
1381 child_ops.to_thread_alive = win32_child_thread_alive;
1382 child_ops.to_pid_to_str = cygwin_pid_to_str;
1383 child_ops.to_stop = child_stop;
1384 child_ops.to_stratum = process_stratum;
1385 child_ops.DONT_USE = 0;
1386 child_ops.to_has_all_memory = 1;
1387 child_ops.to_has_memory = 1;
1388 child_ops.to_has_stack = 1;
1389 child_ops.to_has_registers = 1;
1390 child_ops.to_has_execution = 1;
1391 child_ops.to_sections = 0;
1392 child_ops.to_sections_end = 0;
1393 child_ops.to_magic = OPS_MAGIC;
1397 _initialize_inftarg (void)
1399 struct cmd_list_element *c;
1403 c = add_com ("dll-symbols", class_files, dll_symbol_command,
1404 "Load dll library symbols from FILE.");
1405 c->completer = filename_completer;
1408 add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
1410 add_show_from_set (add_set_cmd ("new-console", class_support, var_boolean,
1411 (char *) &new_console,
1412 "Set creation of new console when creating child process.",
1416 add_show_from_set (add_set_cmd ("new-group", class_support, var_boolean,
1417 (char *) &new_group,
1418 "Set creation of new group when creating child process.",
1422 add_show_from_set (add_set_cmd ("debugexec", class_support, var_boolean,
1423 (char *) &debug_exec,
1424 "Set whether to display execution in child process.",
1428 add_show_from_set (add_set_cmd ("debugevents", class_support, var_boolean,
1429 (char *) &debug_events,
1430 "Set whether to display kernel events in child process.",
1434 add_show_from_set (add_set_cmd ("debugmemory", class_support, var_boolean,
1435 (char *) &debug_memory,
1436 "Set whether to display memory accesses in child process.",
1440 add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean,
1441 (char *) &debug_exceptions,
1442 "Set whether to display kernel exceptions in child process.",
1446 add_info ("dll", info_dll_command, "Status of loaded DLLs.");
1447 add_info_alias ("sharedlibrary", "dll", 1);
1449 add_target (&child_ops);
1452 /* Determine if the thread referenced by "pid" is alive
1453 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
1454 it means that the pid has died. Otherwise it is assumed to be alive. */
1456 win32_child_thread_alive (ptid_t ptid)
1458 int pid = PIDGET (ptid);
1460 return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
1464 /* Convert pid to printable format. */
1466 cygwin_pid_to_str (ptid_t ptid)
1468 static char buf[80];
1469 int pid = PIDGET (ptid);
1471 if ((DWORD) pid == current_event.dwProcessId)
1472 sprintf (buf, "process %d", pid);
1474 sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
1479 core_dll_symbols_add (char *dll_name, DWORD base_addr)
1481 struct objfile *objfile;
1482 char *objfile_basename;
1483 const char *dll_basename;
1485 if (!(dll_basename = strrchr (dll_name, '/')))
1486 dll_basename = dll_name;
1490 ALL_OBJFILES (objfile)
1492 objfile_basename = strrchr (objfile->name, '/');
1494 if (objfile_basename &&
1495 strcmp (dll_basename, objfile_basename + 1) == 0)
1497 printf_unfiltered ("%08lx:%s (symbols previously loaded)\n",
1498 base_addr, dll_name);
1503 register_loaded_dll (dll_name, base_addr + 0x1000);
1504 solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
1512 struct target_ops *target;
1515 map_code_section_args;
1518 map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
1522 struct section_table *new_target_sect_ptr;
1524 map_code_section_args *args = (map_code_section_args *) obj;
1525 struct target_ops *target = args->target;
1526 if (sect->flags & SEC_CODE)
1528 update_coreops = core_ops.to_sections == target->to_sections;
1530 if (target->to_sections)
1532 old = target->to_sections_end - target->to_sections;
1533 target->to_sections = (struct section_table *)
1534 xrealloc ((char *) target->to_sections,
1535 (sizeof (struct section_table)) * (1 + old));
1540 target->to_sections = (struct section_table *)
1541 xmalloc ((sizeof (struct section_table)));
1543 target->to_sections_end = target->to_sections + (1 + old);
1545 /* Update the to_sections field in the core_ops structure
1549 core_ops.to_sections = target->to_sections;
1550 core_ops.to_sections_end = target->to_sections_end;
1552 new_target_sect_ptr = target->to_sections + old;
1553 new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
1554 new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
1555 bfd_section_size (abfd, sect);;
1556 new_target_sect_ptr->the_bfd_section = sect;
1557 new_target_sect_ptr->bfd = abfd;
1562 dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
1565 map_code_section_args map_args;
1566 asection *lowest_sect;
1568 if (dll_name == NULL || target == NULL)
1570 name = xstrdup (dll_name);
1571 dll_bfd = bfd_openr (name, "pei-i386");
1572 if (dll_bfd == NULL)
1575 if (bfd_check_format (dll_bfd, bfd_object))
1577 lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
1578 if (lowest_sect == NULL)
1580 map_args.target = target;
1581 map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
1583 bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (void *) (&map_args));
1590 core_section_load_dll_symbols (bfd * abfd, asection * sect, void *obj)
1592 struct target_ops *target = (struct target_ops *) obj;
1597 char *dll_name = NULL;
1599 struct win32_pstatus *pstatus;
1602 if (strncmp (sect->name, ".module", 7))
1605 buf = (char *) xmalloc (sect->_raw_size + 1);
1608 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
1611 if (!bfd_get_section_contents (abfd, sect, buf, 0, sect->_raw_size))
1614 pstatus = (struct win32_pstatus *) buf;
1616 memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
1617 dll_name_size = pstatus->data.module_info.module_name_size;
1618 if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > sect->_raw_size)
1621 dll_name = (char *) xmalloc (dll_name_size + 1);
1624 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
1627 strncpy (dll_name, pstatus->data.module_info.module_name, dll_name_size);
1629 while ((p = strchr (dll_name, '\\')))
1632 if (!core_dll_symbols_add (dll_name, (DWORD) base_addr))
1633 printf_unfiltered ("%s: Failed to load dll symbols.\n", dll_name);
1635 if (!dll_code_sections_add (dll_name, (DWORD) base_addr + 0x1000, target))
1636 printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
1647 child_solib_add (char *filename ATTRIBUTE_UNUSED, int from_tty, struct target_ops *target)
1651 child_clear_solibs ();
1652 bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols, target);
1656 if (solib_end && solib_end->name)
1657 solib_symbols_add (solib_end->name, from_tty, solib_end->load_addr);
1662 fetch_elf_core_registers (char *core_reg_sect,
1663 unsigned core_reg_size,
1668 if (core_reg_size < sizeof (CONTEXT))
1670 error ("Core file register section too small (%u bytes).", core_reg_size);
1673 for (r = 0; r < NUM_REGS; r++)
1674 supply_register (r, core_reg_sect + mappings[r]);
1677 static struct core_fns win32_elf_core_fns =
1679 bfd_target_elf_flavour,
1680 default_check_format,
1681 default_core_sniffer,
1682 fetch_elf_core_registers,
1687 _initialize_core_win32 (void)
1689 add_core_fns (&win32_elf_core_fns);