* win32-nat.c (ctrl_c_handler): New function.
[deliverable/binutils-gdb.git] / gdb / windows-nat.c
1 /* Target-vector operations for controlling windows child processes, for GDB.
2
3 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
5
6 Contributed by Cygnus Solutions, A Red Hat Company.
7
8 This file is part of GDB.
9
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 3 of the License, or
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
22
23 /* Originally by Steve Chamberlain, sac@cygnus.com */
24
25 #include "defs.h"
26 #include "frame.h" /* required by inferior.h */
27 #include "inferior.h"
28 #include "target.h"
29 #include "exceptions.h"
30 #include "gdbcore.h"
31 #include "command.h"
32 #include "completer.h"
33 #include "regcache.h"
34 #include "top.h"
35 #include <signal.h>
36 #include <sys/types.h>
37 #include <fcntl.h>
38 #include <stdlib.h>
39 #include <windows.h>
40 #include <imagehlp.h>
41 #include <psapi.h>
42 #ifdef __CYGWIN__
43 #include <sys/cygwin.h>
44 #endif
45 #include <signal.h>
46
47 #include "buildsym.h"
48 #include "symfile.h"
49 #include "objfiles.h"
50 #include "gdb_obstack.h"
51 #include "gdb_string.h"
52 #include "gdbthread.h"
53 #include "gdbcmd.h"
54 #include <sys/param.h>
55 #include <unistd.h>
56 #include "exec.h"
57 #include "solist.h"
58 #include "solib.h"
59 #include "xml-support.h"
60
61 #include "i386-tdep.h"
62 #include "i387-tdep.h"
63
64 #include "windows-tdep.h"
65 #include "windows-nat.h"
66
67 #define DebugActiveProcessStop dyn_DebugActiveProcessStop
68 #define DebugBreakProcess dyn_DebugBreakProcess
69 #define DebugSetProcessKillOnExit dyn_DebugSetProcessKillOnExit
70 #define EnumProcessModules dyn_EnumProcessModules
71 #define GetModuleFileNameExA dyn_GetModuleFileNameExA
72 #define GetModuleInformation dyn_GetModuleInformation
73
74 /* Since Windows XP, detaching from a process is supported by Windows.
75 The following code tries loading the appropriate functions dynamically.
76 If loading these functions succeeds use them to actually detach from
77 the inferior process, otherwise behave as usual, pretending that
78 detach has worked. */
79 static BOOL WINAPI (*DebugActiveProcessStop) (DWORD);
80 static BOOL WINAPI (*DebugBreakProcess) (HANDLE);
81 static BOOL WINAPI (*DebugSetProcessKillOnExit) (BOOL);
82 static BOOL WINAPI (*EnumProcessModules) (HANDLE, HMODULE *, DWORD,
83 LPDWORD);
84 static DWORD WINAPI (*GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR,
85 DWORD);
86 static BOOL WINAPI (*GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO,
87 DWORD);
88
89 static struct target_ops windows_ops;
90
91 #ifdef __CYGWIN__
92 /* The starting and ending address of the cygwin1.dll text segment. */
93 static CORE_ADDR cygwin_load_start;
94 static CORE_ADDR cygwin_load_end;
95 #endif
96
97 static int have_saved_context; /* True if we've saved context from a cygwin signal. */
98 static CONTEXT saved_context; /* Containes the saved context from a cygwin signal. */
99
100 /* If we're not using the old Cygwin header file set, define the
101 following which never should have been in the generic Win32 API
102 headers in the first place since they were our own invention... */
103 #ifndef _GNU_H_WINDOWS_H
104 enum
105 {
106 FLAG_TRACE_BIT = 0x100,
107 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
108 };
109 #endif
110
111 #ifndef CONTEXT_EXTENDED_REGISTERS
112 /* This macro is only defined on ia32. It only makes sense on this target,
113 so define it as zero if not already defined. */
114 #define CONTEXT_EXTENDED_REGISTERS 0
115 #endif
116
117 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
118 | CONTEXT_EXTENDED_REGISTERS
119
120 static uintptr_t dr[8];
121 static int debug_registers_changed;
122 static int debug_registers_used;
123 #define DR6_CLEAR_VALUE 0xffff0ff0
124
125 /* The string sent by cygwin when it processes a signal.
126 FIXME: This should be in a cygwin include file. */
127 #ifndef _CYGWIN_SIGNAL_STRING
128 #define _CYGWIN_SIGNAL_STRING "cYgSiGw00f"
129 #endif
130
131 #define CHECK(x) check (x, __FILE__,__LINE__)
132 #define DEBUG_EXEC(x) if (debug_exec) printf_unfiltered x
133 #define DEBUG_EVENTS(x) if (debug_events) printf_unfiltered x
134 #define DEBUG_MEM(x) if (debug_memory) printf_unfiltered x
135 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf_unfiltered x
136
137 static void windows_stop (ptid_t);
138 static int windows_thread_alive (struct target_ops *, ptid_t);
139 static void windows_kill_inferior (struct target_ops *);
140
141 static enum target_signal last_sig = TARGET_SIGNAL_0;
142 /* Set if a signal was received from the debugged process */
143
144 /* Thread information structure used to track information that is
145 not available in gdb's thread structure. */
146 typedef struct thread_info_struct
147 {
148 struct thread_info_struct *next;
149 DWORD id;
150 HANDLE h;
151 char *name;
152 int suspended;
153 int reload_context;
154 CONTEXT context;
155 STACKFRAME sf;
156 }
157 thread_info;
158
159 static thread_info thread_head;
160
161 /* The process and thread handles for the above context. */
162
163 static DEBUG_EVENT current_event; /* The current debug event from
164 WaitForDebugEvent */
165 static HANDLE current_process_handle; /* Currently executing process */
166 static thread_info *current_thread; /* Info on currently selected thread */
167 static DWORD main_thread_id; /* Thread ID of the main thread */
168
169 /* Counts of things. */
170 static int exception_count = 0;
171 static int event_count = 0;
172 static int saw_create;
173 static int open_process_used = 0;
174
175 /* User options. */
176 static int new_console = 0;
177 #ifdef __CYGWIN__
178 static int cygwin_exceptions = 0;
179 #endif
180 static int new_group = 1;
181 static int debug_exec = 0; /* show execution */
182 static int debug_events = 0; /* show events from kernel */
183 static int debug_memory = 0; /* show target memory accesses */
184 static int debug_exceptions = 0; /* show target exceptions */
185 static int useshell = 0; /* use shell for subprocesses */
186
187 /* This vector maps GDB's idea of a register's number into an offset
188 in the windows exception context vector.
189
190 It also contains the bit mask needed to load the register in question.
191
192 The contents of this table can only be computed by the units
193 that provide CPU-specific support for Windows native debugging.
194 These units should set the table by calling
195 windows_set_context_register_offsets.
196
197 One day we could read a reg, we could inspect the context we
198 already have loaded, if it doesn't have the bit set that we need,
199 we read that set of registers in using GetThreadContext. If the
200 context already contains what we need, we just unpack it. Then to
201 write a register, first we have to ensure that the context contains
202 the other regs of the group, and then we copy the info in and set
203 out bit. */
204
205 static const int *mappings;
206
207 /* This vector maps the target's idea of an exception (extracted
208 from the DEBUG_EVENT structure) to GDB's idea. */
209
210 struct xlate_exception
211 {
212 int them;
213 enum target_signal us;
214 };
215
216 static const struct xlate_exception
217 xlate[] =
218 {
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},
225 {-1, -1}};
226
227 /* Set the MAPPINGS static global to OFFSETS.
228 See the description of MAPPINGS for more details. */
229
230 void
231 windows_set_context_register_offsets (const int *offsets)
232 {
233 mappings = offsets;
234 }
235
236 static void
237 check (BOOL ok, const char *file, int line)
238 {
239 if (!ok)
240 printf_filtered ("error return %s:%d was %lu\n", file, line,
241 GetLastError ());
242 }
243
244 /* Find a thread record given a thread id. If GET_CONTEXT is not 0,
245 then also retrieve the context for this thread. If GET_CONTEXT is
246 negative, then don't suspend the thread. */
247 static thread_info *
248 thread_rec (DWORD id, int get_context)
249 {
250 thread_info *th;
251
252 for (th = &thread_head; (th = th->next) != NULL;)
253 if (th->id == id)
254 {
255 if (!th->suspended && get_context)
256 {
257 if (get_context > 0 && id != current_event.dwThreadId)
258 {
259 if (SuspendThread (th->h) == (DWORD) -1)
260 {
261 DWORD err = GetLastError ();
262 warning (_("SuspendThread failed. (winerr %d)"),
263 (int) err);
264 return NULL;
265 }
266 th->suspended = 1;
267 }
268 else if (get_context < 0)
269 th->suspended = -1;
270 th->reload_context = 1;
271 }
272 return th;
273 }
274
275 return NULL;
276 }
277
278 /* Add a thread to the thread list. */
279 static thread_info *
280 windows_add_thread (ptid_t ptid, HANDLE h)
281 {
282 thread_info *th;
283 DWORD id;
284
285 gdb_assert (ptid_get_tid (ptid) != 0);
286
287 id = ptid_get_tid (ptid);
288
289 if ((th = thread_rec (id, FALSE)))
290 return th;
291
292 th = XZALLOC (thread_info);
293 th->id = id;
294 th->h = h;
295 th->next = thread_head.next;
296 thread_head.next = th;
297 add_thread (ptid);
298 /* Set the debug registers for the new thread if they are used. */
299 if (debug_registers_used)
300 {
301 /* Only change the value of the debug registers. */
302 th->context.ContextFlags = CONTEXT_DEBUG_REGISTERS;
303 CHECK (GetThreadContext (th->h, &th->context));
304 th->context.Dr0 = dr[0];
305 th->context.Dr1 = dr[1];
306 th->context.Dr2 = dr[2];
307 th->context.Dr3 = dr[3];
308 th->context.Dr6 = DR6_CLEAR_VALUE;
309 th->context.Dr7 = dr[7];
310 CHECK (SetThreadContext (th->h, &th->context));
311 th->context.ContextFlags = 0;
312 }
313 return th;
314 }
315
316 /* Clear out any old thread list and reintialize it to a
317 pristine state. */
318 static void
319 windows_init_thread_list (void)
320 {
321 thread_info *th = &thread_head;
322
323 DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
324 init_thread_list ();
325 while (th->next != NULL)
326 {
327 thread_info *here = th->next;
328 th->next = here->next;
329 xfree (here);
330 }
331 thread_head.next = NULL;
332 }
333
334 /* Delete a thread from the list of threads */
335 static void
336 windows_delete_thread (ptid_t ptid)
337 {
338 thread_info *th;
339 DWORD id;
340
341 gdb_assert (ptid_get_tid (ptid) != 0);
342
343 id = ptid_get_tid (ptid);
344
345 if (info_verbose)
346 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (ptid));
347 delete_thread (ptid);
348
349 for (th = &thread_head;
350 th->next != NULL && th->next->id != id;
351 th = th->next)
352 continue;
353
354 if (th->next != NULL)
355 {
356 thread_info *here = th->next;
357 th->next = here->next;
358 xfree (here);
359 }
360 }
361
362 static void
363 do_windows_fetch_inferior_registers (struct regcache *regcache, int r)
364 {
365 char *context_offset = ((char *) &current_thread->context) + mappings[r];
366 struct gdbarch *gdbarch = get_regcache_arch (regcache);
367 struct gdbarch_tdep *tdep = gdbarch_tdep (gdbarch);
368 long l;
369
370 if (!current_thread)
371 return; /* Windows sometimes uses a non-existent thread id in its
372 events */
373
374 if (current_thread->reload_context)
375 {
376 #ifdef __COPY_CONTEXT_SIZE
377 if (have_saved_context)
378 {
379 /* Lie about where the program actually is stopped since cygwin has informed us that
380 we should consider the signal to have occurred at another location which is stored
381 in "saved_context. */
382 memcpy (&current_thread->context, &saved_context, __COPY_CONTEXT_SIZE);
383 have_saved_context = 0;
384 }
385 else
386 #endif
387 {
388 thread_info *th = current_thread;
389 th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
390 GetThreadContext (th->h, &th->context);
391 /* Copy dr values from that thread.
392 But only if there were not modified since last stop. PR gdb/2388 */
393 if (!debug_registers_changed)
394 {
395 dr[0] = th->context.Dr0;
396 dr[1] = th->context.Dr1;
397 dr[2] = th->context.Dr2;
398 dr[3] = th->context.Dr3;
399 dr[6] = th->context.Dr6;
400 dr[7] = th->context.Dr7;
401 }
402 }
403 current_thread->reload_context = 0;
404 }
405
406 if (r == I387_FISEG_REGNUM (tdep))
407 {
408 l = *((long *) context_offset) & 0xffff;
409 regcache_raw_supply (regcache, r, (char *) &l);
410 }
411 else if (r == I387_FOP_REGNUM (tdep))
412 {
413 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
414 regcache_raw_supply (regcache, r, (char *) &l);
415 }
416 else if (r >= 0)
417 regcache_raw_supply (regcache, r, context_offset);
418 else
419 {
420 for (r = 0; r < gdbarch_num_regs (gdbarch); r++)
421 do_windows_fetch_inferior_registers (regcache, r);
422 }
423 }
424
425 static void
426 windows_fetch_inferior_registers (struct target_ops *ops,
427 struct regcache *regcache, int r)
428 {
429 current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
430 /* Check if current_thread exists. Windows sometimes uses a non-existent
431 thread id in its events */
432 if (current_thread)
433 do_windows_fetch_inferior_registers (regcache, r);
434 }
435
436 static void
437 do_windows_store_inferior_registers (const struct regcache *regcache, int r)
438 {
439 if (!current_thread)
440 /* Windows sometimes uses a non-existent thread id in its events */;
441 else if (r >= 0)
442 regcache_raw_collect (regcache, r,
443 ((char *) &current_thread->context) + mappings[r]);
444 else
445 {
446 for (r = 0; r < gdbarch_num_regs (get_regcache_arch (regcache)); r++)
447 do_windows_store_inferior_registers (regcache, r);
448 }
449 }
450
451 /* Store a new register value into the current thread context */
452 static void
453 windows_store_inferior_registers (struct target_ops *ops,
454 struct regcache *regcache, int r)
455 {
456 current_thread = thread_rec (ptid_get_tid (inferior_ptid), TRUE);
457 /* Check if current_thread exists. Windows sometimes uses a non-existent
458 thread id in its events */
459 if (current_thread)
460 do_windows_store_inferior_registers (regcache, r);
461 }
462
463 /* Get the name of a given module at at given base address. If base_address
464 is zero return the first loaded module (which is always the name of the
465 executable). */
466 static int
467 get_module_name (LPVOID base_address, char *dll_name_ret)
468 {
469 DWORD len;
470 MODULEINFO mi;
471 int i;
472 HMODULE dh_buf[1];
473 HMODULE *DllHandle = dh_buf; /* Set to temporary storage for initial query */
474 DWORD cbNeeded;
475 #ifdef __CYGWIN__
476 char pathbuf[PATH_MAX + 1]; /* Temporary storage prior to converting to
477 posix form */
478 #else
479 char *pathbuf = dll_name_ret; /* Just copy directly to passed-in arg */
480 #endif
481
482 cbNeeded = 0;
483 /* Find size of buffer needed to handle list of modules loaded in inferior */
484 if (!EnumProcessModules (current_process_handle, DllHandle,
485 sizeof (HMODULE), &cbNeeded) || !cbNeeded)
486 goto failed;
487
488 /* Allocate correct amount of space for module list */
489 DllHandle = (HMODULE *) alloca (cbNeeded);
490 if (!DllHandle)
491 goto failed;
492
493 /* Get the list of modules */
494 if (!EnumProcessModules (current_process_handle, DllHandle, cbNeeded,
495 &cbNeeded))
496 goto failed;
497
498 for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
499 {
500 /* Get information on this module */
501 if (!GetModuleInformation (current_process_handle, DllHandle[i],
502 &mi, sizeof (mi)))
503 error (_("Can't get module info"));
504
505 if (!base_address || mi.lpBaseOfDll == base_address)
506 {
507 /* Try to find the name of the given module */
508 len = GetModuleFileNameExA (current_process_handle,
509 DllHandle[i], pathbuf, MAX_PATH);
510 if (len == 0)
511 error (_("Error getting dll name: %u."), (unsigned) GetLastError ());
512 #ifdef __CYGWIN__
513 /* Cygwin prefers that the path be in /x/y/z format */
514 cygwin_conv_to_full_posix_path (pathbuf, dll_name_ret);
515 #endif
516 return 1; /* success */
517 }
518 }
519
520 failed:
521 dll_name_ret[0] = '\0';
522 return 0; /* failure */
523 }
524
525 /* Encapsulate the information required in a call to
526 symbol_file_add_args */
527 struct safe_symbol_file_add_args
528 {
529 char *name;
530 int from_tty;
531 struct section_addr_info *addrs;
532 int mainline;
533 int flags;
534 struct ui_file *err, *out;
535 struct objfile *ret;
536 };
537
538 /* Maintain a linked list of "so" information. */
539 struct lm_info
540 {
541 LPVOID load_addr;
542 };
543
544 static struct so_list solib_start, *solib_end;
545
546 /* Call symbol_file_add with stderr redirected. We don't care if there
547 are errors. */
548 static int
549 safe_symbol_file_add_stub (void *argv)
550 {
551 #define p ((struct safe_symbol_file_add_args *) argv)
552 p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
553 return !!p->ret;
554 #undef p
555 }
556
557 /* Restore gdb's stderr after calling symbol_file_add */
558 static void
559 safe_symbol_file_add_cleanup (void *p)
560 {
561 #define sp ((struct safe_symbol_file_add_args *)p)
562 gdb_flush (gdb_stderr);
563 gdb_flush (gdb_stdout);
564 ui_file_delete (gdb_stderr);
565 ui_file_delete (gdb_stdout);
566 gdb_stderr = sp->err;
567 gdb_stdout = sp->out;
568 #undef sp
569 }
570
571 /* symbol_file_add wrapper that prevents errors from being displayed. */
572 static struct objfile *
573 safe_symbol_file_add (char *name, int from_tty,
574 struct section_addr_info *addrs,
575 int mainline, int flags)
576 {
577 struct safe_symbol_file_add_args p;
578 struct cleanup *cleanup;
579
580 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
581
582 p.err = gdb_stderr;
583 p.out = gdb_stdout;
584 gdb_flush (gdb_stderr);
585 gdb_flush (gdb_stdout);
586 gdb_stderr = ui_file_new ();
587 gdb_stdout = ui_file_new ();
588 p.name = name;
589 p.from_tty = from_tty;
590 p.addrs = addrs;
591 p.mainline = mainline;
592 p.flags = flags;
593 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
594
595 do_cleanups (cleanup);
596 return p.ret;
597 }
598
599 static struct so_list *
600 windows_make_so (const char *name, LPVOID load_addr)
601 {
602 struct so_list *so;
603 char buf[MAX_PATH + 1];
604 char cwd[MAX_PATH + 1];
605 char *p;
606 WIN32_FIND_DATA w32_fd;
607 HANDLE h = FindFirstFile(name, &w32_fd);
608 MEMORY_BASIC_INFORMATION m;
609
610 if (h == INVALID_HANDLE_VALUE)
611 strcpy (buf, name);
612 else
613 {
614 FindClose (h);
615 strcpy (buf, name);
616 if (GetCurrentDirectory (MAX_PATH + 1, cwd))
617 {
618 p = strrchr (buf, '\\');
619 if (p)
620 p[1] = '\0';
621 SetCurrentDirectory (buf);
622 GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
623 SetCurrentDirectory (cwd);
624 }
625 }
626
627 if (strcasecmp (buf, "ntdll.dll") == 0)
628 {
629 GetSystemDirectory (buf, sizeof (buf));
630 strcat (buf, "\\ntdll.dll");
631 }
632 so = XZALLOC (struct so_list);
633 so->lm_info = (struct lm_info *) xmalloc (sizeof (struct lm_info));
634 so->lm_info->load_addr = load_addr;
635 strcpy (so->so_original_name, name);
636 #ifndef __CYGWIN__
637 strcpy (so->so_name, buf);
638 #else
639 cygwin_conv_to_posix_path (buf, so->so_name);
640 /* Record cygwin1.dll .text start/end. */
641 p = strchr (so->so_name, '\0') - (sizeof ("/cygwin1.dll") - 1);
642 if (p >= so->so_name && strcasecmp (p, "/cygwin1.dll") == 0)
643 {
644 bfd *abfd;
645 asection *text = NULL;
646 CORE_ADDR text_vma;
647
648 abfd = bfd_openr (so->so_name, "pei-i386");
649
650 if (!abfd)
651 return so;
652
653 if (bfd_check_format (abfd, bfd_object))
654 text = bfd_get_section_by_name (abfd, ".text");
655
656 if (!text)
657 {
658 bfd_close (abfd);
659 return so;
660 }
661
662 /* The symbols in a dll are offset by 0x1000, which is the the
663 offset from 0 of the first byte in an image - because of the
664 file header and the section alignment. */
665 cygwin_load_start = (CORE_ADDR) (uintptr_t) ((char *) load_addr + 0x1000);
666 cygwin_load_end = cygwin_load_start + bfd_section_size (abfd, text);
667
668 bfd_close (abfd);
669 }
670 #endif
671
672 return so;
673 }
674
675 static char *
676 get_image_name (HANDLE h, void *address, int unicode)
677 {
678 static char buf[(2 * MAX_PATH) + 1];
679 DWORD size = unicode ? sizeof (WCHAR) : sizeof (char);
680 char *address_ptr;
681 int len = 0;
682 char b[2];
683 SIZE_T done;
684
685 /* Attempt to read the name of the dll that was detected.
686 This is documented to work only when actively debugging
687 a program. It will not work for attached processes. */
688 if (address == NULL)
689 return NULL;
690
691 /* See if we could read the address of a string, and that the
692 address isn't null. */
693 if (!ReadProcessMemory (h, address, &address_ptr, sizeof (address_ptr), &done)
694 || done != sizeof (address_ptr) || !address_ptr)
695 return NULL;
696
697 /* Find the length of the string */
698 while (ReadProcessMemory (h, address_ptr + len++ * size, &b, size, &done)
699 && (b[0] != 0 || b[size - 1] != 0) && done == size)
700 continue;
701
702 if (!unicode)
703 ReadProcessMemory (h, address_ptr, buf, len, &done);
704 else
705 {
706 WCHAR *unicode_address = (WCHAR *) alloca (len * sizeof (WCHAR));
707 ReadProcessMemory (h, address_ptr, unicode_address, len * sizeof (WCHAR),
708 &done);
709
710 WideCharToMultiByte (CP_ACP, 0, unicode_address, len, buf, len, 0, 0);
711 }
712
713 return buf;
714 }
715
716 /* Wait for child to do something. Return pid of child, or -1 in case
717 of error; store status through argument pointer OURSTATUS. */
718 static int
719 handle_load_dll (void *dummy)
720 {
721 LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
722 char dll_buf[MAX_PATH + 1];
723 char *dll_name = NULL;
724
725 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
726
727 if (!get_module_name (event->lpBaseOfDll, dll_buf))
728 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
729
730 dll_name = dll_buf;
731
732 if (*dll_name == '\0')
733 dll_name = get_image_name (current_process_handle,
734 event->lpImageName, event->fUnicode);
735 if (!dll_name)
736 return 1;
737
738 solib_end->next = windows_make_so (dll_name, event->lpBaseOfDll);
739 solib_end = solib_end->next;
740
741 DEBUG_EVENTS (("gdb: Loading dll \"%s\" at %p.\n", solib_end->so_name,
742 solib_end->lm_info->load_addr));
743
744 return 1;
745 }
746
747 static void
748 windows_free_so (struct so_list *so)
749 {
750 if (so->lm_info)
751 xfree (so->lm_info);
752 xfree (so);
753 }
754
755 static int
756 handle_unload_dll (void *dummy)
757 {
758 LPVOID lpBaseOfDll = current_event.u.UnloadDll.lpBaseOfDll;
759 struct so_list *so;
760
761 for (so = &solib_start; so->next != NULL; so = so->next)
762 if (so->next->lm_info->load_addr == lpBaseOfDll)
763 {
764 struct so_list *sodel = so->next;
765 so->next = sodel->next;
766 if (!so->next)
767 solib_end = so;
768 DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel->so_name));
769
770 windows_free_so (sodel);
771 solib_add (NULL, 0, NULL, auto_solib_add);
772 return 1;
773 }
774
775 error (_("Error: dll starting at %p not found."), lpBaseOfDll);
776
777 return 0;
778 }
779
780 /* Clear list of loaded DLLs. */
781 static void
782 windows_clear_solib (void)
783 {
784 solib_start.next = NULL;
785 solib_end = &solib_start;
786 }
787
788 /* Load DLL symbol info. */
789 void
790 dll_symbol_command (char *args, int from_tty)
791 {
792 int n;
793 dont_repeat ();
794
795 if (args == NULL)
796 error (_("dll-symbols requires a file name"));
797
798 n = strlen (args);
799 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
800 {
801 char *newargs = (char *) alloca (n + 4 + 1);
802 strcpy (newargs, args);
803 strcat (newargs, ".dll");
804 args = newargs;
805 }
806
807 safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
808 }
809
810 /* Handle DEBUG_STRING output from child process.
811 Cygwin prepends its messages with a "cygwin:". Interpret this as
812 a Cygwin signal. Otherwise just print the string as a warning. */
813 static int
814 handle_output_debug_string (struct target_waitstatus *ourstatus)
815 {
816 char *s = NULL;
817 int retval = 0;
818
819 if (!target_read_string
820 ((CORE_ADDR) (uintptr_t) current_event.u.DebugString.lpDebugStringData,
821 &s, 1024, 0)
822 || !s || !*s)
823 /* nothing to do */;
824 else if (strncmp (s, _CYGWIN_SIGNAL_STRING, sizeof (_CYGWIN_SIGNAL_STRING) - 1) != 0)
825 {
826 #ifdef __CYGWIN__
827 if (strncmp (s, "cYg", 3) != 0)
828 #endif
829 warning (("%s"), s);
830 }
831 #ifdef __COPY_CONTEXT_SIZE
832 else
833 {
834 /* Got a cygwin signal marker. A cygwin signal is followed by the signal number
835 itself and then optionally followed by the thread id and address to saved context
836 within the DLL. If these are supplied, then the given thread is assumed to have
837 issued the signal and the context from the thread is assumed to be stored at the
838 given address in the inferior. Tell gdb to treat this like a real signal. */
839 char *p;
840 int sig = strtol (s + sizeof (_CYGWIN_SIGNAL_STRING) - 1, &p, 0);
841 int gotasig = target_signal_from_host (sig);
842 ourstatus->value.sig = gotasig;
843 if (gotasig)
844 {
845 LPCVOID x;
846 DWORD n;
847 ourstatus->kind = TARGET_WAITKIND_STOPPED;
848 retval = strtoul (p, &p, 0);
849 if (!retval)
850 retval = main_thread_id;
851 else if ((x = (LPCVOID) strtoul (p, &p, 0))
852 && ReadProcessMemory (current_process_handle, x,
853 &saved_context, __COPY_CONTEXT_SIZE, &n)
854 && n == __COPY_CONTEXT_SIZE)
855 have_saved_context = 1;
856 current_event.dwThreadId = retval;
857 }
858 }
859 #endif
860
861 if (s)
862 xfree (s);
863 return retval;
864 }
865
866 static int
867 display_selector (HANDLE thread, DWORD sel)
868 {
869 LDT_ENTRY info;
870 if (GetThreadSelectorEntry (thread, sel, &info))
871 {
872 int base, limit;
873 printf_filtered ("0x%03lx: ", sel);
874 if (!info.HighWord.Bits.Pres)
875 {
876 puts_filtered ("Segment not present\n");
877 return 0;
878 }
879 base = (info.HighWord.Bits.BaseHi << 24) +
880 (info.HighWord.Bits.BaseMid << 16)
881 + info.BaseLow;
882 limit = (info.HighWord.Bits.LimitHi << 16) + info.LimitLow;
883 if (info.HighWord.Bits.Granularity)
884 limit = (limit << 12) | 0xfff;
885 printf_filtered ("base=0x%08x limit=0x%08x", base, limit);
886 if (info.HighWord.Bits.Default_Big)
887 puts_filtered(" 32-bit ");
888 else
889 puts_filtered(" 16-bit ");
890 switch ((info.HighWord.Bits.Type & 0xf) >> 1)
891 {
892 case 0:
893 puts_filtered ("Data (Read-Only, Exp-up");
894 break;
895 case 1:
896 puts_filtered ("Data (Read/Write, Exp-up");
897 break;
898 case 2:
899 puts_filtered ("Unused segment (");
900 break;
901 case 3:
902 puts_filtered ("Data (Read/Write, Exp-down");
903 break;
904 case 4:
905 puts_filtered ("Code (Exec-Only, N.Conf");
906 break;
907 case 5:
908 puts_filtered ("Code (Exec/Read, N.Conf");
909 break;
910 case 6:
911 puts_filtered ("Code (Exec-Only, Conf");
912 break;
913 case 7:
914 puts_filtered ("Code (Exec/Read, Conf");
915 break;
916 default:
917 printf_filtered ("Unknown type 0x%x",info.HighWord.Bits.Type);
918 }
919 if ((info.HighWord.Bits.Type & 0x1) == 0)
920 puts_filtered(", N.Acc");
921 puts_filtered (")\n");
922 if ((info.HighWord.Bits.Type & 0x10) == 0)
923 puts_filtered("System selector ");
924 printf_filtered ("Priviledge level = %d. ", info.HighWord.Bits.Dpl);
925 if (info.HighWord.Bits.Granularity)
926 puts_filtered ("Page granular.\n");
927 else
928 puts_filtered ("Byte granular.\n");
929 return 1;
930 }
931 else
932 {
933 printf_filtered ("Invalid selector 0x%lx.\n",sel);
934 return 0;
935 }
936 }
937
938 static void
939 display_selectors (char * args, int from_tty)
940 {
941 if (!current_thread)
942 {
943 puts_filtered ("Impossible to display selectors now.\n");
944 return;
945 }
946 if (!args)
947 {
948
949 puts_filtered ("Selector $cs\n");
950 display_selector (current_thread->h,
951 current_thread->context.SegCs);
952 puts_filtered ("Selector $ds\n");
953 display_selector (current_thread->h,
954 current_thread->context.SegDs);
955 puts_filtered ("Selector $es\n");
956 display_selector (current_thread->h,
957 current_thread->context.SegEs);
958 puts_filtered ("Selector $ss\n");
959 display_selector (current_thread->h,
960 current_thread->context.SegSs);
961 puts_filtered ("Selector $fs\n");
962 display_selector (current_thread->h,
963 current_thread->context.SegFs);
964 puts_filtered ("Selector $gs\n");
965 display_selector (current_thread->h,
966 current_thread->context.SegGs);
967 }
968 else
969 {
970 int sel;
971 sel = parse_and_eval_long (args);
972 printf_filtered ("Selector \"%s\"\n",args);
973 display_selector (current_thread->h, sel);
974 }
975 }
976
977 static struct cmd_list_element *info_w32_cmdlist = NULL;
978
979 static void
980 info_w32_command (char *args, int from_tty)
981 {
982 help_list (info_w32_cmdlist, "info w32 ", class_info, gdb_stdout);
983 }
984
985
986 #define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
987 printf_unfiltered ("gdb: Target exception %s at %p\n", x, \
988 current_event.u.Exception.ExceptionRecord.ExceptionAddress)
989
990 static int
991 handle_exception (struct target_waitstatus *ourstatus)
992 {
993 thread_info *th;
994 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
995
996 ourstatus->kind = TARGET_WAITKIND_STOPPED;
997
998 /* Record the context of the current thread */
999 th = thread_rec (current_event.dwThreadId, -1);
1000
1001 switch (code)
1002 {
1003 case EXCEPTION_ACCESS_VIOLATION:
1004 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
1005 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1006 #ifdef __CYGWIN__
1007 {
1008 /* See if the access violation happened within the cygwin DLL itself. Cygwin uses
1009 a kind of exception handling to deal with passed-in invalid addresses. gdb
1010 should not treat these as real SEGVs since they will be silently handled by
1011 cygwin. A real SEGV will (theoretically) be caught by cygwin later in the process
1012 and will be sent as a cygwin-specific-signal. So, ignore SEGVs if they show up
1013 within the text segment of the DLL itself. */
1014 char *fn;
1015 CORE_ADDR addr = (CORE_ADDR) (uintptr_t) current_event.u.Exception.ExceptionRecord.ExceptionAddress;
1016 if ((!cygwin_exceptions && (addr >= cygwin_load_start && addr < cygwin_load_end))
1017 || (find_pc_partial_function (addr, &fn, NULL, NULL)
1018 && strncmp (fn, "KERNEL32!IsBad", strlen ("KERNEL32!IsBad")) == 0))
1019 return 0;
1020 }
1021 #endif
1022 break;
1023 case STATUS_STACK_OVERFLOW:
1024 DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
1025 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
1026 break;
1027 case STATUS_FLOAT_DENORMAL_OPERAND:
1028 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
1029 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1030 break;
1031 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED:
1032 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
1033 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1034 break;
1035 case STATUS_FLOAT_INEXACT_RESULT:
1036 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
1037 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1038 break;
1039 case STATUS_FLOAT_INVALID_OPERATION:
1040 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
1041 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1042 break;
1043 case STATUS_FLOAT_OVERFLOW:
1044 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
1045 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1046 break;
1047 case STATUS_FLOAT_STACK_CHECK:
1048 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
1049 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1050 break;
1051 case STATUS_FLOAT_UNDERFLOW:
1052 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
1053 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1054 break;
1055 case STATUS_FLOAT_DIVIDE_BY_ZERO:
1056 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1057 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1058 break;
1059 case STATUS_INTEGER_DIVIDE_BY_ZERO:
1060 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
1061 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1062 break;
1063 case STATUS_INTEGER_OVERFLOW:
1064 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1065 ourstatus->value.sig = TARGET_SIGNAL_FPE;
1066 break;
1067 case EXCEPTION_BREAKPOINT:
1068 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
1069 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1070 break;
1071 case DBG_CONTROL_C:
1072 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
1073 ourstatus->value.sig = TARGET_SIGNAL_INT;
1074 break;
1075 case DBG_CONTROL_BREAK:
1076 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
1077 ourstatus->value.sig = TARGET_SIGNAL_INT;
1078 break;
1079 case EXCEPTION_SINGLE_STEP:
1080 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
1081 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
1082 break;
1083 case EXCEPTION_ILLEGAL_INSTRUCTION:
1084 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1085 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1086 break;
1087 case EXCEPTION_PRIV_INSTRUCTION:
1088 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1089 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1090 break;
1091 case EXCEPTION_NONCONTINUABLE_EXCEPTION:
1092 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
1093 ourstatus->value.sig = TARGET_SIGNAL_ILL;
1094 break;
1095 default:
1096 /* Treat unhandled first chance exceptions specially. */
1097 if (current_event.u.Exception.dwFirstChance)
1098 return -1;
1099 printf_unfiltered ("gdb: unknown target exception 0x%08lx at %p\n",
1100 current_event.u.Exception.ExceptionRecord.ExceptionCode,
1101 current_event.u.Exception.ExceptionRecord.ExceptionAddress);
1102 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
1103 break;
1104 }
1105 exception_count++;
1106 last_sig = ourstatus->value.sig;
1107 return 1;
1108 }
1109
1110 /* Resume all artificially suspended threads if we are continuing
1111 execution */
1112 static BOOL
1113 windows_continue (DWORD continue_status, int id)
1114 {
1115 int i;
1116 thread_info *th;
1117 BOOL res;
1118
1119 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
1120 current_event.dwProcessId, current_event.dwThreadId,
1121 continue_status == DBG_CONTINUE ?
1122 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
1123
1124 for (th = &thread_head; (th = th->next) != NULL;)
1125 if ((id == -1 || id == (int) th->id)
1126 && th->suspended)
1127 {
1128 if (debug_registers_changed)
1129 {
1130 th->context.ContextFlags |= CONTEXT_DEBUG_REGISTERS;
1131 th->context.Dr0 = dr[0];
1132 th->context.Dr1 = dr[1];
1133 th->context.Dr2 = dr[2];
1134 th->context.Dr3 = dr[3];
1135 th->context.Dr6 = DR6_CLEAR_VALUE;
1136 th->context.Dr7 = dr[7];
1137 }
1138 if (th->context.ContextFlags)
1139 {
1140 CHECK (SetThreadContext (th->h, &th->context));
1141 th->context.ContextFlags = 0;
1142 }
1143 if (th->suspended > 0)
1144 (void) ResumeThread (th->h);
1145 th->suspended = 0;
1146 }
1147
1148 res = ContinueDebugEvent (current_event.dwProcessId,
1149 current_event.dwThreadId,
1150 continue_status);
1151
1152 debug_registers_changed = 0;
1153 return res;
1154 }
1155
1156 /* Called in pathological case where Windows fails to send a
1157 CREATE_PROCESS_DEBUG_EVENT after an attach. */
1158 static DWORD
1159 fake_create_process (void)
1160 {
1161 current_process_handle = OpenProcess (PROCESS_ALL_ACCESS, FALSE,
1162 current_event.dwProcessId);
1163 if (current_process_handle != NULL)
1164 open_process_used = 1;
1165 else
1166 {
1167 error (_("OpenProcess call failed, GetLastError = %lud\n"),
1168 GetLastError ());
1169 /* We can not debug anything in that case. */
1170 }
1171 main_thread_id = current_event.dwThreadId;
1172 current_thread = windows_add_thread (ptid_build (current_event.dwProcessId, 0,
1173 current_event.dwThreadId),
1174 current_event.u.CreateThread.hThread);
1175 return main_thread_id;
1176 }
1177
1178 static void
1179 windows_resume (struct target_ops *ops,
1180 ptid_t ptid, int step, enum target_signal sig)
1181 {
1182 thread_info *th;
1183 DWORD continue_status = DBG_CONTINUE;
1184
1185 /* A specific PTID means `step only this thread id'. */
1186 int resume_all = ptid_equal (ptid, minus_one_ptid);
1187
1188 /* If we're continuing all threads, it's the current inferior that
1189 should be handled specially. */
1190 if (resume_all)
1191 ptid = inferior_ptid;
1192
1193 if (sig != TARGET_SIGNAL_0)
1194 {
1195 if (current_event.dwDebugEventCode != EXCEPTION_DEBUG_EVENT)
1196 {
1197 DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig));
1198 }
1199 else if (sig == last_sig)
1200 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1201 else
1202 #if 0
1203 /* This code does not seem to work, because
1204 the kernel does probably not consider changes in the ExceptionRecord
1205 structure when passing the exception to the inferior.
1206 Note that this seems possible in the exception handler itself. */
1207 {
1208 int i;
1209 for (i = 0; xlate[i].them != -1; i++)
1210 if (xlate[i].us == sig)
1211 {
1212 current_event.u.Exception.ExceptionRecord.ExceptionCode =
1213 xlate[i].them;
1214 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1215 break;
1216 }
1217 if (continue_status == DBG_CONTINUE)
1218 {
1219 DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig));
1220 }
1221 }
1222 #endif
1223 DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
1224 last_sig));
1225 }
1226
1227 last_sig = TARGET_SIGNAL_0;
1228
1229 DEBUG_EXEC (("gdb: windows_resume (pid=%d, tid=%ld, step=%d, sig=%d);\n",
1230 ptid_get_pid (ptid), ptid_get_tid (ptid), step, sig));
1231
1232 /* Get context for currently selected thread */
1233 th = thread_rec (ptid_get_tid (inferior_ptid), FALSE);
1234 if (th)
1235 {
1236 if (step)
1237 {
1238 /* Single step by setting t bit */
1239 windows_fetch_inferior_registers (ops,
1240 get_current_regcache (),
1241 gdbarch_ps_regnum (current_gdbarch));
1242 th->context.EFlags |= FLAG_TRACE_BIT;
1243 }
1244
1245 if (th->context.ContextFlags)
1246 {
1247 if (debug_registers_changed)
1248 {
1249 th->context.Dr0 = dr[0];
1250 th->context.Dr1 = dr[1];
1251 th->context.Dr2 = dr[2];
1252 th->context.Dr3 = dr[3];
1253 th->context.Dr6 = DR6_CLEAR_VALUE;
1254 th->context.Dr7 = dr[7];
1255 }
1256 CHECK (SetThreadContext (th->h, &th->context));
1257 th->context.ContextFlags = 0;
1258 }
1259 }
1260
1261 /* Allow continuing with the same signal that interrupted us.
1262 Otherwise complain. */
1263
1264 if (resume_all)
1265 windows_continue (continue_status, -1);
1266 else
1267 windows_continue (continue_status, ptid_get_tid (ptid));
1268 }
1269
1270 /* Ctrl-C handler used when the inferior is not run in the same console. The
1271 handler is in charge of interrupting the inferior using DebugBreakProcess.
1272 Note that this function is not available prior to Windows XP. In this case
1273 we emit a warning. */
1274 BOOL WINAPI
1275 ctrl_c_handler (DWORD event_type)
1276 {
1277 const int attach_flag = current_inferior ()->attach_flag;
1278
1279 /* Only handle Ctrl-C event. Ignore others. */
1280 if (event_type != CTRL_C_EVENT)
1281 return FALSE;
1282
1283 /* If the inferior and the debugger share the same console, do nothing as
1284 the inferior has also received the Ctrl-C event. */
1285 if (!new_console && !attach_flag)
1286 return TRUE;
1287
1288 if (!DebugBreakProcess (current_process_handle))
1289 warning (_("\
1290 Could not interrupt program. Press Ctrl-c in the program console."));
1291
1292 /* Return true to tell that Ctrl-C has been handled. */
1293 return TRUE;
1294 }
1295
1296 /* Get the next event from the child. Return 1 if the event requires
1297 handling by WFI (or whatever). */
1298 static int
1299 get_windows_debug_event (struct target_ops *ops,
1300 int pid, struct target_waitstatus *ourstatus)
1301 {
1302 BOOL debug_event;
1303 DWORD continue_status, event_code;
1304 thread_info *th;
1305 static thread_info dummy_thread_info;
1306 int retval = 0;
1307
1308 last_sig = TARGET_SIGNAL_0;
1309
1310 if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
1311 goto out;
1312
1313 event_count++;
1314 continue_status = DBG_CONTINUE;
1315
1316 event_code = current_event.dwDebugEventCode;
1317 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
1318 th = NULL;
1319 have_saved_context = 0;
1320
1321 switch (event_code)
1322 {
1323 case CREATE_THREAD_DEBUG_EVENT:
1324 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
1325 (unsigned) current_event.dwProcessId,
1326 (unsigned) current_event.dwThreadId,
1327 "CREATE_THREAD_DEBUG_EVENT"));
1328 if (saw_create != 1)
1329 {
1330 struct inferior *inf;
1331 inf = find_inferior_pid (current_event.dwProcessId);
1332 if (!saw_create && inf->attach_flag)
1333 {
1334 /* Kludge around a Windows bug where first event is a create
1335 thread event. Caused when attached process does not have
1336 a main thread. */
1337 retval = fake_create_process ();
1338 if (retval)
1339 saw_create++;
1340 }
1341 break;
1342 }
1343 /* Record the existence of this thread */
1344 retval = current_event.dwThreadId;
1345 th = windows_add_thread (ptid_build (current_event.dwProcessId, 0,
1346 current_event.dwThreadId),
1347 current_event.u.CreateThread.hThread);
1348 break;
1349
1350 case EXIT_THREAD_DEBUG_EVENT:
1351 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1352 (unsigned) current_event.dwProcessId,
1353 (unsigned) current_event.dwThreadId,
1354 "EXIT_THREAD_DEBUG_EVENT"));
1355 if (current_event.dwThreadId != main_thread_id)
1356 {
1357 windows_delete_thread (ptid_build (current_event.dwProcessId, 0,
1358 current_event.dwThreadId));
1359 th = &dummy_thread_info;
1360 }
1361 break;
1362
1363 case CREATE_PROCESS_DEBUG_EVENT:
1364 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1365 (unsigned) current_event.dwProcessId,
1366 (unsigned) current_event.dwThreadId,
1367 "CREATE_PROCESS_DEBUG_EVENT"));
1368 CloseHandle (current_event.u.CreateProcessInfo.hFile);
1369 if (++saw_create != 1)
1370 break;
1371
1372 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
1373 if (main_thread_id)
1374 windows_delete_thread (ptid_build (current_event.dwProcessId, 0,
1375 main_thread_id));
1376 main_thread_id = current_event.dwThreadId;
1377 /* Add the main thread */
1378 th = windows_add_thread (ptid_build (current_event.dwProcessId, 0,
1379 current_event.dwThreadId),
1380 current_event.u.CreateProcessInfo.hThread);
1381 retval = current_event.dwThreadId;
1382 break;
1383
1384 case EXIT_PROCESS_DEBUG_EVENT:
1385 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1386 (unsigned) current_event.dwProcessId,
1387 (unsigned) current_event.dwThreadId,
1388 "EXIT_PROCESS_DEBUG_EVENT"));
1389 if (saw_create != 1)
1390 break;
1391 ourstatus->kind = TARGET_WAITKIND_EXITED;
1392 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
1393 retval = main_thread_id;
1394 break;
1395
1396 case LOAD_DLL_DEBUG_EVENT:
1397 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1398 (unsigned) current_event.dwProcessId,
1399 (unsigned) current_event.dwThreadId,
1400 "LOAD_DLL_DEBUG_EVENT"));
1401 CloseHandle (current_event.u.LoadDll.hFile);
1402 if (saw_create != 1)
1403 break;
1404 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
1405 ourstatus->kind = TARGET_WAITKIND_LOADED;
1406 ourstatus->value.integer = 0;
1407 retval = main_thread_id;
1408 break;
1409
1410 case UNLOAD_DLL_DEBUG_EVENT:
1411 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1412 (unsigned) current_event.dwProcessId,
1413 (unsigned) current_event.dwThreadId,
1414 "UNLOAD_DLL_DEBUG_EVENT"));
1415 if (saw_create != 1)
1416 break;
1417 catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
1418 ourstatus->kind = TARGET_WAITKIND_LOADED;
1419 ourstatus->value.integer = 0;
1420 retval = main_thread_id;
1421 break;
1422
1423 case EXCEPTION_DEBUG_EVENT:
1424 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1425 (unsigned) current_event.dwProcessId,
1426 (unsigned) current_event.dwThreadId,
1427 "EXCEPTION_DEBUG_EVENT"));
1428 if (saw_create != 1)
1429 break;
1430 switch (handle_exception (ourstatus))
1431 {
1432 case 0:
1433 continue_status = DBG_EXCEPTION_NOT_HANDLED;
1434 break;
1435 case 1:
1436 retval = current_event.dwThreadId;
1437 break;
1438 case -1:
1439 last_sig = 1;
1440 continue_status = -1;
1441 break;
1442 }
1443 break;
1444
1445 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
1446 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1447 (unsigned) current_event.dwProcessId,
1448 (unsigned) current_event.dwThreadId,
1449 "OUTPUT_DEBUG_STRING_EVENT"));
1450 if (saw_create != 1)
1451 break;
1452 retval = handle_output_debug_string (ourstatus);
1453 break;
1454
1455 default:
1456 if (saw_create != 1)
1457 break;
1458 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
1459 (DWORD) current_event.dwProcessId,
1460 (DWORD) current_event.dwThreadId);
1461 printf_unfiltered (" unknown event code %ld\n",
1462 current_event.dwDebugEventCode);
1463 break;
1464 }
1465
1466 if (!retval || saw_create != 1)
1467 {
1468 if (continue_status == -1)
1469 windows_resume (ops, minus_one_ptid, 0, 1);
1470 else
1471 CHECK (windows_continue (continue_status, -1));
1472 }
1473 else
1474 {
1475 inferior_ptid = ptid_build (current_event.dwProcessId, 0,
1476 retval);
1477 current_thread = th ?: thread_rec (current_event.dwThreadId, TRUE);
1478 }
1479
1480 out:
1481 return retval;
1482 }
1483
1484 /* Wait for interesting events to occur in the target process. */
1485 static ptid_t
1486 windows_wait (struct target_ops *ops,
1487 ptid_t ptid, struct target_waitstatus *ourstatus)
1488 {
1489 int pid = -1;
1490
1491 target_terminal_ours ();
1492
1493 /* We loop when we get a non-standard exception rather than return
1494 with a SPURIOUS because resume can try and step or modify things,
1495 which needs a current_thread->h. But some of these exceptions mark
1496 the birth or death of threads, which mean that the current thread
1497 isn't necessarily what you think it is. */
1498
1499 while (1)
1500 {
1501 int retval;
1502
1503 /* If the user presses Ctrl-c while the debugger is waiting
1504 for an event, he expects the debugger to interrupt his program
1505 and to get the prompt back. There are two possible situations:
1506
1507 - The debugger and the program do not share the console, in
1508 which case the Ctrl-c event only reached the debugger.
1509 In that case, the ctrl_c handler will take care of interrupting
1510 the inferior. Note that this case is working starting with
1511 Windows XP. For Windows 2000, Ctrl-C should be pressed in the
1512 inferior console.
1513
1514 - The debugger and the program share the same console, in which
1515 case both debugger and inferior will receive the Ctrl-c event.
1516 In that case the ctrl_c handler will ignore the event, as the
1517 Ctrl-c event generated inside the inferior will trigger the
1518 expected debug event.
1519
1520 FIXME: brobecker/2008-05-20: If the inferior receives the
1521 signal first and the delay until GDB receives that signal
1522 is sufficiently long, GDB can sometimes receive the SIGINT
1523 after we have unblocked the CTRL+C handler. This would
1524 lead to the debugger stopping prematurely while handling
1525 the new-thread event that comes with the handling of the SIGINT
1526 inside the inferior, and then stop again immediately when
1527 the user tries to resume the execution in the inferior.
1528 This is a classic race that we should try to fix one day. */
1529 SetConsoleCtrlHandler (&ctrl_c_handler, TRUE);
1530 retval = get_windows_debug_event (ops, pid, ourstatus);
1531 SetConsoleCtrlHandler (&ctrl_c_handler, FALSE);
1532
1533 if (retval)
1534 return ptid_build (current_event.dwProcessId, 0, retval);
1535 else
1536 {
1537 int detach = 0;
1538
1539 if (deprecated_ui_loop_hook != NULL)
1540 detach = deprecated_ui_loop_hook (0);
1541
1542 if (detach)
1543 windows_kill_inferior (ops);
1544 }
1545 }
1546 }
1547
1548 static void
1549 do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
1550 {
1551 extern int stop_after_trap;
1552 int i;
1553 struct inferior *inf;
1554 struct thread_info *tp;
1555
1556 last_sig = TARGET_SIGNAL_0;
1557 event_count = 0;
1558 exception_count = 0;
1559 open_process_used = 0;
1560 debug_registers_changed = 0;
1561 debug_registers_used = 0;
1562 for (i = 0; i < sizeof (dr) / sizeof (dr[0]); i++)
1563 dr[i] = 0;
1564 #ifdef __CYGWIN__
1565 cygwin_load_start = cygwin_load_end = 0;
1566 #endif
1567 current_event.dwProcessId = pid;
1568 memset (&current_event, 0, sizeof (current_event));
1569 push_target (ops);
1570 disable_breakpoints_in_shlibs ();
1571 windows_clear_solib ();
1572 clear_proceed_status ();
1573 init_wait_for_inferior ();
1574
1575 inf = add_inferior (pid);
1576 inf->attach_flag = attaching;
1577
1578 /* Make the new process the current inferior, so terminal handling
1579 can rely on it. When attaching, we don't know about any thread
1580 id here, but that's OK --- nothing should be referencing the
1581 current thread until we report an event out of windows_wait. */
1582 inferior_ptid = pid_to_ptid (pid);
1583
1584 terminal_init_inferior_with_pgrp (pid);
1585 target_terminal_inferior ();
1586
1587 inf->stop_soon = STOP_QUIETLY;
1588 while (1)
1589 {
1590 stop_after_trap = 1;
1591 wait_for_inferior (0);
1592 tp = inferior_thread ();
1593 if (tp->stop_signal != TARGET_SIGNAL_TRAP)
1594 resume (0, tp->stop_signal);
1595 else
1596 break;
1597 }
1598
1599 inf->stop_soon = NO_STOP_QUIETLY;
1600 stop_after_trap = 0;
1601 return;
1602 }
1603
1604 /* Try to set or remove a user privilege to the current process. Return -1
1605 if that fails, the previous setting of that privilege otherwise.
1606
1607 This code is copied from the Cygwin source code and rearranged to allow
1608 dynamically loading of the needed symbols from advapi32 which is only
1609 available on NT/2K/XP. */
1610 static int
1611 set_process_privilege (const char *privilege, BOOL enable)
1612 {
1613 static HMODULE advapi32 = NULL;
1614 static BOOL WINAPI (*OpenProcessToken)(HANDLE, DWORD, PHANDLE);
1615 static BOOL WINAPI (*LookupPrivilegeValue)(LPCSTR, LPCSTR, PLUID);
1616 static BOOL WINAPI (*AdjustTokenPrivileges)(HANDLE, BOOL, PTOKEN_PRIVILEGES,
1617 DWORD, PTOKEN_PRIVILEGES, PDWORD);
1618
1619 HANDLE token_hdl = NULL;
1620 LUID restore_priv;
1621 TOKEN_PRIVILEGES new_priv, orig_priv;
1622 int ret = -1;
1623 DWORD size;
1624
1625 if (GetVersion () >= 0x80000000) /* No security availbale on 9x/Me */
1626 return 0;
1627
1628 if (!advapi32)
1629 {
1630 if (!(advapi32 = LoadLibrary ("advapi32.dll")))
1631 goto out;
1632 if (!OpenProcessToken)
1633 OpenProcessToken =
1634 (void *) GetProcAddress (advapi32, "OpenProcessToken");
1635 if (!LookupPrivilegeValue)
1636 LookupPrivilegeValue =
1637 (void *) GetProcAddress (advapi32, "LookupPrivilegeValueA");
1638 if (!AdjustTokenPrivileges)
1639 AdjustTokenPrivileges =
1640 (void *) GetProcAddress (advapi32, "AdjustTokenPrivileges");
1641 if (!OpenProcessToken || !LookupPrivilegeValue || !AdjustTokenPrivileges)
1642 {
1643 advapi32 = NULL;
1644 goto out;
1645 }
1646 }
1647
1648 if (!OpenProcessToken (GetCurrentProcess (),
1649 TOKEN_QUERY | TOKEN_ADJUST_PRIVILEGES,
1650 &token_hdl))
1651 goto out;
1652
1653 if (!LookupPrivilegeValue (NULL, privilege, &restore_priv))
1654 goto out;
1655
1656 new_priv.PrivilegeCount = 1;
1657 new_priv.Privileges[0].Luid = restore_priv;
1658 new_priv.Privileges[0].Attributes = enable ? SE_PRIVILEGE_ENABLED : 0;
1659
1660 if (!AdjustTokenPrivileges (token_hdl, FALSE, &new_priv,
1661 sizeof orig_priv, &orig_priv, &size))
1662 goto out;
1663 #if 0
1664 /* Disabled, otherwise every `attach' in an unprivileged user session
1665 would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1666 windows_attach(). */
1667 /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1668 be enabled. GetLastError () returns an correct error code, though. */
1669 if (enable && GetLastError () == ERROR_NOT_ALL_ASSIGNED)
1670 goto out;
1671 #endif
1672
1673 ret = orig_priv.Privileges[0].Attributes == SE_PRIVILEGE_ENABLED ? 1 : 0;
1674
1675 out:
1676 if (token_hdl)
1677 CloseHandle (token_hdl);
1678
1679 return ret;
1680 }
1681
1682 /* Attach to process PID, then initialize for debugging it. */
1683 static void
1684 windows_attach (struct target_ops *ops, char *args, int from_tty)
1685 {
1686 BOOL ok;
1687 DWORD pid;
1688
1689 if (!args)
1690 error_no_arg (_("process-id to attach"));
1691
1692 if (set_process_privilege (SE_DEBUG_NAME, TRUE) < 0)
1693 {
1694 printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1695 printf_unfiltered ("This can cause attach to fail on Windows NT/2K/XP\n");
1696 }
1697
1698 pid = strtoul (args, 0, 0); /* Windows pid */
1699
1700 windows_init_thread_list ();
1701 ok = DebugActiveProcess (pid);
1702 saw_create = 0;
1703
1704 #ifdef __CYGWIN__
1705 if (!ok)
1706 {
1707 /* Try fall back to Cygwin pid */
1708 pid = cygwin_internal (CW_CYGWIN_PID_TO_WINPID, pid);
1709
1710 if (pid > 0)
1711 ok = DebugActiveProcess (pid);
1712 }
1713 #endif
1714
1715 if (!ok)
1716 error (_("Can't attach to process."));
1717
1718 DebugSetProcessKillOnExit (FALSE);
1719
1720 if (from_tty)
1721 {
1722 char *exec_file = (char *) get_exec_file (0);
1723
1724 if (exec_file)
1725 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1726 target_pid_to_str (pid_to_ptid (pid)));
1727 else
1728 printf_unfiltered ("Attaching to %s\n",
1729 target_pid_to_str (pid_to_ptid (pid)));
1730
1731 gdb_flush (gdb_stdout);
1732 }
1733
1734 do_initial_windows_stuff (ops, pid, 1);
1735 target_terminal_ours ();
1736 }
1737
1738 static void
1739 windows_detach (struct target_ops *ops, char *args, int from_tty)
1740 {
1741 int detached = 1;
1742
1743 ptid_t ptid = {-1};
1744 windows_resume (ops, ptid, 0, TARGET_SIGNAL_0);
1745
1746 if (!DebugActiveProcessStop (current_event.dwProcessId))
1747 {
1748 error (_("Can't detach process %lu (error %lu)"),
1749 current_event.dwProcessId, GetLastError ());
1750 detached = 0;
1751 }
1752 DebugSetProcessKillOnExit (FALSE);
1753
1754 if (detached && from_tty)
1755 {
1756 char *exec_file = get_exec_file (0);
1757 if (exec_file == 0)
1758 exec_file = "";
1759 printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
1760 current_event.dwProcessId);
1761 gdb_flush (gdb_stdout);
1762 }
1763
1764 inferior_ptid = null_ptid;
1765 detach_inferior (current_event.dwProcessId);
1766
1767 unpush_target (ops);
1768 }
1769
1770 static char *
1771 windows_pid_to_exec_file (int pid)
1772 {
1773 static char path[MAX_PATH + 1];
1774
1775 #ifdef __CYGWIN__
1776 /* Try to find exe name as symlink target of /proc/<pid>/exe */
1777 int nchars;
1778 char procexe[sizeof ("/proc/4294967295/exe")];
1779 sprintf (procexe, "/proc/%u/exe", pid);
1780 nchars = readlink (procexe, path, sizeof(path));
1781 if (nchars > 0 && nchars < sizeof (path))
1782 {
1783 path[nchars] = '\0'; /* Got it */
1784 return path;
1785 }
1786 #endif
1787
1788 /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
1789 of gdb, or we're trying to debug a non-Cygwin windows executable. */
1790 if (!get_module_name (0, path))
1791 path[0] = '\0';
1792
1793 return path;
1794 }
1795
1796 /* Print status information about what we're accessing. */
1797
1798 static void
1799 windows_files_info (struct target_ops *ignore)
1800 {
1801 struct inferior *inf = current_inferior ();
1802
1803 printf_unfiltered ("\tUsing the running image of %s %s.\n",
1804 inf->attach_flag ? "attached" : "child",
1805 target_pid_to_str (inferior_ptid));
1806 }
1807
1808 static void
1809 windows_open (char *arg, int from_tty)
1810 {
1811 error (_("Use the \"run\" command to start a Unix child process."));
1812 }
1813
1814 /* Start an inferior windows child process and sets inferior_ptid to its pid.
1815 EXEC_FILE is the file to run.
1816 ALLARGS is a string containing the arguments to the program.
1817 ENV is the environment vector to pass. Errors reported with error(). */
1818
1819 static void
1820 windows_create_inferior (struct target_ops *ops, char *exec_file,
1821 char *allargs, char **in_env, int from_tty)
1822 {
1823 STARTUPINFO si;
1824 PROCESS_INFORMATION pi;
1825 BOOL ret;
1826 DWORD flags;
1827 char *args;
1828 char real_path[MAXPATHLEN];
1829 char *toexec;
1830 char shell[MAX_PATH + 1]; /* Path to shell */
1831 const char *sh;
1832 #ifdef __CYGWIN__
1833 int tty;
1834 int ostdin, ostdout, ostderr;
1835 #else
1836 HANDLE tty;
1837 #endif
1838 const char *inferior_io_terminal = get_inferior_io_terminal ();
1839
1840 if (!exec_file)
1841 error (_("No executable specified, use `target exec'."));
1842
1843 memset (&si, 0, sizeof (si));
1844 si.cb = sizeof (si);
1845
1846 #ifdef __CYGWIN__
1847 if (!useshell)
1848 {
1849 flags = DEBUG_ONLY_THIS_PROCESS;
1850 cygwin_conv_to_win32_path (exec_file, real_path);
1851 toexec = real_path;
1852 }
1853 else
1854 {
1855 char *newallargs;
1856 sh = getenv ("SHELL");
1857 if (!sh)
1858 sh = "/bin/sh";
1859 cygwin_conv_to_win32_path (sh, shell);
1860 newallargs = alloca (sizeof (" -c 'exec '") + strlen (exec_file)
1861 + strlen (allargs) + 2);
1862 sprintf (newallargs, " -c 'exec %s %s'", exec_file, allargs);
1863 allargs = newallargs;
1864 toexec = shell;
1865 flags = DEBUG_PROCESS;
1866 }
1867 #else
1868 toexec = exec_file;
1869 flags = DEBUG_ONLY_THIS_PROCESS;
1870 #endif
1871
1872 if (new_group)
1873 flags |= CREATE_NEW_PROCESS_GROUP;
1874
1875 if (new_console)
1876 flags |= CREATE_NEW_CONSOLE;
1877
1878 args = alloca (strlen (toexec) + strlen (allargs) + 2);
1879 strcpy (args, toexec);
1880 strcat (args, " ");
1881 strcat (args, allargs);
1882
1883 #ifdef __CYGWIN__
1884 /* Prepare the environment vars for CreateProcess. */
1885 cygwin_internal (CW_SYNC_WINENV);
1886
1887 if (!inferior_io_terminal)
1888 tty = ostdin = ostdout = ostderr = -1;
1889 else
1890 {
1891 tty = open (inferior_io_terminal, O_RDWR | O_NOCTTY);
1892 if (tty < 0)
1893 {
1894 print_sys_errmsg (inferior_io_terminal, errno);
1895 ostdin = ostdout = ostderr = -1;
1896 }
1897 else
1898 {
1899 ostdin = dup (0);
1900 ostdout = dup (1);
1901 ostderr = dup (2);
1902 dup2 (tty, 0);
1903 dup2 (tty, 1);
1904 dup2 (tty, 2);
1905 }
1906 }
1907 #else
1908 if (!inferior_io_terminal)
1909 tty = INVALID_HANDLE_VALUE;
1910 else
1911 {
1912 SECURITY_ATTRIBUTES sa;
1913 sa.nLength = sizeof(sa);
1914 sa.lpSecurityDescriptor = 0;
1915 sa.bInheritHandle = TRUE;
1916 tty = CreateFileA (inferior_io_terminal, GENERIC_READ | GENERIC_WRITE,
1917 0, &sa, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
1918 if (tty == INVALID_HANDLE_VALUE)
1919 warning (_("Warning: Failed to open TTY %s, error %#x."),
1920 inferior_io_terminal, (unsigned) GetLastError ());
1921 else
1922 {
1923 si.hStdInput = tty;
1924 si.hStdOutput = tty;
1925 si.hStdError = tty;
1926 si.dwFlags |= STARTF_USESTDHANDLES;
1927 }
1928 }
1929 #endif
1930
1931 windows_init_thread_list ();
1932 ret = CreateProcess (0,
1933 args, /* command line */
1934 NULL, /* Security */
1935 NULL, /* thread */
1936 TRUE, /* inherit handles */
1937 flags, /* start flags */
1938 NULL, /* environment */
1939 NULL, /* current directory */
1940 &si,
1941 &pi);
1942
1943 #ifdef __CYGWIN__
1944 if (tty >= 0)
1945 {
1946 close (tty);
1947 dup2 (ostdin, 0);
1948 dup2 (ostdout, 1);
1949 dup2 (ostderr, 2);
1950 close (ostdin);
1951 close (ostdout);
1952 close (ostderr);
1953 }
1954 #else
1955 if (tty != INVALID_HANDLE_VALUE)
1956 CloseHandle (tty);
1957 #endif
1958
1959 if (!ret)
1960 error (_("Error creating process %s, (error %d)."),
1961 exec_file, (unsigned) GetLastError ());
1962
1963 CloseHandle (pi.hThread);
1964 CloseHandle (pi.hProcess);
1965
1966 if (useshell && shell[0] != '\0')
1967 saw_create = -1;
1968 else
1969 saw_create = 0;
1970
1971 do_initial_windows_stuff (ops, pi.dwProcessId, 0);
1972
1973 /* windows_continue (DBG_CONTINUE, -1); */
1974 }
1975
1976 static void
1977 windows_mourn_inferior (struct target_ops *ops)
1978 {
1979 (void) windows_continue (DBG_CONTINUE, -1);
1980 i386_cleanup_dregs();
1981 if (open_process_used)
1982 {
1983 CHECK (CloseHandle (current_process_handle));
1984 open_process_used = 0;
1985 }
1986 unpush_target (ops);
1987 generic_mourn_inferior ();
1988 }
1989
1990 /* Send a SIGINT to the process group. This acts just like the user typed a
1991 ^C on the controlling terminal. */
1992
1993 static void
1994 windows_stop (ptid_t ptid)
1995 {
1996 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1997 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1998 registers_changed (); /* refresh register state */
1999 }
2000
2001 static int
2002 windows_xfer_memory (CORE_ADDR memaddr, gdb_byte *our, int len,
2003 int write, struct mem_attrib *mem,
2004 struct target_ops *target)
2005 {
2006 SIZE_T done = 0;
2007 if (write)
2008 {
2009 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
2010 len, (DWORD) (uintptr_t) memaddr));
2011 if (!WriteProcessMemory (current_process_handle,
2012 (LPVOID) (uintptr_t) memaddr, our,
2013 len, &done))
2014 done = 0;
2015 FlushInstructionCache (current_process_handle,
2016 (LPCVOID) (uintptr_t) memaddr, len);
2017 }
2018 else
2019 {
2020 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
2021 len, (DWORD) (uintptr_t) memaddr));
2022 if (!ReadProcessMemory (current_process_handle,
2023 (LPCVOID) (uintptr_t) memaddr, our,
2024 len, &done))
2025 done = 0;
2026 }
2027 return done;
2028 }
2029
2030 static void
2031 windows_kill_inferior (struct target_ops *ops)
2032 {
2033 CHECK (TerminateProcess (current_process_handle, 0));
2034
2035 for (;;)
2036 {
2037 if (!windows_continue (DBG_CONTINUE, -1))
2038 break;
2039 if (!WaitForDebugEvent (&current_event, INFINITE))
2040 break;
2041 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
2042 break;
2043 }
2044
2045 target_mourn_inferior (); /* or just windows_mourn_inferior? */
2046 }
2047
2048 static void
2049 windows_prepare_to_store (struct regcache *regcache)
2050 {
2051 /* Do nothing, since we can store individual regs */
2052 }
2053
2054 static int
2055 windows_can_run (void)
2056 {
2057 return 1;
2058 }
2059
2060 static void
2061 windows_close (int x)
2062 {
2063 DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
2064 PIDGET (inferior_ptid)));
2065 }
2066
2067 /* Convert pid to printable format. */
2068 static char *
2069 windows_pid_to_str (struct target_ops *ops, ptid_t ptid)
2070 {
2071 static char buf[80];
2072
2073 if (ptid_get_tid (ptid) != 0)
2074 {
2075 snprintf (buf, sizeof (buf), "Thread %d.0x%lx",
2076 ptid_get_pid (ptid), ptid_get_tid (ptid));
2077 return buf;
2078 }
2079
2080 return normal_pid_to_str (ptid);
2081 }
2082
2083 static LONGEST
2084 windows_xfer_shared_libraries (struct target_ops *ops,
2085 enum target_object object, const char *annex,
2086 gdb_byte *readbuf, const gdb_byte *writebuf,
2087 ULONGEST offset, LONGEST len)
2088 {
2089 struct obstack obstack;
2090 const char *buf;
2091 LONGEST len_avail;
2092 struct so_list *so;
2093
2094 if (writebuf)
2095 return -1;
2096
2097 obstack_init (&obstack);
2098 obstack_grow_str (&obstack, "<library-list>\n");
2099 for (so = solib_start.next; so; so = so->next)
2100 windows_xfer_shared_library (so->so_name, (CORE_ADDR) (uintptr_t) so->lm_info->load_addr,
2101 &obstack);
2102 obstack_grow_str0 (&obstack, "</library-list>\n");
2103
2104 buf = obstack_finish (&obstack);
2105 len_avail = strlen (buf);
2106 if (offset >= len_avail)
2107 return 0;
2108
2109 if (len > len_avail - offset)
2110 len = len_avail - offset;
2111 memcpy (readbuf, buf + offset, len);
2112
2113 obstack_free (&obstack, NULL);
2114 return len;
2115 }
2116
2117 static LONGEST
2118 windows_xfer_partial (struct target_ops *ops, enum target_object object,
2119 const char *annex, gdb_byte *readbuf,
2120 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
2121 {
2122 switch (object)
2123 {
2124 case TARGET_OBJECT_MEMORY:
2125 if (readbuf)
2126 return (*ops->deprecated_xfer_memory) (offset, readbuf,
2127 len, 0/*read*/, NULL, ops);
2128 if (writebuf)
2129 return (*ops->deprecated_xfer_memory) (offset, (gdb_byte *) writebuf,
2130 len, 1/*write*/, NULL, ops);
2131 return -1;
2132
2133 case TARGET_OBJECT_LIBRARIES:
2134 return windows_xfer_shared_libraries (ops, object, annex, readbuf,
2135 writebuf, offset, len);
2136
2137 default:
2138 if (ops->beneath != NULL)
2139 return ops->beneath->to_xfer_partial (ops->beneath, object, annex,
2140 readbuf, writebuf, offset, len);
2141 return -1;
2142 }
2143 }
2144
2145 static void
2146 init_windows_ops (void)
2147 {
2148 windows_ops.to_shortname = "child";
2149 windows_ops.to_longname = "Win32 child process";
2150 windows_ops.to_doc = "Win32 child process (started by the \"run\" command).";
2151 windows_ops.to_open = windows_open;
2152 windows_ops.to_close = windows_close;
2153 windows_ops.to_attach = windows_attach;
2154 windows_ops.to_attach_no_wait = 1;
2155 windows_ops.to_detach = windows_detach;
2156 windows_ops.to_resume = windows_resume;
2157 windows_ops.to_wait = windows_wait;
2158 windows_ops.to_fetch_registers = windows_fetch_inferior_registers;
2159 windows_ops.to_store_registers = windows_store_inferior_registers;
2160 windows_ops.to_prepare_to_store = windows_prepare_to_store;
2161 windows_ops.deprecated_xfer_memory = windows_xfer_memory;
2162 windows_ops.to_xfer_partial = windows_xfer_partial;
2163 windows_ops.to_files_info = windows_files_info;
2164 windows_ops.to_insert_breakpoint = memory_insert_breakpoint;
2165 windows_ops.to_remove_breakpoint = memory_remove_breakpoint;
2166 windows_ops.to_terminal_init = terminal_init_inferior;
2167 windows_ops.to_terminal_inferior = terminal_inferior;
2168 windows_ops.to_terminal_ours_for_output = terminal_ours_for_output;
2169 windows_ops.to_terminal_ours = terminal_ours;
2170 windows_ops.to_terminal_save_ours = terminal_save_ours;
2171 windows_ops.to_terminal_info = child_terminal_info;
2172 windows_ops.to_kill = windows_kill_inferior;
2173 windows_ops.to_create_inferior = windows_create_inferior;
2174 windows_ops.to_mourn_inferior = windows_mourn_inferior;
2175 windows_ops.to_can_run = windows_can_run;
2176 windows_ops.to_thread_alive = windows_thread_alive;
2177 windows_ops.to_pid_to_str = windows_pid_to_str;
2178 windows_ops.to_stop = windows_stop;
2179 windows_ops.to_stratum = process_stratum;
2180 windows_ops.to_has_all_memory = 1;
2181 windows_ops.to_has_memory = 1;
2182 windows_ops.to_has_stack = 1;
2183 windows_ops.to_has_registers = 1;
2184 windows_ops.to_has_execution = 1;
2185 windows_ops.to_pid_to_exec_file = windows_pid_to_exec_file;
2186 i386_use_watchpoints (&windows_ops);
2187
2188 windows_ops.to_magic = OPS_MAGIC;
2189 }
2190
2191 static void
2192 set_windows_aliases (char *argv0)
2193 {
2194 add_info_alias ("dll", "sharedlibrary", 1);
2195 }
2196
2197 void
2198 _initialize_windows_nat (void)
2199 {
2200 struct cmd_list_element *c;
2201
2202 init_windows_ops ();
2203
2204 c = add_com ("dll-symbols", class_files, dll_symbol_command,
2205 _("Load dll library symbols from FILE."));
2206 set_cmd_completer (c, filename_completer);
2207
2208 add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
2209
2210 #ifdef __CYGWIN__
2211 add_setshow_boolean_cmd ("shell", class_support, &useshell, _("\
2212 Set use of shell to start subprocess."), _("\
2213 Show use of shell to start subprocess."), NULL,
2214 NULL,
2215 NULL, /* FIXME: i18n: */
2216 &setlist, &showlist);
2217
2218 add_setshow_boolean_cmd ("cygwin-exceptions", class_support, &cygwin_exceptions, _("\
2219 Break when an exception is detected in the Cygwin DLL itself."), _("\
2220 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL,
2221 NULL,
2222 NULL, /* FIXME: i18n: */
2223 &setlist, &showlist);
2224 #endif
2225
2226 add_setshow_boolean_cmd ("new-console", class_support, &new_console, _("\
2227 Set creation of new console when creating child process."), _("\
2228 Show creation of new console when creating child process."), NULL,
2229 NULL,
2230 NULL, /* FIXME: i18n: */
2231 &setlist, &showlist);
2232
2233 add_setshow_boolean_cmd ("new-group", class_support, &new_group, _("\
2234 Set creation of new group when creating child process."), _("\
2235 Show creation of new group when creating child process."), NULL,
2236 NULL,
2237 NULL, /* FIXME: i18n: */
2238 &setlist, &showlist);
2239
2240 add_setshow_boolean_cmd ("debugexec", class_support, &debug_exec, _("\
2241 Set whether to display execution in child process."), _("\
2242 Show whether to display execution in child process."), NULL,
2243 NULL,
2244 NULL, /* FIXME: i18n: */
2245 &setlist, &showlist);
2246
2247 add_setshow_boolean_cmd ("debugevents", class_support, &debug_events, _("\
2248 Set whether to display kernel events in child process."), _("\
2249 Show whether to display kernel events in child process."), NULL,
2250 NULL,
2251 NULL, /* FIXME: i18n: */
2252 &setlist, &showlist);
2253
2254 add_setshow_boolean_cmd ("debugmemory", class_support, &debug_memory, _("\
2255 Set whether to display memory accesses in child process."), _("\
2256 Show whether to display memory accesses in child process."), NULL,
2257 NULL,
2258 NULL, /* FIXME: i18n: */
2259 &setlist, &showlist);
2260
2261 add_setshow_boolean_cmd ("debugexceptions", class_support,
2262 &debug_exceptions, _("\
2263 Set whether to display kernel exceptions in child process."), _("\
2264 Show whether to display kernel exceptions in child process."), NULL,
2265 NULL,
2266 NULL, /* FIXME: i18n: */
2267 &setlist, &showlist);
2268
2269 add_prefix_cmd ("w32", class_info, info_w32_command,
2270 _("Print information specific to Win32 debugging."),
2271 &info_w32_cmdlist, "info w32 ", 0, &infolist);
2272
2273 add_cmd ("selector", class_info, display_selectors,
2274 _("Display selectors infos."),
2275 &info_w32_cmdlist);
2276 add_target (&windows_ops);
2277 deprecated_init_ui_hook = set_windows_aliases;
2278 }
2279
2280 /* Hardware watchpoint support, adapted from go32-nat.c code. */
2281
2282 /* Pass the address ADDR to the inferior in the I'th debug register.
2283 Here we just store the address in dr array, the registers will be
2284 actually set up when windows_continue is called. */
2285 void
2286 cygwin_set_dr (int i, CORE_ADDR addr)
2287 {
2288 if (i < 0 || i > 3)
2289 internal_error (__FILE__, __LINE__,
2290 _("Invalid register %d in cygwin_set_dr.\n"), i);
2291 dr[i] = addr;
2292 debug_registers_changed = 1;
2293 debug_registers_used = 1;
2294 }
2295
2296 /* Pass the value VAL to the inferior in the DR7 debug control
2297 register. Here we just store the address in D_REGS, the watchpoint
2298 will be actually set up in windows_wait. */
2299 void
2300 cygwin_set_dr7 (unsigned val)
2301 {
2302 dr[7] = val;
2303 debug_registers_changed = 1;
2304 debug_registers_used = 1;
2305 }
2306
2307 /* Get the value of the DR6 debug status register from the inferior.
2308 Here we just return the value stored in dr[6]
2309 by the last call to thread_rec for current_event.dwThreadId id. */
2310 unsigned
2311 cygwin_get_dr6 (void)
2312 {
2313 return dr[6];
2314 }
2315
2316 /* Determine if the thread referenced by "ptid" is alive
2317 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
2318 it means that the thread has died. Otherwise it is assumed to be alive. */
2319 static int
2320 windows_thread_alive (struct target_ops *ops, ptid_t ptid)
2321 {
2322 int tid;
2323
2324 gdb_assert (ptid_get_tid (ptid) != 0);
2325 tid = ptid_get_tid (ptid);
2326
2327 return WaitForSingleObject (thread_rec (tid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
2328 FALSE : TRUE;
2329 }
2330
2331 void
2332 _initialize_check_for_gdb_ini (void)
2333 {
2334 char *homedir;
2335 if (inhibit_gdbinit)
2336 return;
2337
2338 homedir = getenv ("HOME");
2339 if (homedir)
2340 {
2341 char *p;
2342 char *oldini = (char *) alloca (strlen (homedir) +
2343 sizeof ("/gdb.ini"));
2344 strcpy (oldini, homedir);
2345 p = strchr (oldini, '\0');
2346 if (p > oldini && p[-1] != '/')
2347 *p++ = '/';
2348 strcpy (p, "gdb.ini");
2349 if (access (oldini, 0) == 0)
2350 {
2351 int len = strlen (oldini);
2352 char *newini = alloca (len + 1);
2353 sprintf (newini, "%.*s.gdbinit",
2354 (int) (len - (sizeof ("gdb.ini") - 1)), oldini);
2355 warning (_("obsolete '%s' found. Rename to '%s'."), oldini, newini);
2356 }
2357 }
2358 }
2359
2360 /* Define dummy functions which always return error for the rare cases where
2361 these functions could not be found. */
2362 static BOOL WINAPI
2363 bad_DebugActiveProcessStop (DWORD w)
2364 {
2365 return FALSE;
2366 }
2367 static BOOL WINAPI
2368 bad_DebugBreakProcess (HANDLE w)
2369 {
2370 return FALSE;
2371 }
2372 static BOOL WINAPI
2373 bad_DebugSetProcessKillOnExit (BOOL w)
2374 {
2375 return FALSE;
2376 }
2377 static BOOL WINAPI
2378 bad_EnumProcessModules (HANDLE w, HMODULE *x, DWORD y, LPDWORD z)
2379 {
2380 return FALSE;
2381 }
2382 static DWORD WINAPI
2383 bad_GetModuleFileNameExA (HANDLE w, HMODULE x, LPSTR y, DWORD z)
2384 {
2385 return 0;
2386 }
2387 static BOOL WINAPI
2388 bad_GetModuleInformation (HANDLE w, HMODULE x, LPMODULEINFO y, DWORD z)
2389 {
2390 return FALSE;
2391 }
2392
2393 /* Load any functions which may not be available in ancient versions
2394 of Windows. */
2395 void
2396 _initialize_loadable (void)
2397 {
2398 HMODULE hm = NULL;
2399
2400 hm = LoadLibrary ("kernel32.dll");
2401 if (hm)
2402 {
2403 dyn_DebugActiveProcessStop = (void *)
2404 GetProcAddress (hm, "DebugActiveProcessStop");
2405 dyn_DebugBreakProcess = (void *)
2406 GetProcAddress (hm, "DebugBreakProcess");
2407 dyn_DebugSetProcessKillOnExit = (void *)
2408 GetProcAddress (hm, "DebugSetProcessKillOnExit");
2409 }
2410
2411 /* Set variables to dummy versions of these processes if the function
2412 wasn't found in kernel32.dll. */
2413 if (!dyn_DebugBreakProcess)
2414 dyn_DebugBreakProcess = bad_DebugBreakProcess;
2415 if (!dyn_DebugActiveProcessStop || !dyn_DebugSetProcessKillOnExit)
2416 {
2417 dyn_DebugActiveProcessStop = bad_DebugActiveProcessStop;
2418 dyn_DebugSetProcessKillOnExit = bad_DebugSetProcessKillOnExit;
2419 }
2420
2421 /* Load optional functions used for retrieving filename information
2422 associated with the currently debugged process or its dlls. */
2423 hm = LoadLibrary ("psapi.dll");
2424 if (hm)
2425 {
2426 dyn_EnumProcessModules = (void *)
2427 GetProcAddress (hm, "EnumProcessModules");
2428 dyn_GetModuleInformation = (void *)
2429 GetProcAddress (hm, "GetModuleInformation");
2430 dyn_GetModuleFileNameExA = (void *)
2431 GetProcAddress (hm, "GetModuleFileNameExA");
2432 }
2433
2434 if (!dyn_EnumProcessModules || !dyn_GetModuleInformation || !dyn_GetModuleFileNameExA)
2435 {
2436 /* Set variables to dummy versions of these processes if the function
2437 wasn't found in psapi.dll. */
2438 dyn_EnumProcessModules = bad_EnumProcessModules;
2439 dyn_GetModuleInformation = bad_GetModuleInformation;
2440 dyn_GetModuleFileNameExA = bad_GetModuleFileNameExA;
2441 /* This will probably fail on Windows 9x/Me. Let the user know that we're
2442 missing some functionality. */
2443 warning(_("cannot automatically find executable file or library to read symbols. Use \"file\" or \"dll\" command to load executable/libraries directly."));
2444 }
2445 }
This page took 0.146047 seconds and 4 git commands to generate.