1 /* Target-vector operations for controlling win32 child processes, for GDB.
3 Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 Free
4 Software Foundation, Inc.
6 Contributed by Cygnus Solutions, A Red Hat Company.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 2 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without eve nthe implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program; if not, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
27 /* We assume we're being built with and will be used for cygwin. */
30 #include "tm.h" /* required for SSE registers */
31 #include "frame.h" /* required by inferior.h */
36 #include "completer.h"
39 #include "i386-tdep.h"
41 #include <sys/types.h>
46 #include <sys/cygwin.h>
51 #include "gdb_string.h"
52 #include "gdbthread.h"
54 #include <sys/param.h>
57 /* The ui's event loop. */
58 extern int (*ui_loop_hook) (int signo);
60 /* If we're not using the old Cygwin header file set, define the
61 following which never should have been in the generic Win32 API
62 headers in the first place since they were our own invention... */
63 #ifndef _GNU_H_WINDOWS_H
66 FLAG_TRACE_BIT = 0x100,
67 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
70 #include <sys/procfs.h>
74 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
75 | CONTEXT_EXTENDED_REGISTERS
77 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS
80 static unsigned dr[8];
81 static int debug_registers_changed = 0;
82 static int debug_registers_used = 0;
84 /* The string sent by cygwin when it processes a signal.
85 FIXME: This should be in a cygwin include file. */
86 #define CYGWIN_SIGNAL_STRING "cygwin: signal"
88 #define CHECK(x) check (x, __FILE__,__LINE__)
89 #define DEBUG_EXEC(x) if (debug_exec) printf_unfiltered x
90 #define DEBUG_EVENTS(x) if (debug_events) printf_unfiltered x
91 #define DEBUG_MEM(x) if (debug_memory) printf_unfiltered x
92 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf_unfiltered x
94 /* Forward declaration */
95 extern struct target_ops child_ops;
97 static void child_stop (void);
98 static int win32_child_thread_alive (ptid_t);
99 void child_kill_inferior (void);
101 static enum target_signal last_sig = TARGET_SIGNAL_0;
102 /* Set if a signal was received from the debugged process */
104 /* Thread information structure used to track information that is
105 not available in gdb's thread structure. */
106 typedef struct thread_info_struct
108 struct thread_info_struct *next;
118 static thread_info thread_head;
120 /* The process and thread handles for the above context. */
122 static DEBUG_EVENT current_event; /* The current debug event from
124 static HANDLE current_process_handle; /* Currently executing process */
125 static thread_info *current_thread; /* Info on currently selected thread */
126 static DWORD main_thread_id; /* Thread ID of the main thread */
128 /* Counts of things. */
129 static int exception_count = 0;
130 static int event_count = 0;
131 static int saw_create;
134 static int new_console = 0;
135 static int new_group = 1;
136 static int debug_exec = 0; /* show execution */
137 static int debug_events = 0; /* show events from kernel */
138 static int debug_memory = 0; /* show target memory accesses */
139 static int debug_exceptions = 0; /* show target exceptions */
140 static int useshell = 0; /* use shell for subprocesses */
142 /* This vector maps GDB's idea of a register's number into an address
143 in the win32 exception context vector.
145 It also contains the bit mask needed to load the register in question.
147 One day we could read a reg, we could inspect the context we
148 already have loaded, if it doesn't have the bit set that we need,
149 we read that set of registers in using GetThreadContext. If the
150 context already contains what we need, we just unpack it. Then to
151 write a register, first we have to ensure that the context contains
152 the other regs of the group, and then we copy the info in and set
155 #define context_offset(x) ((int)&(((CONTEXT *)NULL)->x))
156 static const int mappings[] =
158 context_offset (Eax),
159 context_offset (Ecx),
160 context_offset (Edx),
161 context_offset (Ebx),
162 context_offset (Esp),
163 context_offset (Ebp),
164 context_offset (Esi),
165 context_offset (Edi),
166 context_offset (Eip),
167 context_offset (EFlags),
168 context_offset (SegCs),
169 context_offset (SegSs),
170 context_offset (SegDs),
171 context_offset (SegEs),
172 context_offset (SegFs),
173 context_offset (SegGs),
174 context_offset (FloatSave.RegisterArea[0 * 10]),
175 context_offset (FloatSave.RegisterArea[1 * 10]),
176 context_offset (FloatSave.RegisterArea[2 * 10]),
177 context_offset (FloatSave.RegisterArea[3 * 10]),
178 context_offset (FloatSave.RegisterArea[4 * 10]),
179 context_offset (FloatSave.RegisterArea[5 * 10]),
180 context_offset (FloatSave.RegisterArea[6 * 10]),
181 context_offset (FloatSave.RegisterArea[7 * 10]),
182 context_offset (FloatSave.ControlWord),
183 context_offset (FloatSave.StatusWord),
184 context_offset (FloatSave.TagWord),
185 context_offset (FloatSave.ErrorSelector),
186 context_offset (FloatSave.ErrorOffset),
187 context_offset (FloatSave.DataSelector),
188 context_offset (FloatSave.DataOffset),
189 context_offset (FloatSave.ErrorSelector)
192 context_offset (ExtendedRegisters[10*16]),
193 context_offset (ExtendedRegisters[11*16]),
194 context_offset (ExtendedRegisters[12*16]),
195 context_offset (ExtendedRegisters[13*16]),
196 context_offset (ExtendedRegisters[14*16]),
197 context_offset (ExtendedRegisters[15*16]),
198 context_offset (ExtendedRegisters[16*16]),
199 context_offset (ExtendedRegisters[17*16]),
201 context_offset (ExtendedRegisters[24])
205 #undef context_offset
207 /* This vector maps the target's idea of an exception (extracted
208 from the DEBUG_EVENT structure) to GDB's idea. */
210 struct xlate_exception
213 enum target_signal us;
216 static const struct xlate_exception
219 {EXCEPTION_ACCESS_VIOLATION, TARGET_SIGNAL_SEGV},
220 {STATUS_STACK_OVERFLOW, TARGET_SIGNAL_SEGV},
221 {EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
222 {DBG_CONTROL_C, TARGET_SIGNAL_INT},
223 {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
224 {STATUS_FLOAT_DIVIDE_BY_ZERO, TARGET_SIGNAL_FPE},
228 check (BOOL ok, const char *file, int line)
231 printf_filtered ("error return %s:%d was %lu\n", file, line,
236 /* Find a thread record given a thread id.
237 If get_context then also retrieve the context for this
240 thread_rec (DWORD id, int get_context)
244 for (th = &thread_head; (th = th->next) != NULL;)
247 if (!th->suspend_count && get_context)
249 if (get_context > 0 && id != current_event.dwThreadId)
250 th->suspend_count = SuspendThread (th->h) + 1;
251 else if (get_context < 0)
252 th->suspend_count = -1;
254 th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
255 GetThreadContext (th->h, &th->context);
256 if (id == current_event.dwThreadId)
258 /* Copy dr values from that thread. */
259 dr[0] = th->context.Dr0;
260 dr[1] = th->context.Dr1;
261 dr[2] = th->context.Dr2;
262 dr[3] = th->context.Dr3;
263 dr[6] = th->context.Dr6;
264 dr[7] = th->context.Dr7;
273 /* Add a thread to the thread list */
275 child_add_thread (DWORD id, HANDLE h)
279 if ((th = thread_rec (id, FALSE)))
282 th = (thread_info *) xmalloc (sizeof (*th));
283 memset (th, 0, sizeof (*th));
286 th->next = thread_head.next;
287 thread_head.next = th;
288 add_thread (pid_to_ptid (id));
289 /* Set the debug registers for the new thread in they are used. */
290 if (debug_registers_used)
292 /* Only change the value of the debug registers. */
293 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
294 CHECK (GetThreadContext (th->h, &th->context));
295 th->context.Dr0 = dr[0];
296 th->context.Dr1 = dr[1];
297 th->context.Dr2 = dr[2];
298 th->context.Dr3 = dr[3];
299 /* th->context.Dr6 = dr[6];
300 FIXME: should we set dr6 also ?? */
301 th->context.Dr7 = dr[7];
302 CHECK (SetThreadContext (th->h, &th->context));
303 th->context.ContextFlags = 0;
308 /* Clear out any old thread list and reintialize it to a
311 child_init_thread_list (void)
313 thread_info *th = &thread_head;
315 DEBUG_EVENTS (("gdb: child_init_thread_list\n"));
317 while (th->next != NULL)
319 thread_info *here = th->next;
320 th->next = here->next;
321 (void) CloseHandle (here->h);
326 /* Delete a thread from the list of threads */
328 child_delete_thread (DWORD id)
333 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (pid_to_ptid (id)));
334 delete_thread (pid_to_ptid (id));
336 for (th = &thread_head;
337 th->next != NULL && th->next->id != id;
341 if (th->next != NULL)
343 thread_info *here = th->next;
344 th->next = here->next;
345 CloseHandle (here->h);
351 do_child_fetch_inferior_registers (int r)
353 char *context_offset = ((char *) ¤t_thread->context) + mappings[r];
357 l = *((long *) context_offset) & 0xffff;
358 supply_register (r, (char *) &l);
360 else if (r == FOP_REGNUM)
362 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
363 supply_register (r, (char *) &l);
366 supply_register (r, context_offset);
369 for (r = 0; r < NUM_REGS; r++)
370 do_child_fetch_inferior_registers (r);
375 child_fetch_inferior_registers (int r)
377 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
378 do_child_fetch_inferior_registers (r);
382 do_child_store_inferior_registers (int r)
385 regcache_collect (r, ((char *) ¤t_thread->context) + mappings[r]);
388 for (r = 0; r < NUM_REGS; r++)
389 do_child_store_inferior_registers (r);
393 /* Store a new register value into the current thread context */
395 child_store_inferior_registers (int r)
397 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
398 do_child_store_inferior_registers (r);
401 static int psapi_loaded = 0;
402 static HMODULE psapi_module_handle = NULL;
403 static BOOL WINAPI (*psapi_EnumProcessModules) (HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
404 static BOOL WINAPI (*psapi_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, DWORD) = NULL;
405 static DWORD WINAPI (*psapi_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, DWORD) = NULL;
408 psapi_get_dll_name (DWORD BaseAddress, char *dll_name_ret)
414 HMODULE *DllHandle = dh_buf;
419 psapi_EnumProcessModules == NULL ||
420 psapi_GetModuleInformation == NULL ||
421 psapi_GetModuleFileNameExA == NULL)
426 psapi_module_handle = LoadLibrary ("psapi.dll");
427 if (!psapi_module_handle)
429 /* printf_unfiltered ("error loading psapi.dll: %u", GetLastError ()); */
432 psapi_EnumProcessModules = GetProcAddress (psapi_module_handle, "EnumProcessModules");
433 psapi_GetModuleInformation = GetProcAddress (psapi_module_handle, "GetModuleInformation");
434 psapi_GetModuleFileNameExA = (void *) GetProcAddress (psapi_module_handle,
435 "GetModuleFileNameExA");
436 if (psapi_EnumProcessModules == NULL ||
437 psapi_GetModuleInformation == NULL ||
438 psapi_GetModuleFileNameExA == NULL)
443 ok = (*psapi_EnumProcessModules) (current_process_handle,
448 if (!ok || !cbNeeded)
451 DllHandle = (HMODULE *) alloca (cbNeeded);
455 ok = (*psapi_EnumProcessModules) (current_process_handle,
462 for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
464 if (!(*psapi_GetModuleInformation) (current_process_handle,
468 error ("Can't get module info");
470 len = (*psapi_GetModuleFileNameExA) (current_process_handle,
475 error ("Error getting dll name: %u\n", (unsigned) GetLastError ());
477 if ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
482 dll_name_ret[0] = '\0';
486 /* Encapsulate the information required in a call to
487 symbol_file_add_args */
488 struct safe_symbol_file_add_args
492 struct section_addr_info *addrs;
495 struct ui_file *err, *out;
499 /* Maintain a linked list of "so" information. */
502 struct so_stuff *next;
506 struct objfile *objfile;
508 } solib_start, *solib_end;
510 /* Call symbol_file_add with stderr redirected. We don't care if there
513 safe_symbol_file_add_stub (void *argv)
515 #define p ((struct safe_symbol_file_add_args *)argv)
516 struct so_stuff *so = &solib_start;
518 while ((so = so->next))
519 if (so->loaded && strcasecmp (so->name, p->name) == 0)
521 p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
526 /* Restore gdb's stderr after calling symbol_file_add */
528 safe_symbol_file_add_cleanup (void *p)
530 #define sp ((struct safe_symbol_file_add_args *)p)
531 gdb_flush (gdb_stderr);
532 gdb_flush (gdb_stdout);
533 ui_file_delete (gdb_stderr);
534 ui_file_delete (gdb_stdout);
535 gdb_stderr = sp->err;
536 gdb_stdout = sp->out;
540 /* symbol_file_add wrapper that prevents errors from being displayed. */
541 static struct objfile *
542 safe_symbol_file_add (char *name, int from_tty,
543 struct section_addr_info *addrs,
544 int mainline, int flags)
546 struct safe_symbol_file_add_args p;
547 struct cleanup *cleanup;
549 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
553 gdb_flush (gdb_stderr);
554 gdb_flush (gdb_stdout);
555 gdb_stderr = ui_file_new ();
556 gdb_stdout = ui_file_new ();
558 p.from_tty = from_tty;
560 p.mainline = mainline;
562 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
564 do_cleanups (cleanup);
568 /* Remember the maximum DLL length for printing in info dll command. */
569 int max_dll_name_len;
572 register_loaded_dll (const char *name, DWORD load_addr)
575 char ppath[MAX_PATH + 1];
576 char buf[MAX_PATH + 1];
577 char cwd[MAX_PATH + 1];
579 WIN32_FIND_DATA w32_fd;
580 HANDLE h = FindFirstFile(name, &w32_fd);
581 MEMORY_BASIC_INFORMATION m;
584 if (h == INVALID_HANDLE_VALUE)
590 if (GetCurrentDirectory (MAX_PATH + 1, cwd))
592 p = strrchr (buf, '\\');
595 SetCurrentDirectory (buf);
596 GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
597 SetCurrentDirectory (cwd);
601 cygwin_conv_to_posix_path (buf, ppath);
602 so = (struct so_stuff *) xmalloc (sizeof (struct so_stuff) + strlen (ppath) + 8 + 1);
604 so->load_addr = load_addr;
605 if (VirtualQueryEx (current_process_handle, (void *) load_addr, &m,
607 so->end_addr = (DWORD) m.AllocationBase + m.RegionSize;
609 so->end_addr = load_addr + 0x2000; /* completely arbitrary */
613 strcpy (so->name, ppath);
615 solib_end->next = so;
617 len = strlen (ppath);
618 if (len > max_dll_name_len)
619 max_dll_name_len = len;
623 get_image_name (HANDLE h, void *address, int unicode)
625 static char buf[(2 * MAX_PATH) + 1];
626 DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
632 /* Attempt to read the name of the dll that was detected.
633 This is documented to work only when actively debugging
634 a program. It will not work for attached processes. */
638 /* See if we could read the address of a string, and that the
639 address isn't null. */
640 if (!ReadProcessMemory (h, address, &address_ptr, sizeof (address_ptr), &done)
641 || done != sizeof (address_ptr) || !address_ptr)
644 /* Find the length of the string */
645 while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
646 && (b[0] != 0 || b[size - 1] != 0) && done == size)
650 ReadProcessMemory (h, address_ptr, buf, len, &done);
653 WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
654 ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
657 WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0);
663 /* Wait for child to do something. Return pid of child, or -1 in case
664 of error; store status through argument pointer OURSTATUS. */
666 handle_load_dll (void *dummy)
668 LOAD_DLL_DEBUG_INFO *event = ¤t_event.u.LoadDll;
669 char dll_buf[MAX_PATH + 1];
670 char *dll_name = NULL;
673 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
675 if (!psapi_get_dll_name ((DWORD) (event->lpBaseOfDll), dll_buf))
676 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
680 if (*dll_name == '\0')
681 dll_name = get_image_name (current_process_handle, event->lpImageName, event->fUnicode);
685 register_loaded_dll (dll_name, (DWORD) event->lpBaseOfDll + 0x1000);
691 handle_unload_dll (void *dummy)
693 DWORD lpBaseOfDll = (DWORD) current_event.u.UnloadDll.lpBaseOfDll + 0x1000;
696 for (so = &solib_start; so->next != NULL; so = so->next)
697 if (so->next->load_addr == lpBaseOfDll)
699 struct so_stuff *sodel = so->next;
700 so->next = sodel->next;
704 free_objfile (sodel->objfile);
708 error ("Error: dll starting at 0x%lx not found.\n", (DWORD) lpBaseOfDll);
714 solib_address (CORE_ADDR address)
717 for (so = &solib_start; so->next != NULL; so = so->next)
718 if (address >= so->load_addr && address <= so->end_addr)
723 /* Return name of last loaded DLL. */
725 child_solib_loaded_library_pathname (int pid)
727 return !solib_end || !solib_end->name[0] ? NULL : solib_end->name;
730 /* Clear list of loaded DLLs. */
732 child_clear_solibs (void)
734 struct so_stuff *so, *so1 = solib_start.next;
736 while ((so = so1) != NULL)
742 solib_start.next = NULL;
743 solib_start.objfile = NULL;
744 solib_end = &solib_start;
745 max_dll_name_len = sizeof ("DLL Name") - 1;
748 /* Get the loaded address of all sections, given that .text was loaded
749 at text_load. Assumes that all sections are subject to the same
750 relocation offset. Returns NULL if problems occur or if the
751 sections were not relocated. */
753 static struct section_addr_info *
754 get_relocated_section_addrs (bfd *abfd, CORE_ADDR text_load)
756 struct section_addr_info *result = NULL;
757 int section_count = bfd_count_sections (abfd);
758 asection *text_section = bfd_get_section_by_name (abfd, ".text");
763 /* Couldn't get the .text section. Weird. */
766 else if (text_load == (text_vma = bfd_get_section_vma (abfd, text_section)))
768 /* DLL wasn't relocated. */
773 /* Figure out all sections' loaded addresses. The offset here is
774 such that taking a bfd_get_section_vma() result and adding
775 offset will give the real load address of the section. */
777 CORE_ADDR offset = text_load - text_vma;
779 struct section_table *table_start = NULL;
780 struct section_table *table_end = NULL;
781 struct section_table *iter = NULL;
783 build_section_table (abfd, &table_start, &table_end);
785 for (iter = table_start; iter < table_end; ++iter)
787 /* Relocated addresses. */
788 iter->addr += offset;
789 iter->endaddr += offset;
792 result = build_section_addr_info_from_section_table (table_start,
801 /* Add DLL symbol information. */
802 static struct objfile *
803 solib_symbols_add (char *name, int from_tty, CORE_ADDR load_addr)
805 struct section_addr_info *section_addrs_ptr = NULL;
806 static struct objfile *result = NULL;
809 /* The symbols in a dll are offset by 0x1000, which is the
810 the offset from 0 of the first byte in an image - because
811 of the file header and the section alignment. */
813 if (!name || !name[0])
816 abfd = bfd_openr (name, "pei-i386");
820 /* pei failed - try pe */
821 abfd = bfd_openr (name, "pe-i386");
826 if (bfd_check_format (abfd, bfd_object))
828 section_addrs_ptr = get_relocated_section_addrs (abfd, load_addr);
834 if (section_addrs_ptr)
836 result = safe_symbol_file_add (name, from_tty, section_addrs_ptr,
839 free_section_addr_info (section_addrs_ptr);
844 /* Fallback on handling just the .text section. */
845 struct section_addr_info section_addrs;
847 memset (§ion_addrs, 0, sizeof (section_addrs));
848 section_addrs.other[0].name = ".text";
849 section_addrs.other[0].addr = load_addr;
851 result = safe_symbol_file_add (name, from_tty, §ion_addrs,
858 /* Load DLL symbol info. */
860 dll_symbol_command (char *args, int from_tty)
866 error ("dll-symbols requires a file name");
869 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
871 char *newargs = (char *) alloca (n + 4 + 1);
872 strcpy (newargs, args);
873 strcat (newargs, ".dll");
877 safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
880 /* List currently loaded DLLs. */
882 info_dll_command (char *ignore, int from_tty)
884 struct so_stuff *so = &solib_start;
889 printf_filtered ("%*s Load Address\n", -max_dll_name_len, "DLL Name");
890 while ((so = so->next) != NULL)
891 printf_filtered ("%*s %08lx\n", -max_dll_name_len, so->name, so->load_addr);
896 /* Handle DEBUG_STRING output from child process.
897 Cygwin prepends its messages with a "cygwin:". Interpret this as
898 a Cygwin signal. Otherwise just print the string as a warning. */
900 handle_output_debug_string (struct target_waitstatus *ourstatus)
905 if (!target_read_string
906 ((CORE_ADDR) current_event.u.DebugString.lpDebugStringData, &s, 1024, 0)
910 if (strncmp (s, CYGWIN_SIGNAL_STRING, sizeof (CYGWIN_SIGNAL_STRING) - 1) != 0)
912 if (strncmp (s, "cYg", 3) != 0)
918 int sig = strtol (s + sizeof (CYGWIN_SIGNAL_STRING) - 1, &p, 0);
919 gotasig = target_signal_from_host (sig);
920 ourstatus->value.sig = gotasig;
922 ourstatus->kind = TARGET_WAITKIND_STOPPED;
930 display_selector (HANDLE thread, DWORD sel)
933 if (GetThreadSelectorEntry (thread, sel, &info))
936 printf_filtered ("0x%03lx: ", sel);
937 if (!info.HighWord.Bits.Pres)
939 puts_filtered ("Segment not present\n");
942 base = (info.HighWord.Bits.BaseHi << 24) +
943 (info.HighWord.Bits.BaseMid << 16)
945 limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
946 if (info.HighWord.Bits.Granularity)
947 limit = (limit << 12) | 0xfff;
948 printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
949 if (info.HighWord.Bits.Default_Big)
950 puts_filtered(" 32-bit ");
952 puts_filtered(" 16-bit ");
953 switch ((info.HighWord.Bits.Type & 0xf) >> 1)
956 puts_filtered ("Data (Read-Only, Exp-up");
959 puts_filtered ("Data (Read/Write, Exp-up");
962 puts_filtered ("Unused segment (");
965 puts_filtered ("Data (Read/Write, Exp-down");
968 puts_filtered ("Code (Exec-Only, N.Conf");
971 puts_filtered ("Code (Exec/Read, N.Conf");
974 puts_filtered ("Code (Exec-Only, Conf");
977 puts_filtered ("Code (Exec/Read, Conf");
980 printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
982 if ((info.HighWord.Bits.Type & 0x1) == 0)
983 puts_filtered(", N.Acc");
984 puts_filtered (")\n");
985 if ((info.HighWord.Bits.Type & 0x10) == 0)
986 puts_filtered("System selector ");
987 printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
988 if (info.HighWord.Bits.Granularity)
989 puts_filtered ("Page granular.\n");
991 puts_filtered ("Byte granular.\n");
996 printf_filtered ("Invalid selector 0x%lx.\n",sel);
1002 display_selectors (char * args, int from_tty)
1004 if (!current_thread)
1006 puts_filtered ("Impossible to display selectors now.\n");
1012 puts_filtered ("Selector $cs\n");
1013 display_selector (current_thread->h,
1014 current_thread->context.SegCs);
1015 puts_filtered ("Selector $ds\n");
1016 display_selector (current_thread->h,
1017 current_thread->context.SegDs);
1018 puts_filtered ("Selector $es\n");
1019 display_selector (current_thread->h,
1020 current_thread->context.SegEs);
1021 puts_filtered ("Selector $ss\n");
1022 display_selector (current_thread->h,
1023 current_thread->context.SegSs);
1024 puts_filtered ("Selector $fs\n");
1025 display_selector (current_thread->h,
1026 current_thread->context.SegFs);
1027 puts_filtered ("Selector $gs\n");
1028 display_selector (current_thread->h,
1029 current_thread->context.SegGs);
1034 sel = parse_and_eval_long (args);
1035 printf_filtered ("Selector \"%s\"\n",args);
1036 display_selector (current_thread->h, sel);
1040 static struct cmd_list_element *info_w32_cmdlist = NULL;
1043 info_w32_command (char *args, int from_tty)
1045 help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
1049 #define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
1050 printf_unfiltered ("gdb: Target exception %s at 0x%08lx\n", x, \
1051 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress)
1054 handle_exception (struct target_waitstatus *ourstatus)
1057 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
1059 ourstatus->kind = TARGET_WAITKIND_STOPPED;
1061 /* Record the context of the current thread */
1062 th = thread_rec (current_event.dwThreadId, -1);
1066 case EXCEPTION_ACCESS_VIOLATION:
1067 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
1068 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1070 case STATUS_STACK_OVERFLOW:
1071 DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
1072 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1074 case STATUS_FLOAT_DENORMAL_OPERAND:
1075 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
1076 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1078 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1079 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
1080 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1082 case STATUS_FLOAT_INEXACT_RESULT:
1083 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
1084 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1086 case STATUS_FLOAT_INVALID_OPERATION:
1087 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
1088 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1090 case STATUS_FLOAT_OVERFLOW:
1091 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
1092 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1094 case STATUS_FLOAT_STACK_CHECK:
1095 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
1096 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1098 case STATUS_FLOAT_UNDERFLOW:
1099 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
1100 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1102 case STATUS_FLOAT_DIVIDE_BY_ZERO:
1103 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1104 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1106 case STATUS_INTEGER_DIVIDE_BY_ZERO:
1107 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
1108 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1110 case STATUS_INTEGER_OVERFLOW:
1111 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1112 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1114 case EXCEPTION_BREAKPOINT:
1115 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
1116 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1119 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
1120 ourstatus->value.sig = TARGET_SIGNAL_INT;
1122 case DBG_CONTROL_BREAK:
1123 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
1124 ourstatus->value.sig = TARGET_SIGNAL_INT;
1126 case EXCEPTION_SINGLE_STEP:
1127 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
1128 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1130 case EXCEPTION_ILLEGAL_INSTRUCTION:
1131 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1132 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1134 case EXCEPTION_PRIV_INSTRUCTION:
1135 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1136 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1138 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1139 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
1140 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1143 if (current_event.u.Exception.dwFirstChance)
1145 printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
1146 current_event.u.Exception.ExceptionRecord.ExceptionCode,
1147 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
1148 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1152 last_sig = ourstatus->value.sig;
1156 /* Resume all artificially suspended threads if we are continuing
1159 child_continue (DWORD continue_status, int id)
1165 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
1166 current_event.dwProcessId, current_event.dwThreadId,
1167 continue_status == DBG_CONTINUE ?
1168 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
1169 res = ContinueDebugEvent (current_event.dwProcessId,
1170 current_event.dwThreadId,
1172 continue_status = 0;
1174 for (th = &thread_head; (th = th->next) != NULL;)
1175 if (((id == -1) || (id == (int) th->id)) && th->suspend_count)
1178 for (i = 0; i < th->suspend_count; i++)
1179 (void) ResumeThread (th->h);
1180 th->suspend_count = 0;
1181 if (debug_registers_changed)
1183 /* Only change the value of the debug reisters */
1184 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
1185 th->context.Dr0 = dr[0];
1186 th->context.Dr1 = dr[1];
1187 th->context.Dr2 = dr[2];
1188 th->context.Dr3 = dr[3];
1189 /* th->context.Dr6 = dr[6];
1190 FIXME: should we set dr6 also ?? */
1191 th->context.Dr7 = dr[7];
1192 CHECK (SetThreadContext (th->h, &th->context));
1193 th->context.ContextFlags = 0;
1197 debug_registers_changed = 0;
1201 /* Get the next event from the child. Return 1 if the event requires
1202 handling by WFI (or whatever).
1205 get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
1208 DWORD continue_status, event_code;
1209 thread_info *th = NULL;
1210 static thread_info dummy_thread_info;
1213 last_sig = TARGET_SIGNAL_0;
1215 if (!(debug_event = WaitForDebugEvent (¤t_event, 1000)))
1219 continue_status = DBG_CONTINUE;
1221 event_code = current_event.dwDebugEventCode;
1222 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1226 case CREATE_THREAD_DEBUG_EVENT:
1227 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
1228 (unsigned) current_event.dwProcessId,
1229 (unsigned) current_event.dwThreadId,
1230 "CREATE_THREAD_DEBUG_EVENT"));
1231 if (saw_create != 1)
1233 /* Record the existence of this thread */
1234 th = child_add_thread (current_event.dwThreadId,
1235 current_event.u.CreateThread.hThread);
1237 printf_unfiltered ("[New %s]\n",
1239 pid_to_ptid (current_event.dwThreadId)));
1240 retval = current_event.dwThreadId;
1243 case EXIT_THREAD_DEBUG_EVENT:
1244 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1245 (unsigned) current_event.dwProcessId,
1246 (unsigned) current_event.dwThreadId,
1247 "EXIT_THREAD_DEBUG_EVENT"));
1248 if (saw_create != 1)
1250 child_delete_thread (current_event.dwThreadId);
1251 th = &dummy_thread_info;
1254 case CREATE_PROCESS_DEBUG_EVENT:
1255 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1256 (unsigned) current_event.dwProcessId,
1257 (unsigned) current_event.dwThreadId,
1258 "CREATE_PROCESS_DEBUG_EVENT"));
1259 CloseHandle (current_event.u.CreateProcessInfo.hFile);
1260 if (++saw_create != 1)
1262 CloseHandle (current_event.u.CreateProcessInfo.hProcess);
1266 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1267 main_thread_id = current_event.dwThreadId;
1268 /* Add the main thread */
1270 th = child_add_thread (current_event.dwProcessId,
1271 current_event.u.CreateProcessInfo.hProcess);
1273 th = child_add_thread (main_thread_id,
1274 current_event.u.CreateProcessInfo.hThread);
1275 retval = ourstatus->value.related_pid = current_event.dwThreadId;
1278 case EXIT_PROCESS_DEBUG_EVENT:
1279 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1280 (unsigned) current_event.dwProcessId,
1281 (unsigned) current_event.dwThreadId,
1282 "EXIT_PROCESS_DEBUG_EVENT"));
1283 if (saw_create != 1)
1285 ourstatus->kind = TARGET_WAITKIND_EXITED;
1286 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1287 CloseHandle (current_process_handle);
1288 retval = main_thread_id;
1291 case LOAD_DLL_DEBUG_EVENT:
1292 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1293 (unsigned) current_event.dwProcessId,
1294 (unsigned) current_event.dwThreadId,
1295 "LOAD_DLL_DEBUG_EVENT"));
1296 CloseHandle (current_event.u.LoadDll.hFile);
1297 if (saw_create != 1)
1299 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
1300 registers_changed (); /* mark all regs invalid */
1301 ourstatus->kind = TARGET_WAITKIND_LOADED;
1302 ourstatus->value.integer = 0;
1303 retval = main_thread_id;
1304 re_enable_breakpoints_in_shlibs ();
1307 case UNLOAD_DLL_DEBUG_EVENT:
1308 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1309 (unsigned) current_event.dwProcessId,
1310 (unsigned) current_event.dwThreadId,
1311 "UNLOAD_DLL_DEBUG_EVENT"));
1312 if (saw_create != 1)
1314 catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
1315 registers_changed (); /* mark all regs invalid */
1316 /* ourstatus->kind = TARGET_WAITKIND_UNLOADED;
1317 does not exist yet. */
1320 case EXCEPTION_DEBUG_EVENT:
1321 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1322 (unsigned) current_event.dwProcessId,
1323 (unsigned) current_event.dwThreadId,
1324 "EXCEPTION_DEBUG_EVENT"));
1325 if (saw_create != 1)
1327 if (handle_exception (ourstatus))
1328 retval = current_event.dwThreadId;
1331 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
1332 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1333 (unsigned) current_event.dwProcessId,
1334 (unsigned) current_event.dwThreadId,
1335 "OUTPUT_DEBUG_STRING_EVENT"));
1336 if (saw_create != 1)
1338 if (handle_output_debug_string (ourstatus))
1339 retval = main_thread_id;
1343 if (saw_create != 1)
1345 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
1346 (DWORD) current_event.dwProcessId,
1347 (DWORD) current_event.dwThreadId);
1348 printf_unfiltered (" unknown event code %ld\n",
1349 current_event.dwDebugEventCode);
1353 if (!retval || saw_create != 1)
1354 CHECK (child_continue (continue_status, -1));
1357 current_thread = th ? : thread_rec (current_event.dwThreadId, TRUE);
1358 inferior_ptid = pid_to_ptid (retval);
1365 /* Wait for interesting events to occur in the target process. */
1367 child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
1369 int pid = PIDGET (ptid);
1371 /* We loop when we get a non-standard exception rather than return
1372 with a SPURIOUS because resume can try and step or modify things,
1373 which needs a current_thread->h. But some of these exceptions mark
1374 the birth or death of threads, which mean that the current thread
1375 isn't necessarily what you think it is. */
1379 int retval = get_child_debug_event (pid, ourstatus);
1381 return pid_to_ptid (retval);
1386 if (ui_loop_hook != NULL)
1387 detach = ui_loop_hook (0);
1390 child_kill_inferior ();
1396 do_initial_child_stuff (DWORD pid)
1398 extern int stop_after_trap;
1401 last_sig = TARGET_SIGNAL_0;
1403 exception_count = 0;
1404 debug_registers_changed = 0;
1405 debug_registers_used = 0;
1406 for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1408 current_event.dwProcessId = pid;
1409 memset (¤t_event, 0, sizeof (current_event));
1410 push_target (&child_ops);
1411 child_init_thread_list ();
1412 disable_breakpoints_in_shlibs (1);
1413 child_clear_solibs ();
1414 clear_proceed_status ();
1415 init_wait_for_inferior ();
1417 target_terminal_init ();
1418 target_terminal_inferior ();
1422 stop_after_trap = 1;
1423 wait_for_inferior ();
1424 if (stop_signal != TARGET_SIGNAL_TRAP)
1425 resume (0, stop_signal);
1429 stop_after_trap = 0;
1433 /* Since Windows XP, detaching from a process is supported by Windows.
1434 The following code tries loading the appropriate functions dynamically.
1435 If loading these functions succeeds use them to actually detach from
1436 the inferior process, otherwise behave as usual, pretending that
1437 detach has worked. */
1438 static BOOL WINAPI (*DebugSetProcessKillOnExit)(BOOL);
1439 static BOOL WINAPI (*DebugActiveProcessStop)(DWORD);
1442 has_detach_ability (void)
1444 static HMODULE kernel32 = NULL;
1447 kernel32 = LoadLibrary ("kernel32.dll");
1450 if (!DebugSetProcessKillOnExit)
1451 DebugSetProcessKillOnExit = GetProcAddress (kernel32,
1452 "DebugSetProcessKillOnExit");
1453 if (!DebugActiveProcessStop)
1454 DebugActiveProcessStop = GetProcAddress (kernel32,
1455 "DebugActiveProcessStop");
1456 if (DebugSetProcessKillOnExit && DebugActiveProcessStop)
1462 /* Try to set or remove a user privilege to the current process. Return -1
1463 if that fails, the previous setting of that privilege otherwise.
1465 This code is copied from the Cygwin source code and rearranged to allow
1466 dynamically loading of the needed symbols from advapi32 which is only
1467 available on NT/2K/XP. */
1469 set_process_privilege (const char *privilege, BOOL enable)
1471 static HMODULE advapi32 = NULL;
1472 static BOOL WINAPI (*OpenProcessToken)(HANDLE, DWORD, PHANDLE);
1473 static BOOL WINAPI (*LookupPrivilegeValue)(LPCSTR, LPCSTR, PLUID);
1474 static BOOL WINAPI (*AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES,
1475 DWORD, PTOKEN_PRIVILEGES, PDWORD);
1477 HANDLE token_hdl = NULL;
1479 TOKEN_PRIVILEGES new_priv, orig_priv;
1483 if (GetVersion () >= 0x80000000) /* No security availbale on 9x/Me */
1488 if (!(advapi32 = LoadLibrary ("advapi32.dll")))
1490 if (!OpenProcessToken)
1491 OpenProcessToken = GetProcAddress (advapi32, "OpenProcessToken");
1492 if (!LookupPrivilegeValue)
1493 LookupPrivilegeValue = GetProcAddress (advapi32,
1494 "LookupPrivilegeValueA");
1495 if (!AdjustTokenPrivileges)
1496 AdjustTokenPrivileges = GetProcAddress (advapi32,
1497 "AdjustTokenPrivileges");
1498 if (!OpenProcessToken || !LookupPrivilegeValue || !AdjustTokenPrivileges)
1505 if (!OpenProcessToken (GetCurrentProcess (),
1506 TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1510 if (!LookupPrivilegeValue (NULL, privilege, &restore_priv))
1513 new_priv.PrivilegeCount = 1;
1514 new_priv.Privileges[0].Luid = restore_priv;
1515 new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1517 if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1518 sizeof orig_priv, &orig_priv, &size))
1521 /* Disabled, otherwise every `attach' in an unprivileged user session
1522 would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1524 /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1525 be enabled. GetLastError () returns an correct error code, though. */
1526 if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1530 ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1534 CloseHandle (token_hdl);
1539 /* Attach to process PID, then initialize for debugging it. */
1541 child_attach (char *args, int from_tty)
1547 error_no_arg ("process-id to attach");
1549 if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1551 printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1552 printf_unfiltered ("This can cause attach to fail on Windows NT/2K/XP\n");
1555 pid = strtoul (args, 0, 0); /* Windows pid */
1557 ok = DebugActiveProcess (pid);
1562 /* Try fall back to Cygwin pid */
1563 pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1566 ok = DebugActiveProcess (pid);
1569 error ("Can't attach to process.");
1572 if (has_detach_ability ())
1575 DebugSetProcessKillOnExit (FALSE);
1580 char *exec_file = (char *) get_exec_file (0);
1583 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1584 target_pid_to_str (pid_to_ptid (pid)));
1586 printf_unfiltered ("Attaching to %s\n",
1587 target_pid_to_str (pid_to_ptid (pid)));
1589 gdb_flush (gdb_stdout);
1592 do_initial_child_stuff (pid);
1593 target_terminal_ours ();
1597 child_detach (char *args, int from_tty)
1601 if (has_detach_ability ())
1603 delete_command (NULL, 0);
1604 child_continue (DBG_CONTINUE, -1);
1605 if (!DebugActiveProcessStop (current_event.dwProcessId))
1607 error ("Can't detach process %lu (error %lu)",
1608 current_event.dwProcessId, GetLastError ());
1611 DebugSetProcessKillOnExit (FALSE);
1613 if (detached && from_tty)
1615 char *exec_file = get_exec_file (0);
1618 printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
1619 current_event.dwProcessId);
1620 gdb_flush (gdb_stdout);
1622 inferior_ptid = null_ptid;
1623 unpush_target (&child_ops);
1626 /* Print status information about what we're accessing. */
1629 child_files_info (struct target_ops *ignore)
1631 printf_unfiltered ("\tUsing the running image of %s %s.\n",
1632 attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
1637 child_open (char *arg, int from_tty)
1639 error ("Use the \"run\" command to start a Unix child process.");
1642 /* Start an inferior win32 child process and sets inferior_ptid to its pid.
1643 EXEC_FILE is the file to run.
1644 ALLARGS is a string containing the arguments to the program.
1645 ENV is the environment vector to pass. Errors reported with error(). */
1648 child_create_inferior (char *exec_file, char *allargs, char **env)
1655 PROCESS_INFORMATION pi;
1659 char real_path[MAXPATHLEN];
1661 char shell[MAX_PATH + 1]; /* Path to shell */
1664 int ostdin, ostdout, ostderr;
1667 error ("No executable specified, use `target exec'.\n");
1669 memset (&si, 0, sizeof (si));
1670 si.cb = sizeof (si);
1674 flags = DEBUG_ONLY_THIS_PROCESS;
1675 cygwin_conv_to_win32_path (exec_file, real_path);
1681 sh = getenv ("SHELL");
1684 cygwin_conv_to_win32_path (sh, shell);
1685 newallargs = alloca (sizeof (" -c 'exec '") + strlen (exec_file)
1686 + strlen (allargs) + 2);
1687 sprintf (newallargs, " -c 'exec %s %s'", exec_file, allargs);
1688 allargs = newallargs;
1690 flags = DEBUG_PROCESS;
1694 flags |= CREATE_NEW_PROCESS_GROUP;
1697 flags |= CREATE_NEW_CONSOLE;
1699 args = alloca (strlen (toexec) + strlen (allargs) + 2);
1700 strcpy (args, toexec);
1702 strcat (args, allargs);
1704 /* Prepare the environment vars for CreateProcess. */
1706 /* This code used to assume all env vars were file names and would
1707 translate them all to win32 style. That obviously doesn't work in the
1708 general case. The current rule is that we only translate PATH.
1709 We need to handle PATH because we're about to call CreateProcess and
1710 it uses PATH to find DLL's. Fortunately PATH has a well-defined value
1711 in both posix and win32 environments. cygwin.dll will change it back
1712 to posix style if necessary. */
1714 static const char *conv_path_names[] =
1720 /* CreateProcess takes the environment list as a null terminated set of
1721 strings (i.e. two nulls terminate the list). */
1723 /* Get total size for env strings. */
1724 for (envlen = 0, i = 0; env[i] && *env[i]; i++)
1728 for (j = 0; conv_path_names[j]; j++)
1730 len = strlen (conv_path_names[j]);
1731 if (strncmp (conv_path_names[j], env[i], len) == 0)
1733 if (cygwin_posix_path_list_p (env[i] + len))
1735 + cygwin_posix_to_win32_path_list_buf_size (env[i] + len);
1737 envlen += strlen (env[i]) + 1;
1741 if (conv_path_names[j] == NULL)
1742 envlen += strlen (env[i]) + 1;
1745 winenv = alloca (envlen + 1);
1747 /* Copy env strings into new buffer. */
1748 for (temp = winenv, i = 0; env[i] && *env[i]; i++)
1752 for (j = 0; conv_path_names[j]; j++)
1754 len = strlen (conv_path_names[j]);
1755 if (strncmp (conv_path_names[j], env[i], len) == 0)
1757 if (cygwin_posix_path_list_p (env[i] + len))
1759 memcpy (temp, env[i], len);
1760 cygwin_posix_to_win32_path_list (env[i] + len, temp + len);
1763 strcpy (temp, env[i]);
1767 if (conv_path_names[j] == NULL)
1768 strcpy (temp, env[i]);
1770 temp += strlen (temp) + 1;
1773 /* Final nil string to terminate new env. */
1777 if (!inferior_io_terminal)
1778 tty = ostdin = ostdout = ostderr = -1;
1781 tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
1784 print_sys_errmsg (inferior_io_terminal, errno);
1785 ostdin = ostdout = ostderr = -1;
1798 ret = CreateProcess (0,
1799 args, /* command line */
1800 NULL, /* Security */
1802 TRUE, /* inherit handles */
1803 flags, /* start flags */
1805 NULL, /* current directory */
1820 error ("Error creating process %s, (error %d)\n", exec_file, (unsigned) GetLastError ());
1822 CloseHandle (pi.hThread);
1823 CloseHandle (pi.hProcess);
1825 if (useshell && shell[0] != '\0')
1830 do_initial_child_stuff (pi.dwProcessId);
1832 /* child_continue (DBG_CONTINUE, -1); */
1833 proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0);
1837 child_mourn_inferior (void)
1839 (void) child_continue (DBG_CONTINUE, -1);
1840 i386_cleanup_dregs();
1841 unpush_target (&child_ops);
1842 generic_mourn_inferior ();
1845 /* Send a SIGINT to the process group. This acts just like the user typed a
1846 ^C on the controlling terminal. */
1851 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1852 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1853 registers_changed (); /* refresh register state */
1857 child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
1858 int write, struct mem_attrib *mem,
1859 struct target_ops *target)
1864 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
1865 len, (DWORD) memaddr));
1866 if (!WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
1869 FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
1873 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
1874 len, (DWORD) memaddr));
1875 if (!ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our,
1883 child_kill_inferior (void)
1885 CHECK (TerminateProcess (current_process_handle, 0));
1889 if (!child_continue (DBG_CONTINUE, -1))
1891 if (!WaitForDebugEvent (¤t_event, INFINITE))
1893 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
1897 CHECK (CloseHandle (current_process_handle));
1899 /* this may fail in an attached process so don't check. */
1900 (void) CloseHandle (current_thread->h);
1901 target_mourn_inferior (); /* or just child_mourn_inferior? */
1905 child_resume (ptid_t ptid, int step, enum target_signal sig)
1908 DWORD continue_status = DBG_CONTINUE;
1910 int pid = PIDGET (ptid);
1912 if (sig != TARGET_SIGNAL_0)
1914 if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1916 DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1918 else if (sig == last_sig)
1919 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1922 /* This code does not seem to work, because
1923 the kernel does probably not consider changes in the ExceptionRecord
1924 structure when passing the exception to the inferior.
1925 Note that this seems possible in the exception handler itself. */
1928 for (i = 0; xlate[i].them != -1; i++)
1929 if (xlate[i].us == sig)
1931 current_event.u.Exception.ExceptionRecord.ExceptionCode =
1933 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1936 if (continue_status == DBG_CONTINUE)
1938 DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1942 DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
1946 last_sig = TARGET_SIGNAL_0;
1948 DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
1951 /* Get context for currently selected thread */
1952 th = thread_rec (current_event.dwThreadId, FALSE);
1957 /* Single step by setting t bit */
1958 child_fetch_inferior_registers (PS_REGNUM);
1959 th->context.EFlags |= FLAG_TRACE_BIT;
1962 if (th->context.ContextFlags)
1964 if (debug_registers_changed)
1966 th->context.Dr0 = dr[0];
1967 th->context.Dr1 = dr[1];
1968 th->context.Dr2 = dr[2];
1969 th->context.Dr3 = dr[3];
1970 /* th->context.Dr6 = dr[6];
1971 FIXME: should we set dr6 also ?? */
1972 th->context.Dr7 = dr[7];
1974 CHECK (SetThreadContext (th->h, &th->context));
1975 th->context.ContextFlags = 0;
1979 /* Allow continuing with the same signal that interrupted us.
1980 Otherwise complain. */
1982 child_continue (continue_status, pid);
1986 child_prepare_to_store (void)
1988 /* Do nothing, since we can store individual regs */
1992 child_can_run (void)
2000 DEBUG_EVENTS (("gdb: child_close, inferior_ptid=%d\n",
2001 PIDGET (inferior_ptid)));
2004 struct target_ops child_ops;
2007 init_child_ops (void)
2009 child_ops.to_shortname = "child";
2010 child_ops.to_longname = "Win32 child process";
2011 child_ops.to_doc = "Win32 child process (started by the \"run\" command).";
2012 child_ops.to_open = child_open;
2013 child_ops.to_close = child_close;
2014 child_ops.to_attach = child_attach;
2015 child_ops.to_detach = child_detach;
2016 child_ops.to_resume = child_resume;
2017 child_ops.to_wait = child_wait;
2018 child_ops.to_fetch_registers = child_fetch_inferior_registers;
2019 child_ops.to_store_registers = child_store_inferior_registers;
2020 child_ops.to_prepare_to_store = child_prepare_to_store;
2021 child_ops.to_xfer_memory = child_xfer_memory;
2022 child_ops.to_files_info = child_files_info;
2023 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
2024 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
2025 child_ops.to_terminal_init = terminal_init_inferior;
2026 child_ops.to_terminal_inferior = terminal_inferior;
2027 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2028 child_ops.to_terminal_ours = terminal_ours;
2029 child_ops.to_terminal_save_ours = terminal_save_ours;
2030 child_ops.to_terminal_info = child_terminal_info;
2031 child_ops.to_kill = child_kill_inferior;
2032 child_ops.to_create_inferior = child_create_inferior;
2033 child_ops.to_mourn_inferior = child_mourn_inferior;
2034 child_ops.to_can_run = child_can_run;
2035 child_ops.to_thread_alive = win32_child_thread_alive;
2036 child_ops.to_pid_to_str = cygwin_pid_to_str;
2037 child_ops.to_stop = child_stop;
2038 child_ops.to_stratum = process_stratum;
2039 child_ops.to_has_all_memory = 1;
2040 child_ops.to_has_memory = 1;
2041 child_ops.to_has_stack = 1;
2042 child_ops.to_has_registers = 1;
2043 child_ops.to_has_execution = 1;
2044 child_ops.to_magic = OPS_MAGIC;
2048 _initialize_win32_nat (void)
2050 struct cmd_list_element *c;
2054 c = add_com ("dll-symbols", class_files, dll_symbol_command,
2055 "Load dll library symbols from FILE.");
2056 set_cmd_completer (c, filename_completer);
2058 add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
2060 add_show_from_set (add_set_cmd ("shell", class_support, var_boolean,
2062 "Set use of shell to start subprocess.",
2066 add_show_from_set (add_set_cmd ("new-console", class_support, var_boolean,
2067 (char *) &new_console,
2068 "Set creation of new console when creating child process.",
2072 add_show_from_set (add_set_cmd ("new-group", class_support, var_boolean,
2073 (char *) &new_group,
2074 "Set creation of new group when creating child process.",
2078 add_show_from_set (add_set_cmd ("debugexec", class_support, var_boolean,
2079 (char *) &debug_exec,
2080 "Set whether to display execution in child process.",
2084 add_show_from_set (add_set_cmd ("debugevents", class_support, var_boolean,
2085 (char *) &debug_events,
2086 "Set whether to display kernel events in child process.",
2090 add_show_from_set (add_set_cmd ("debugmemory", class_support, var_boolean,
2091 (char *) &debug_memory,
2092 "Set whether to display memory accesses in child process.",
2096 add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean,
2097 (char *) &debug_exceptions,
2098 "Set whether to display kernel exceptions in child process.",
2102 add_info ("dll", info_dll_command, "Status of loaded DLLs.");
2103 add_info_alias ("sharedlibrary", "dll", 1);
2105 add_prefix_cmd ("w32", class_info, info_w32_command,
2106 "Print information specific to Win32 debugging.",
2107 &info_w32_cmdlist, "info w32 ", 0, &infolist);
2109 add_cmd ("selector", class_info, display_selectors,
2110 "Display selectors infos.",
2113 add_target (&child_ops);
2116 /* Hardware watchpoint support, adapted from go32-nat.c code. */
2118 /* Pass the address ADDR to the inferior in the I'th debug register.
2119 Here we just store the address in dr array, the registers will be
2120 actually set up when child_continue is called. */
2122 cygwin_set_dr (int i, CORE_ADDR addr)
2125 internal_error (__FILE__, __LINE__,
2126 "Invalid register %d in cygwin_set_dr.\n", i);
2127 dr[i] = (unsigned) addr;
2128 debug_registers_changed = 1;
2129 debug_registers_used = 1;
2132 /* Pass the value VAL to the inferior in the DR7 debug control
2133 register. Here we just store the address in D_REGS, the watchpoint
2134 will be actually set up in child_wait. */
2136 cygwin_set_dr7 (unsigned val)
2139 debug_registers_changed = 1;
2140 debug_registers_used = 1;
2143 /* Get the value of the DR6 debug status register from the inferior.
2144 Here we just return the value stored in dr[6]
2145 by the last call to thread_rec for current_event.dwThreadId id. */
2147 cygwin_get_dr6 (void)
2153 /* Determine if the thread referenced by "pid" is alive
2154 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
2155 it means that the pid has died. Otherwise it is assumed to be alive. */
2157 win32_child_thread_alive (ptid_t ptid)
2159 int pid = PIDGET (ptid);
2161 return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
2165 /* Convert pid to printable format. */
2167 cygwin_pid_to_str (ptid_t ptid)
2169 static char buf[80];
2170 int pid = PIDGET (ptid);
2172 if ((DWORD) pid == current_event.dwProcessId)
2173 sprintf (buf, "process %d", pid);
2175 sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
2180 core_dll_symbols_add (char *dll_name, DWORD base_addr)
2182 struct objfile *objfile;
2183 char *objfile_basename;
2184 const char *dll_basename;
2186 if (!(dll_basename = strrchr (dll_name, '/')))
2187 dll_basename = dll_name;
2191 ALL_OBJFILES (objfile)
2193 objfile_basename = strrchr (objfile->name, '/');
2195 if (objfile_basename &&
2196 strcmp (dll_basename, objfile_basename + 1) == 0)
2198 printf_unfiltered ("%08lx:%s (symbols previously loaded)\n",
2199 base_addr, dll_name);
2204 register_loaded_dll (dll_name, base_addr + 0x1000);
2205 solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
2213 struct target_ops *target;
2216 map_code_section_args;
2219 map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
2223 struct section_table *new_target_sect_ptr;
2225 map_code_section_args *args = (map_code_section_args *) obj;
2226 struct target_ops *target = args->target;
2227 if (sect->flags & SEC_CODE)
2229 update_coreops = core_ops.to_sections == target->to_sections;
2231 if (target->to_sections)
2233 old = target->to_sections_end - target->to_sections;
2234 target->to_sections = (struct section_table *)
2235 xrealloc ((char *) target->to_sections,
2236 (sizeof (struct section_table)) * (1 + old));
2241 target->to_sections = (struct section_table *)
2242 xmalloc ((sizeof (struct section_table)));
2244 target->to_sections_end = target->to_sections + (1 + old);
2246 /* Update the to_sections field in the core_ops structure
2250 core_ops.to_sections = target->to_sections;
2251 core_ops.to_sections_end = target->to_sections_end;
2253 new_target_sect_ptr = target->to_sections + old;
2254 new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
2255 new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
2256 bfd_section_size (abfd, sect);;
2257 new_target_sect_ptr->the_bfd_section = sect;
2258 new_target_sect_ptr->bfd = abfd;
2263 dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
2266 map_code_section_args map_args;
2267 asection *lowest_sect;
2269 if (dll_name == NULL || target == NULL)
2271 name = xstrdup (dll_name);
2272 dll_bfd = bfd_openr (name, "pei-i386");
2273 if (dll_bfd == NULL)
2276 if (bfd_check_format (dll_bfd, bfd_object))
2278 lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
2279 if (lowest_sect == NULL)
2281 map_args.target = target;
2282 map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
2284 bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (void *) (&map_args));
2291 core_section_load_dll_symbols (bfd * abfd, asection * sect, void *obj)
2293 struct target_ops *target = (struct target_ops *) obj;
2298 char *dll_name = NULL;
2300 struct win32_pstatus *pstatus;
2303 if (strncmp (sect->name, ".module", 7))
2306 buf = (char *) xmalloc (sect->_raw_size + 1);
2309 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
2312 if (!bfd_get_section_contents (abfd, sect, buf, 0, sect->_raw_size))
2315 pstatus = (struct win32_pstatus *) buf;
2317 memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
2318 dll_name_size = pstatus->data.module_info.module_name_size;
2319 if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > sect->_raw_size)
2322 dll_name = (char *) xmalloc (dll_name_size + 1);
2325 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
2328 strncpy (dll_name, pstatus->data.module_info.module_name, dll_name_size);
2330 while ((p = strchr (dll_name, '\\')))
2333 if (!core_dll_symbols_add (dll_name, (DWORD) base_addr))
2334 printf_unfiltered ("%s: Failed to load dll symbols.\n", dll_name);
2336 if (!dll_code_sections_add (dll_name, (DWORD) base_addr + 0x1000, target))
2337 printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
2348 child_solib_add (char *filename, int from_tty, struct target_ops *target,
2355 child_clear_solibs ();
2356 bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols, target);
2360 if (solib_end && solib_end->name)
2361 solib_end->objfile = solib_symbols_add (solib_end->name, from_tty,
2362 solib_end->load_addr);
2367 fetch_elf_core_registers (char *core_reg_sect,
2368 unsigned core_reg_size,
2373 if (core_reg_size < sizeof (CONTEXT))
2375 error ("Core file register section too small (%u bytes).", core_reg_size);
2378 for (r = 0; r < NUM_REGS; r++)
2379 supply_register (r, core_reg_sect + mappings[r]);
2382 static struct core_fns win32_elf_core_fns =
2384 bfd_target_elf_flavour,
2385 default_check_format,
2386 default_core_sniffer,
2387 fetch_elf_core_registers,
2392 _initialize_core_win32 (void)
2394 add_core_fns (&win32_elf_core_fns);
2398 _initialize_check_for_gdb_ini (void)
2401 if (inhibit_gdbinit)
2404 homedir = getenv ("HOME");
2408 char *oldini = (char *) alloca (strlen (homedir) +
2409 sizeof ("/gdb.ini"));
2410 strcpy (oldini, homedir);
2411 p = strchr (oldini, '\0');
2412 if (p > oldini && p[-1] != '/')
2414 strcpy (p, "gdb.ini");
2415 if (access (oldini, 0) == 0)
2417 int len = strlen (oldini);
2418 char *newini = alloca (len + 1);
2419 sprintf (newini, "%.*s.gdbinit",
2420 (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2421 warning ("obsolete '%s' found. Rename to '%s'.", oldini, newini);