daily update
[deliverable/binutils-gdb.git] / gdb / windows-nat.c
1 /* Target-vector operations for controlling win32 child processes, for GDB.
2
3 Copyright 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002 Free
4 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 2 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 eve nthe 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, write to the Free Software
22 Foundation, Inc., 59 Temple Place - Suite 330,
23 Boston, MA 02111-1307, USA. */
24
25 /* by Steve Chamberlain, sac@cygnus.com */
26
27 /* We assume we're being built with and will be used for cygwin. */
28
29 #include "defs.h"
30 #include "tm.h" /* required for SSE registers */
31 #include "frame.h" /* required by inferior.h */
32 #include "inferior.h"
33 #include "target.h"
34 #include "gdbcore.h"
35 #include "command.h"
36 #include "completer.h"
37 #include "regcache.h"
38 #include "top.h"
39 #include "i386-tdep.h"
40 #include <signal.h>
41 #include <sys/types.h>
42 #include <fcntl.h>
43 #include <stdlib.h>
44 #include <windows.h>
45 #include <imagehlp.h>
46 #include <sys/cygwin.h>
47
48 #include "buildsym.h"
49 #include "symfile.h"
50 #include "objfiles.h"
51 #include "gdb_string.h"
52 #include "gdbthread.h"
53 #include "gdbcmd.h"
54 #include <sys/param.h>
55 #include <unistd.h>
56
57 /* The ui's event loop. */
58 extern int (*ui_loop_hook) (int signo);
59
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
64 enum
65 {
66 FLAG_TRACE_BIT = 0x100,
67 CONTEXT_DEBUGGER = (CONTEXT_FULL | CONTEXT_FLOATING_POINT)
68 };
69 #endif
70 #include <sys/procfs.h>
71 #include <psapi.h>
72
73 #ifdef HAVE_SSE_REGS
74 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_EXTENDED_REGISTERS
75 #else
76 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER
77 #endif
78
79
80 /* The string sent by cygwin when it processes a signal.
81 FIXME: This should be in a cygwin include file. */
82 #define CYGWIN_SIGNAL_STRING "cygwin: signal"
83
84 #define CHECK(x) check (x, __FILE__,__LINE__)
85 #define DEBUG_EXEC(x) if (debug_exec) printf x
86 #define DEBUG_EVENTS(x) if (debug_events) printf x
87 #define DEBUG_MEM(x) if (debug_memory) printf x
88 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf x
89
90 /* Forward declaration */
91 extern struct target_ops child_ops;
92
93 static void child_stop (void);
94 static int win32_child_thread_alive (ptid_t);
95 void child_kill_inferior (void);
96
97 static int last_sig = 0; /* Set if a signal was received from the
98 debugged process */
99 /* Thread information structure used to track information that is
100 not available in gdb's thread structure. */
101 typedef struct thread_info_struct
102 {
103 struct thread_info_struct *next;
104 DWORD id;
105 HANDLE h;
106 char *name;
107 int suspend_count;
108 CONTEXT context;
109 STACKFRAME sf;
110 }
111 thread_info;
112
113 static thread_info thread_head;
114
115 /* The process and thread handles for the above context. */
116
117 static DEBUG_EVENT current_event; /* The current debug event from
118 WaitForDebugEvent */
119 static HANDLE current_process_handle; /* Currently executing process */
120 static thread_info *current_thread; /* Info on currently selected thread */
121 static DWORD main_thread_id; /* Thread ID of the main thread */
122
123 /* Counts of things. */
124 static int exception_count = 0;
125 static int event_count = 0;
126
127 /* User options. */
128 static int new_console = 0;
129 static int new_group = 1;
130 static int debug_exec = 0; /* show execution */
131 static int debug_events = 0; /* show events from kernel */
132 static int debug_memory = 0; /* show target memory accesses */
133 static int debug_exceptions = 0; /* show target exceptions */
134
135 /* This vector maps GDB's idea of a register's number into an address
136 in the win32 exception context vector.
137
138 It also contains the bit mask needed to load the register in question.
139
140 One day we could read a reg, we could inspect the context we
141 already have loaded, if it doesn't have the bit set that we need,
142 we read that set of registers in using GetThreadContext. If the
143 context already contains what we need, we just unpack it. Then to
144 write a register, first we have to ensure that the context contains
145 the other regs of the group, and then we copy the info in and set
146 out bit. */
147
148 #define context_offset(x) ((int)&(((CONTEXT *)NULL)->x))
149 static const int mappings[] =
150 {
151 context_offset (Eax),
152 context_offset (Ecx),
153 context_offset (Edx),
154 context_offset (Ebx),
155 context_offset (Esp),
156 context_offset (Ebp),
157 context_offset (Esi),
158 context_offset (Edi),
159 context_offset (Eip),
160 context_offset (EFlags),
161 context_offset (SegCs),
162 context_offset (SegSs),
163 context_offset (SegDs),
164 context_offset (SegEs),
165 context_offset (SegFs),
166 context_offset (SegGs),
167 context_offset (FloatSave.RegisterArea[0 * 10]),
168 context_offset (FloatSave.RegisterArea[1 * 10]),
169 context_offset (FloatSave.RegisterArea[2 * 10]),
170 context_offset (FloatSave.RegisterArea[3 * 10]),
171 context_offset (FloatSave.RegisterArea[4 * 10]),
172 context_offset (FloatSave.RegisterArea[5 * 10]),
173 context_offset (FloatSave.RegisterArea[6 * 10]),
174 context_offset (FloatSave.RegisterArea[7 * 10]),
175 context_offset (FloatSave.ControlWord),
176 context_offset (FloatSave.StatusWord),
177 context_offset (FloatSave.TagWord),
178 context_offset (FloatSave.ErrorSelector),
179 context_offset (FloatSave.ErrorOffset),
180 context_offset (FloatSave.DataSelector),
181 context_offset (FloatSave.DataOffset),
182 context_offset (FloatSave.ErrorSelector)
183 #ifdef HAVE_SSE_REGS
184 /* XMM0-7 */ ,
185 context_offset (ExtendedRegisters[10*16]),
186 context_offset (ExtendedRegisters[11*16]),
187 context_offset (ExtendedRegisters[12*16]),
188 context_offset (ExtendedRegisters[13*16]),
189 context_offset (ExtendedRegisters[14*16]),
190 context_offset (ExtendedRegisters[15*16]),
191 context_offset (ExtendedRegisters[16*16]),
192 context_offset (ExtendedRegisters[17*16]),
193 /* MXCSR */
194 context_offset (ExtendedRegisters[24])
195 #endif
196 };
197
198 #undef context_offset
199
200 /* This vector maps the target's idea of an exception (extracted
201 from the DEBUG_EVENT structure) to GDB's idea. */
202
203 struct xlate_exception
204 {
205 int them;
206 enum target_signal us;
207 };
208
209 static const struct xlate_exception
210 xlate[] =
211 {
212 {EXCEPTION_ACCESS_VIOLATION, TARGET_SIGNAL_SEGV},
213 {STATUS_STACK_OVERFLOW, TARGET_SIGNAL_SEGV},
214 {EXCEPTION_BREAKPOINT, TARGET_SIGNAL_TRAP},
215 {DBG_CONTROL_C, TARGET_SIGNAL_INT},
216 {EXCEPTION_SINGLE_STEP, TARGET_SIGNAL_TRAP},
217 {-1, -1}};
218
219 /* Find a thread record given a thread id.
220 If get_context then also retrieve the context for this
221 thread. */
222 static thread_info *
223 thread_rec (DWORD id, int get_context)
224 {
225 thread_info *th;
226
227 for (th = &thread_head; (th = th->next) != NULL;)
228 if (th->id == id)
229 {
230 if (!th->suspend_count && get_context)
231 {
232 if (get_context > 0 && id != current_event.dwThreadId)
233 th->suspend_count = SuspendThread (th->h) + 1;
234 else if (get_context < 0)
235 th->suspend_count = -1;
236
237 th->context.ContextFlags = CONTEXT_DEBUGGER_DR;
238 GetThreadContext (th->h, &th->context);
239 }
240 return th;
241 }
242
243 return NULL;
244 }
245
246 /* Add a thread to the thread list */
247 static thread_info *
248 child_add_thread (DWORD id, HANDLE h)
249 {
250 thread_info *th;
251
252 if ((th = thread_rec (id, FALSE)))
253 return th;
254
255 th = (thread_info *) xmalloc (sizeof (*th));
256 memset (th, 0, sizeof (*th));
257 th->id = id;
258 th->h = h;
259 th->next = thread_head.next;
260 thread_head.next = th;
261 add_thread (pid_to_ptid (id));
262 return th;
263 }
264
265 /* Clear out any old thread list and reintialize it to a
266 pristine state. */
267 static void
268 child_init_thread_list (void)
269 {
270 thread_info *th = &thread_head;
271
272 DEBUG_EVENTS (("gdb: child_init_thread_list\n"));
273 init_thread_list ();
274 while (th->next != NULL)
275 {
276 thread_info *here = th->next;
277 th->next = here->next;
278 (void) CloseHandle (here->h);
279 xfree (here);
280 }
281 }
282
283 /* Delete a thread from the list of threads */
284 static void
285 child_delete_thread (DWORD id)
286 {
287 thread_info *th;
288
289 if (info_verbose)
290 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (pid_to_ptid (id)));
291 delete_thread (pid_to_ptid (id));
292
293 for (th = &thread_head;
294 th->next != NULL && th->next->id != id;
295 th = th->next)
296 continue;
297
298 if (th->next != NULL)
299 {
300 thread_info *here = th->next;
301 th->next = here->next;
302 CloseHandle (here->h);
303 xfree (here);
304 }
305 }
306
307 static void
308 check (BOOL ok, const char *file, int line)
309 {
310 if (!ok)
311 printf_filtered ("error return %s:%d was %lu\n", file, line, GetLastError ());
312 }
313
314 static void
315 do_child_fetch_inferior_registers (int r)
316 {
317 char *context_offset = ((char *) &current_thread->context) + mappings[r];
318 long l;
319 if (r == FCS_REGNUM)
320 {
321 l = *((long *) context_offset) & 0xffff;
322 supply_register (r, (char *) &l);
323 }
324 else if (r == FOP_REGNUM)
325 {
326 l = (*((long *) context_offset) >> 16) & ((1 << 11) - 1);
327 supply_register (r, (char *) &l);
328 }
329 else if (r >= 0)
330 supply_register (r, context_offset);
331 else
332 {
333 for (r = 0; r < NUM_REGS; r++)
334 do_child_fetch_inferior_registers (r);
335 }
336 }
337
338 static void
339 child_fetch_inferior_registers (int r)
340 {
341 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
342 do_child_fetch_inferior_registers (r);
343 }
344
345 static void
346 do_child_store_inferior_registers (int r)
347 {
348 if (r >= 0)
349 read_register_gen (r, ((char *) &current_thread->context) + mappings[r]);
350 else
351 {
352 for (r = 0; r < NUM_REGS; r++)
353 do_child_store_inferior_registers (r);
354 }
355 }
356
357 /* Store a new register value into the current thread context */
358 static void
359 child_store_inferior_registers (int r)
360 {
361 current_thread = thread_rec (PIDGET (inferior_ptid), TRUE);
362 do_child_store_inferior_registers (r);
363 }
364
365 static int psapi_loaded = 0;
366 static HMODULE psapi_module_handle = NULL;
367 static BOOL WINAPI (*psapi_EnumProcessModules) (HANDLE, HMODULE *, DWORD, LPDWORD) = NULL;
368 static BOOL WINAPI (*psapi_GetModuleInformation) (HANDLE, HMODULE, LPMODULEINFO, DWORD) = NULL;
369 static DWORD WINAPI (*psapi_GetModuleFileNameExA) (HANDLE, HMODULE, LPSTR, DWORD) = NULL;
370
371 int
372 psapi_get_dll_name (DWORD BaseAddress, char *dll_name_ret)
373 {
374 DWORD len;
375 MODULEINFO mi;
376 int i;
377 HMODULE dh_buf[1];
378 HMODULE *DllHandle = dh_buf;
379 DWORD cbNeeded;
380 BOOL ok;
381
382 if (!psapi_loaded ||
383 psapi_EnumProcessModules == NULL ||
384 psapi_GetModuleInformation == NULL ||
385 psapi_GetModuleFileNameExA == NULL)
386 {
387 if (psapi_loaded)
388 goto failed;
389 psapi_loaded = 1;
390 psapi_module_handle = LoadLibrary ("psapi.dll");
391 if (!psapi_module_handle)
392 {
393 /* printf_unfiltered ("error loading psapi.dll: %u", GetLastError ()); */
394 goto failed;
395 }
396 psapi_EnumProcessModules = GetProcAddress (psapi_module_handle, "EnumProcessModules");
397 psapi_GetModuleInformation = GetProcAddress (psapi_module_handle, "GetModuleInformation");
398 psapi_GetModuleFileNameExA = (void *) GetProcAddress (psapi_module_handle,
399 "GetModuleFileNameExA");
400 if (psapi_EnumProcessModules == NULL ||
401 psapi_GetModuleInformation == NULL ||
402 psapi_GetModuleFileNameExA == NULL)
403 goto failed;
404 }
405
406 cbNeeded = 0;
407 ok = (*psapi_EnumProcessModules) (current_process_handle,
408 DllHandle,
409 sizeof (HMODULE),
410 &cbNeeded);
411
412 if (!ok || !cbNeeded)
413 goto failed;
414
415 DllHandle = (HMODULE *) alloca (cbNeeded);
416 if (!DllHandle)
417 goto failed;
418
419 ok = (*psapi_EnumProcessModules) (current_process_handle,
420 DllHandle,
421 cbNeeded,
422 &cbNeeded);
423 if (!ok)
424 goto failed;
425
426 for (i = 0; i < (int) (cbNeeded / sizeof (HMODULE)); i++)
427 {
428 if (!(*psapi_GetModuleInformation) (current_process_handle,
429 DllHandle[i],
430 &mi,
431 sizeof (mi)))
432 error ("Can't get module info");
433
434 len = (*psapi_GetModuleFileNameExA) (current_process_handle,
435 DllHandle[i],
436 dll_name_ret,
437 MAX_PATH);
438 if (len == 0)
439 error ("Error getting dll name: %u\n", GetLastError ());
440
441 if ((DWORD) (mi.lpBaseOfDll) == BaseAddress)
442 return 1;
443 }
444
445 failed:
446 dll_name_ret[0] = '\0';
447 return 0;
448 }
449
450 /* Encapsulate the information required in a call to
451 symbol_file_add_args */
452 struct safe_symbol_file_add_args
453 {
454 char *name;
455 int from_tty;
456 struct section_addr_info *addrs;
457 int mainline;
458 int flags;
459 struct ui_file *err, *out;
460 struct objfile *ret;
461 };
462
463 /* Maintain a linked list of "so" information. */
464 struct so_stuff
465 {
466 struct so_stuff *next;
467 DWORD load_addr;
468 int loaded;
469 struct objfile *objfile;
470 char name[1];
471 } solib_start, *solib_end;
472
473 /* Call symbol_file_add with stderr redirected. We don't care if there
474 are errors. */
475 static int
476 safe_symbol_file_add_stub (void *argv)
477 {
478 #define p ((struct safe_symbol_file_add_args *)argv)
479 struct so_stuff *so = &solib_start;
480
481 while ((so = so->next))
482 if (so->loaded && strcasecmp (so->name, p->name) == 0)
483 return 0;
484 p->ret = symbol_file_add (p->name, p->from_tty, p->addrs, p->mainline, p->flags);
485 return !!p->ret;
486 #undef p
487 }
488
489 /* Restore gdb's stderr after calling symbol_file_add */
490 static void
491 safe_symbol_file_add_cleanup (void *p)
492 {
493 #define sp ((struct safe_symbol_file_add_args *)p)
494 gdb_flush (gdb_stderr);
495 gdb_flush (gdb_stdout);
496 ui_file_delete (gdb_stderr);
497 ui_file_delete (gdb_stdout);
498 gdb_stderr = sp->err;
499 gdb_stdout = sp->out;
500 #undef sp
501 }
502
503 /* symbol_file_add wrapper that prevents errors from being displayed. */
504 static struct objfile *
505 safe_symbol_file_add (char *name, int from_tty,
506 struct section_addr_info *addrs,
507 int mainline, int flags)
508 {
509 struct safe_symbol_file_add_args p;
510 struct cleanup *cleanup;
511
512 cleanup = make_cleanup (safe_symbol_file_add_cleanup, &p);
513
514 p.err = gdb_stderr;
515 p.out = gdb_stdout;
516 gdb_flush (gdb_stderr);
517 gdb_flush (gdb_stdout);
518 gdb_stderr = ui_file_new ();
519 gdb_stdout = ui_file_new ();
520 p.name = name;
521 p.from_tty = from_tty;
522 p.addrs = addrs;
523 p.mainline = mainline;
524 p.flags = flags;
525 catch_errors (safe_symbol_file_add_stub, &p, "", RETURN_MASK_ERROR);
526
527 do_cleanups (cleanup);
528 return p.ret;
529 }
530
531 /* Remember the maximum DLL length for printing in info dll command. */
532 int max_dll_name_len;
533
534 static void
535 register_loaded_dll (const char *name, DWORD load_addr)
536 {
537 struct so_stuff *so;
538 char ppath[MAX_PATH + 1];
539 char buf[MAX_PATH + 1];
540 char cwd[MAX_PATH + 1];
541 char *p;
542 WIN32_FIND_DATA w32_fd;
543 HANDLE h = FindFirstFile(name, &w32_fd);
544 size_t len;
545
546 FindClose (h);
547 strcpy (buf, name);
548 if (GetCurrentDirectory (MAX_PATH + 1, cwd))
549 {
550 p = strrchr (buf, '\\');
551 if (p)
552 p[1] = '\0';
553 SetCurrentDirectory (buf);
554 GetFullPathName (w32_fd.cFileName, MAX_PATH, buf, &p);
555 SetCurrentDirectory (cwd);
556 }
557
558 cygwin_conv_to_posix_path (buf, ppath);
559 so = (struct so_stuff *) xmalloc (sizeof (struct so_stuff) + strlen (ppath) + 8 + 1);
560 so->loaded = 0;
561 so->load_addr = load_addr;
562 so->next = NULL;
563 so->objfile = NULL;
564 strcpy (so->name, ppath);
565
566 solib_end->next = so;
567 solib_end = so;
568 len = strlen (ppath);
569 if (len > max_dll_name_len)
570 max_dll_name_len = len;
571 }
572
573 /* Wait for child to do something. Return pid of child, or -1 in case
574 of error; store status through argument pointer OURSTATUS. */
575 static int
576 handle_load_dll (void *dummy)
577 {
578 LOAD_DLL_DEBUG_INFO *event = &current_event.u.LoadDll;
579 DWORD dll_name_ptr;
580 DWORD done;
581 char dll_buf[MAX_PATH + 1];
582 char *dll_name = NULL;
583 char *p;
584
585 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
586
587 if (!psapi_get_dll_name ((DWORD) (event->lpBaseOfDll), dll_buf))
588 dll_buf[0] = dll_buf[sizeof (dll_buf) - 1] = '\0';
589
590 dll_name = dll_buf;
591
592 /* Attempt to read the name of the dll that was detected.
593 This is documented to work only when actively debugging
594 a program. It will not work for attached processes. */
595 if (dll_name == NULL || *dll_name == '\0')
596 {
597 DWORD size = event->fUnicode ? sizeof (WCHAR) : sizeof (char);
598 int len = 0;
599 char b[2];
600
601 ReadProcessMemory (current_process_handle,
602 (LPCVOID) event->lpImageName,
603 (char *) &dll_name_ptr,
604 sizeof (dll_name_ptr), &done);
605
606 /* See if we could read the address of a string, and that the
607 address isn't null. */
608
609 if (done != sizeof (dll_name_ptr) || !dll_name_ptr)
610 return 1;
611
612 do
613 {
614 ReadProcessMemory (current_process_handle,
615 (LPCVOID) (dll_name_ptr + len * size),
616 &b,
617 size,
618 &done);
619 len++;
620 }
621 while ((b[0] != 0 || b[size - 1] != 0) && done == size);
622
623 dll_name = alloca (len);
624
625 if (event->fUnicode)
626 {
627 WCHAR *unicode_dll_name = (WCHAR *) alloca (len * sizeof (WCHAR));
628 ReadProcessMemory (current_process_handle,
629 (LPCVOID) dll_name_ptr,
630 unicode_dll_name,
631 len * sizeof (WCHAR),
632 &done);
633
634 WideCharToMultiByte (CP_ACP, 0,
635 unicode_dll_name, len,
636 dll_name, len, 0, 0);
637 }
638 else
639 {
640 ReadProcessMemory (current_process_handle,
641 (LPCVOID) dll_name_ptr,
642 dll_name,
643 len,
644 &done);
645 }
646 }
647
648 if (!dll_name)
649 return 1;
650
651 register_loaded_dll (dll_name, (DWORD) event->lpBaseOfDll + 0x1000);
652
653 return 1;
654 }
655
656 static int
657 handle_unload_dll (void *dummy)
658 {
659 DWORD lpBaseOfDll = (DWORD) current_event.u.UnloadDll.lpBaseOfDll + 0x1000;
660 struct so_stuff *so;
661
662 for (so = &solib_start; so->next != NULL; so = so->next)
663 if (so->next->load_addr == lpBaseOfDll)
664 {
665 struct so_stuff *sodel = so->next;
666 so->next = sodel->next;
667 if (!so->next)
668 solib_end = so;
669 if (sodel->objfile)
670 free_objfile (sodel->objfile);
671 xfree(sodel);
672 return 1;
673 }
674 error ("Error: dll starting at 0x%lx not found.\n", (DWORD) lpBaseOfDll);
675
676 return 0;
677 }
678
679 /* Return name of last loaded DLL. */
680 char *
681 child_solib_loaded_library_pathname (int pid)
682 {
683 return !solib_end || !solib_end->name[0] ? NULL : solib_end->name;
684 }
685
686 /* Clear list of loaded DLLs. */
687 void
688 child_clear_solibs (void)
689 {
690 struct so_stuff *so, *so1 = solib_start.next;
691
692 while ((so = so1) != NULL)
693 {
694 so1 = so->next;
695 xfree (so);
696 }
697
698 solib_start.next = NULL;
699 solib_start.objfile = NULL;
700 solib_end = &solib_start;
701 max_dll_name_len = sizeof ("DLL Name") - 1;
702 }
703
704 /* Add DLL symbol information. */
705 static struct objfile *
706 solib_symbols_add (char *name, int from_tty, CORE_ADDR load_addr)
707 {
708 struct section_addr_info section_addrs;
709
710 /* The symbols in a dll are offset by 0x1000, which is the
711 the offset from 0 of the first byte in an image - because
712 of the file header and the section alignment. */
713
714 if (!name || !name[0])
715 return NULL;
716
717 memset (&section_addrs, 0, sizeof (section_addrs));
718 section_addrs.other[0].name = ".text";
719 section_addrs.other[0].addr = load_addr;
720 return safe_symbol_file_add (name, from_tty, NULL, 0, OBJF_SHARED);
721 }
722
723 /* Load DLL symbol info. */
724 void
725 dll_symbol_command (char *args, int from_tty)
726 {
727 int n;
728 dont_repeat ();
729
730 if (args == NULL)
731 error ("dll-symbols requires a file name");
732
733 n = strlen (args);
734 if (n > 4 && strcasecmp (args + n - 4, ".dll") != 0)
735 {
736 char *newargs = (char *) alloca (n + 4 + 1);
737 strcpy (newargs, args);
738 strcat (newargs, ".dll");
739 args = newargs;
740 }
741
742 safe_symbol_file_add (args, from_tty, NULL, 0, OBJF_SHARED | OBJF_USERLOADED);
743 }
744
745 /* List currently loaded DLLs. */
746 void
747 info_dll_command (char *ignore, int from_tty)
748 {
749 struct so_stuff *so = &solib_start;
750
751 if (!so->next)
752 return;
753
754 printf ("%*s Load Address\n", -max_dll_name_len, "DLL Name");
755 while ((so = so->next) != NULL)
756 printf_filtered ("%*s %08lx\n", -max_dll_name_len, so->name, so->load_addr);
757
758 return;
759 }
760
761 /* Handle DEBUG_STRING output from child process.
762 Cygwin prepends its messages with a "cygwin:". Interpret this as
763 a Cygwin signal. Otherwise just print the string as a warning. */
764 static int
765 handle_output_debug_string (struct target_waitstatus *ourstatus)
766 {
767 char *s;
768 int gotasig = FALSE;
769
770 if (!target_read_string
771 ((CORE_ADDR) current_event.u.DebugString.lpDebugStringData, &s, 1024, 0)
772 || !s || !*s)
773 return gotasig;
774
775 if (strncmp (s, CYGWIN_SIGNAL_STRING, sizeof (CYGWIN_SIGNAL_STRING) - 1) != 0)
776 {
777 if (strncmp (s, "cYg", 3) != 0)
778 warning ("%s", s);
779 }
780 else
781 {
782 char *p;
783 int sig = strtol (s + sizeof (CYGWIN_SIGNAL_STRING) - 1, &p, 0);
784 gotasig = target_signal_from_host (sig);
785 ourstatus->value.sig = gotasig;
786 if (gotasig)
787 ourstatus->kind = TARGET_WAITKIND_STOPPED;
788 }
789
790 xfree (s);
791 return gotasig;
792 }
793
794 static int
795 handle_exception (struct target_waitstatus *ourstatus)
796 {
797 thread_info *th;
798 DWORD code = current_event.u.Exception.ExceptionRecord.ExceptionCode;
799
800 ourstatus->kind = TARGET_WAITKIND_STOPPED;
801
802 /* Record the context of the current thread */
803 th = thread_rec (current_event.dwThreadId, -1);
804
805 switch (code)
806 {
807 case EXCEPTION_ACCESS_VIOLATION:
808 DEBUG_EXCEPT (("gdb: Target exception ACCESS_VIOLATION at 0x%08lx\n",
809 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
810 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
811 last_sig = SIGSEGV;
812 break;
813 case STATUS_FLOAT_UNDERFLOW:
814 case STATUS_FLOAT_DIVIDE_BY_ZERO:
815 case STATUS_FLOAT_OVERFLOW:
816 case STATUS_INTEGER_DIVIDE_BY_ZERO:
817 DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
818 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
819 ourstatus->value.sig = TARGET_SIGNAL_FPE;
820 last_sig = SIGFPE;
821 break;
822 case STATUS_STACK_OVERFLOW:
823 DEBUG_EXCEPT (("gdb: Target exception STACK_OVERFLOW at 0x%08lx\n",
824 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
825 ourstatus->value.sig = TARGET_SIGNAL_SEGV;
826 break;
827 case EXCEPTION_BREAKPOINT:
828 DEBUG_EXCEPT (("gdb: Target exception BREAKPOINT at 0x%08lx\n",
829 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
830 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
831 break;
832 case DBG_CONTROL_C:
833 DEBUG_EXCEPT (("gdb: Target exception CONTROL_C at 0x%08lx\n",
834 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
835 ourstatus->value.sig = TARGET_SIGNAL_INT;
836 last_sig = SIGINT; /* FIXME - should check pass state */
837 break;
838 case EXCEPTION_SINGLE_STEP:
839 DEBUG_EXCEPT (("gdb: Target exception SINGLE_STEP at 0x%08lx\n",
840 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
841 ourstatus->value.sig = TARGET_SIGNAL_TRAP;
842 break;
843 case EXCEPTION_ILLEGAL_INSTRUCTION:
844 DEBUG_EXCEPT (("gdb: Target exception SINGLE_ILL at 0x%08lx\n",
845 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress));
846 ourstatus->value.sig = TARGET_SIGNAL_ILL;
847 last_sig = SIGILL;
848 break;
849 default:
850 if (current_event.u.Exception.dwFirstChance)
851 return 0;
852 printf_unfiltered ("gdb: unknown target exception 0x%08lx at 0x%08lx\n",
853 current_event.u.Exception.ExceptionRecord.ExceptionCode,
854 (DWORD) current_event.u.Exception.ExceptionRecord.ExceptionAddress);
855 ourstatus->value.sig = TARGET_SIGNAL_UNKNOWN;
856 break;
857 }
858 exception_count++;
859 return 1;
860 }
861
862 /* Resume all artificially suspended threads if we are continuing
863 execution */
864 static BOOL
865 child_continue (DWORD continue_status, int id)
866 {
867 int i;
868 thread_info *th;
869 BOOL res;
870
871 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, DBG_CONTINUE);\n",
872 current_event.dwProcessId, current_event.dwThreadId));
873 res = ContinueDebugEvent (current_event.dwProcessId,
874 current_event.dwThreadId,
875 continue_status);
876 continue_status = 0;
877 if (res)
878 for (th = &thread_head; (th = th->next) != NULL;)
879 if (((id == -1) || (id == (int) th->id)) && th->suspend_count)
880 {
881 for (i = 0; i < th->suspend_count; i++)
882 (void) ResumeThread (th->h);
883 th->suspend_count = 0;
884 }
885
886 return res;
887 }
888
889 /* Get the next event from the child. Return 1 if the event requires
890 handling by WFI (or whatever).
891 */
892 static int
893 get_child_debug_event (int pid, struct target_waitstatus *ourstatus)
894 {
895 BOOL debug_event;
896 DWORD continue_status, event_code;
897 thread_info *th = NULL;
898 static thread_info dummy_thread_info;
899 int retval = 0;
900
901 last_sig = 0;
902
903 if (!(debug_event = WaitForDebugEvent (&current_event, 1000)))
904 goto out;
905
906 event_count++;
907 continue_status = DBG_CONTINUE;
908
909 event_code = current_event.dwDebugEventCode;
910 ourstatus->kind = TARGET_WAITKIND_SPURIOUS;
911
912 switch (event_code)
913 {
914 case CREATE_THREAD_DEBUG_EVENT:
915 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
916 (unsigned) current_event.dwProcessId,
917 (unsigned) current_event.dwThreadId,
918 "CREATE_THREAD_DEBUG_EVENT"));
919 /* Record the existence of this thread */
920 th = child_add_thread (current_event.dwThreadId,
921 current_event.u.CreateThread.hThread);
922 if (info_verbose)
923 printf_unfiltered ("[New %s]\n",
924 target_pid_to_str (
925 pid_to_ptid (current_event.dwThreadId)));
926 retval = current_event.dwThreadId;
927 break;
928
929 case EXIT_THREAD_DEBUG_EVENT:
930 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
931 (unsigned) current_event.dwProcessId,
932 (unsigned) current_event.dwThreadId,
933 "EXIT_THREAD_DEBUG_EVENT"));
934 child_delete_thread (current_event.dwThreadId);
935 th = &dummy_thread_info;
936 break;
937
938 case CREATE_PROCESS_DEBUG_EVENT:
939 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
940 (unsigned) current_event.dwProcessId,
941 (unsigned) current_event.dwThreadId,
942 "CREATE_PROCESS_DEBUG_EVENT"));
943 CloseHandle (current_event.u.CreateProcessInfo.hFile);
944 current_process_handle = current_event.u.CreateProcessInfo.hProcess;
945
946 main_thread_id = current_event.dwThreadId;
947 /* Add the main thread */
948 #if 0
949 th = child_add_thread (current_event.dwProcessId,
950 current_event.u.CreateProcessInfo.hProcess);
951 #endif
952 th = child_add_thread (main_thread_id,
953 current_event.u.CreateProcessInfo.hThread);
954 retval = ourstatus->value.related_pid = current_event.dwThreadId;
955 break;
956
957 case EXIT_PROCESS_DEBUG_EVENT:
958 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
959 (unsigned) current_event.dwProcessId,
960 (unsigned) current_event.dwThreadId,
961 "EXIT_PROCESS_DEBUG_EVENT"));
962 ourstatus->kind = TARGET_WAITKIND_EXITED;
963 ourstatus->value.integer = current_event.u.ExitProcess.dwExitCode;
964 CloseHandle (current_process_handle);
965 retval = main_thread_id;
966 break;
967
968 case LOAD_DLL_DEBUG_EVENT:
969 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
970 (unsigned) current_event.dwProcessId,
971 (unsigned) current_event.dwThreadId,
972 "LOAD_DLL_DEBUG_EVENT"));
973 CloseHandle (current_event.u.LoadDll.hFile);
974 catch_errors (handle_load_dll, NULL, (char *) "", RETURN_MASK_ALL);
975 registers_changed (); /* mark all regs invalid */
976 ourstatus->kind = TARGET_WAITKIND_LOADED;
977 ourstatus->value.integer = 0;
978 retval = main_thread_id;
979 break;
980
981 case UNLOAD_DLL_DEBUG_EVENT:
982 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
983 (unsigned) current_event.dwProcessId,
984 (unsigned) current_event.dwThreadId,
985 "UNLOAD_DLL_DEBUG_EVENT"));
986 catch_errors (handle_unload_dll, NULL, (char *) "", RETURN_MASK_ALL);
987 registers_changed (); /* mark all regs invalid */
988 /* ourstatus->kind = TARGET_WAITKIND_UNLOADED;
989 does not exist yet. */
990 break;
991
992 case EXCEPTION_DEBUG_EVENT:
993 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
994 (unsigned) current_event.dwProcessId,
995 (unsigned) current_event.dwThreadId,
996 "EXCEPTION_DEBUG_EVENT"));
997 if (handle_exception (ourstatus))
998 retval = current_event.dwThreadId;
999 break;
1000
1001 case OUTPUT_DEBUG_STRING_EVENT: /* message from the kernel */
1002 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1003 (unsigned) current_event.dwProcessId,
1004 (unsigned) current_event.dwThreadId,
1005 "OUTPUT_DEBUG_STRING_EVENT"));
1006 if (handle_output_debug_string (ourstatus))
1007 retval = main_thread_id;
1008 break;
1009
1010 default:
1011 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
1012 (DWORD) current_event.dwProcessId,
1013 (DWORD) current_event.dwThreadId);
1014 printf_unfiltered (" unknown event code %ld\n",
1015 current_event.dwDebugEventCode);
1016 break;
1017 }
1018
1019 if (!retval)
1020 CHECK (child_continue (continue_status, -1));
1021 else
1022 {
1023 current_thread = th ? : thread_rec (current_event.dwThreadId, TRUE);
1024 inferior_ptid = pid_to_ptid (retval);
1025 }
1026
1027 out:
1028 return retval;
1029 }
1030
1031 /* Wait for interesting events to occur in the target process. */
1032 static ptid_t
1033 child_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
1034 {
1035 int pid = PIDGET (ptid);
1036
1037 /* We loop when we get a non-standard exception rather than return
1038 with a SPURIOUS because resume can try and step or modify things,
1039 which needs a current_thread->h. But some of these exceptions mark
1040 the birth or death of threads, which mean that the current thread
1041 isn't necessarily what you think it is. */
1042
1043 while (1)
1044 {
1045 int retval = get_child_debug_event (pid, ourstatus);
1046 if (retval)
1047 return pid_to_ptid (retval);
1048 else
1049 {
1050 int detach = 0;
1051
1052 if (ui_loop_hook != NULL)
1053 detach = ui_loop_hook (0);
1054
1055 if (detach)
1056 child_kill_inferior ();
1057 }
1058 }
1059 }
1060
1061 static void
1062 do_initial_child_stuff (DWORD pid)
1063 {
1064 extern int stop_after_trap;
1065
1066 last_sig = 0;
1067 event_count = 0;
1068 exception_count = 0;
1069 current_event.dwProcessId = pid;
1070 memset (&current_event, 0, sizeof (current_event));
1071 push_target (&child_ops);
1072 child_init_thread_list ();
1073 child_clear_solibs ();
1074 clear_proceed_status ();
1075 init_wait_for_inferior ();
1076
1077 target_terminal_init ();
1078 target_terminal_inferior ();
1079
1080 while (1)
1081 {
1082 stop_after_trap = 1;
1083 wait_for_inferior ();
1084 if (stop_signal != TARGET_SIGNAL_TRAP)
1085 resume (0, stop_signal);
1086 else
1087 break;
1088 }
1089 stop_after_trap = 0;
1090 return;
1091 }
1092
1093 /* Since Windows XP, detaching from a process is supported by Windows.
1094 The following code tries loading the appropriate functions dynamically.
1095 If loading these functions succeeds use them to actually detach from
1096 the inferior process, otherwise behave as usual, pretending that
1097 detach has worked. */
1098 static BOOL WINAPI (*DebugSetProcessKillOnExit)(BOOL);
1099 static BOOL WINAPI (*DebugActiveProcessStop)(DWORD);
1100
1101 static int
1102 has_detach_ability ()
1103 {
1104 static HMODULE kernel32 = NULL;
1105
1106 if (!kernel32)
1107 kernel32 = LoadLibrary ("kernel32.dll");
1108 if (kernel32)
1109 {
1110 if (!DebugSetProcessKillOnExit)
1111 DebugSetProcessKillOnExit = GetProcAddress (kernel32,
1112 "DebugSetProcessKillOnExit");
1113 if (!DebugActiveProcessStop)
1114 DebugActiveProcessStop = GetProcAddress (kernel32,
1115 "DebugActiveProcessStop");
1116 if (DebugSetProcessKillOnExit && DebugActiveProcessStop)
1117 return 1;
1118 }
1119 return 0;
1120 }
1121
1122 /* Attach to process PID, then initialize for debugging it. */
1123 static void
1124 child_attach (char *args, int from_tty)
1125 {
1126 BOOL ok;
1127 DWORD pid;
1128
1129 if (!args)
1130 error_no_arg ("process-id to attach");
1131
1132 pid = strtoul (args, 0, 0);
1133 ok = DebugActiveProcess (pid);
1134
1135 if (!ok)
1136 error ("Can't attach to process.");
1137
1138 if (has_detach_ability ())
1139 {
1140 attach_flag = 1;
1141 DebugSetProcessKillOnExit (FALSE);
1142 }
1143
1144 if (from_tty)
1145 {
1146 char *exec_file = (char *) get_exec_file (0);
1147
1148 if (exec_file)
1149 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file,
1150 target_pid_to_str (pid_to_ptid (pid)));
1151 else
1152 printf_unfiltered ("Attaching to %s\n",
1153 target_pid_to_str (pid_to_ptid (pid)));
1154
1155 gdb_flush (gdb_stdout);
1156 }
1157
1158 do_initial_child_stuff (pid);
1159 target_terminal_ours ();
1160 }
1161
1162 static void
1163 child_detach (char *args, int from_tty)
1164 {
1165 int detached = 1;
1166
1167 if (has_detach_ability ())
1168 {
1169 delete_command (NULL, 0);
1170 child_continue (DBG_CONTINUE, -1);
1171 if (!DebugActiveProcessStop (current_event.dwProcessId))
1172 {
1173 error ("Can't detach process %lu (error %lu)",
1174 current_event.dwProcessId, GetLastError ());
1175 detached = 0;
1176 }
1177 DebugSetProcessKillOnExit (FALSE);
1178 }
1179 if (detached && from_tty)
1180 {
1181 char *exec_file = get_exec_file (0);
1182 if (exec_file == 0)
1183 exec_file = "";
1184 printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file,
1185 current_event.dwProcessId);
1186 gdb_flush (gdb_stdout);
1187 }
1188 inferior_ptid = null_ptid;
1189 unpush_target (&child_ops);
1190 }
1191
1192 /* Print status information about what we're accessing. */
1193
1194 static void
1195 child_files_info (struct target_ops *ignore)
1196 {
1197 printf_unfiltered ("\tUsing the running image of %s %s.\n",
1198 attach_flag ? "attached" : "child", target_pid_to_str (inferior_ptid));
1199 }
1200
1201 /* ARGSUSED */
1202 static void
1203 child_open (char *arg, int from_tty)
1204 {
1205 error ("Use the \"run\" command to start a Unix child process.");
1206 }
1207
1208 /* Start an inferior win32 child process and sets inferior_ptid to its pid.
1209 EXEC_FILE is the file to run.
1210 ALLARGS is a string containing the arguments to the program.
1211 ENV is the environment vector to pass. Errors reported with error(). */
1212
1213 static void
1214 child_create_inferior (char *exec_file, char *allargs, char **env)
1215 {
1216 char real_path[MAXPATHLEN];
1217 char *winenv;
1218 char *temp;
1219 int envlen;
1220 int i;
1221 STARTUPINFO si;
1222 PROCESS_INFORMATION pi;
1223 BOOL ret;
1224 DWORD flags;
1225 char *args;
1226
1227 if (!exec_file)
1228 error ("No executable specified, use `target exec'.\n");
1229
1230 memset (&si, 0, sizeof (si));
1231 si.cb = sizeof (si);
1232
1233 cygwin_conv_to_win32_path (exec_file, real_path);
1234
1235 flags = DEBUG_ONLY_THIS_PROCESS;
1236
1237 if (new_group)
1238 flags |= CREATE_NEW_PROCESS_GROUP;
1239
1240 if (new_console)
1241 flags |= CREATE_NEW_CONSOLE;
1242
1243 args = alloca (strlen (real_path) + strlen (allargs) + 2);
1244
1245 strcpy (args, real_path);
1246
1247 strcat (args, " ");
1248 strcat (args, allargs);
1249
1250 /* Prepare the environment vars for CreateProcess. */
1251 {
1252 /* This code use to assume all env vars were file names and would
1253 translate them all to win32 style. That obviously doesn't work in the
1254 general case. The current rule is that we only translate PATH.
1255 We need to handle PATH because we're about to call CreateProcess and
1256 it uses PATH to find DLL's. Fortunately PATH has a well-defined value
1257 in both posix and win32 environments. cygwin.dll will change it back
1258 to posix style if necessary. */
1259
1260 static const char *conv_path_names[] =
1261 {
1262 "PATH=",
1263 0
1264 };
1265
1266 /* CreateProcess takes the environment list as a null terminated set of
1267 strings (i.e. two nulls terminate the list). */
1268
1269 /* Get total size for env strings. */
1270 for (envlen = 0, i = 0; env[i] && *env[i]; i++)
1271 {
1272 int j, len;
1273
1274 for (j = 0; conv_path_names[j]; j++)
1275 {
1276 len = strlen (conv_path_names[j]);
1277 if (strncmp (conv_path_names[j], env[i], len) == 0)
1278 {
1279 if (cygwin_posix_path_list_p (env[i] + len))
1280 envlen += len
1281 + cygwin_posix_to_win32_path_list_buf_size (env[i] + len);
1282 else
1283 envlen += strlen (env[i]) + 1;
1284 break;
1285 }
1286 }
1287 if (conv_path_names[j] == NULL)
1288 envlen += strlen (env[i]) + 1;
1289 }
1290
1291 winenv = alloca (envlen + 1);
1292
1293 /* Copy env strings into new buffer. */
1294 for (temp = winenv, i = 0; env[i] && *env[i]; i++)
1295 {
1296 int j, len;
1297
1298 for (j = 0; conv_path_names[j]; j++)
1299 {
1300 len = strlen (conv_path_names[j]);
1301 if (strncmp (conv_path_names[j], env[i], len) == 0)
1302 {
1303 if (cygwin_posix_path_list_p (env[i] + len))
1304 {
1305 memcpy (temp, env[i], len);
1306 cygwin_posix_to_win32_path_list (env[i] + len, temp + len);
1307 }
1308 else
1309 strcpy (temp, env[i]);
1310 break;
1311 }
1312 }
1313 if (conv_path_names[j] == NULL)
1314 strcpy (temp, env[i]);
1315
1316 temp += strlen (temp) + 1;
1317 }
1318
1319 /* Final nil string to terminate new env. */
1320 *temp = 0;
1321 }
1322
1323 ret = CreateProcess (0,
1324 args, /* command line */
1325 NULL, /* Security */
1326 NULL, /* thread */
1327 TRUE, /* inherit handles */
1328 flags, /* start flags */
1329 winenv,
1330 NULL, /* current directory */
1331 &si,
1332 &pi);
1333 if (!ret)
1334 error ("Error creating process %s, (error %d)\n", exec_file, GetLastError ());
1335
1336 CloseHandle (pi.hThread);
1337 CloseHandle (pi.hProcess);
1338 do_initial_child_stuff (pi.dwProcessId);
1339
1340 /* child_continue (DBG_CONTINUE, -1); */
1341 proceed ((CORE_ADDR) - 1, TARGET_SIGNAL_0, 0);
1342 }
1343
1344 static void
1345 child_mourn_inferior (void)
1346 {
1347 (void) child_continue (DBG_CONTINUE, -1);
1348 unpush_target (&child_ops);
1349 generic_mourn_inferior ();
1350 }
1351
1352 /* Send a SIGINT to the process group. This acts just like the user typed a
1353 ^C on the controlling terminal. */
1354
1355 static void
1356 child_stop (void)
1357 {
1358 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1359 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT, current_event.dwProcessId));
1360 registers_changed (); /* refresh register state */
1361 }
1362
1363 int
1364 child_xfer_memory (CORE_ADDR memaddr, char *our, int len,
1365 int write, struct mem_attrib *mem,
1366 struct target_ops *target)
1367 {
1368 DWORD done;
1369 if (write)
1370 {
1371 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
1372 len, (DWORD) memaddr));
1373 WriteProcessMemory (current_process_handle, (LPVOID) memaddr, our,
1374 len, &done);
1375 FlushInstructionCache (current_process_handle, (LPCVOID) memaddr, len);
1376 }
1377 else
1378 {
1379 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
1380 len, (DWORD) memaddr));
1381 ReadProcessMemory (current_process_handle, (LPCVOID) memaddr, our, len,
1382 &done);
1383 }
1384 return done;
1385 }
1386
1387 void
1388 child_kill_inferior (void)
1389 {
1390 CHECK (TerminateProcess (current_process_handle, 0));
1391
1392 for (;;)
1393 {
1394 if (!child_continue (DBG_CONTINUE, -1))
1395 break;
1396 if (!WaitForDebugEvent (&current_event, INFINITE))
1397 break;
1398 if (current_event.dwDebugEventCode == EXIT_PROCESS_DEBUG_EVENT)
1399 break;
1400 }
1401
1402 CHECK (CloseHandle (current_process_handle));
1403
1404 /* this may fail in an attached process so don't check. */
1405 (void) CloseHandle (current_thread->h);
1406 target_mourn_inferior (); /* or just child_mourn_inferior? */
1407 }
1408
1409 void
1410 child_resume (ptid_t ptid, int step, enum target_signal sig)
1411 {
1412 thread_info *th;
1413 DWORD continue_status = last_sig > 0 && last_sig < NSIG ?
1414 DBG_EXCEPTION_NOT_HANDLED : DBG_CONTINUE;
1415 int pid = PIDGET (ptid);
1416
1417 last_sig = 0;
1418
1419 DEBUG_EXEC (("gdb: child_resume (pid=%d, step=%d, sig=%d);\n",
1420 pid, step, sig));
1421
1422 /* Get context for currently selected thread */
1423 th = thread_rec (current_event.dwThreadId, FALSE);
1424 if (th)
1425 {
1426 if (step)
1427 {
1428 /* Single step by setting t bit */
1429 child_fetch_inferior_registers (PS_REGNUM);
1430 th->context.EFlags |= FLAG_TRACE_BIT;
1431 }
1432
1433 if (th->context.ContextFlags)
1434 {
1435 CHECK (SetThreadContext (th->h, &th->context));
1436 th->context.ContextFlags = 0;
1437 }
1438 }
1439
1440 /* Allow continuing with the same signal that interrupted us.
1441 Otherwise complain. */
1442
1443 child_continue (continue_status, pid);
1444 }
1445
1446 static void
1447 child_prepare_to_store (void)
1448 {
1449 /* Do nothing, since we can store individual regs */
1450 }
1451
1452 static int
1453 child_can_run (void)
1454 {
1455 return 1;
1456 }
1457
1458 static void
1459 child_close (int x)
1460 {
1461 DEBUG_EVENTS (("gdb: child_close, inferior_ptid=%d\n",
1462 PIDGET (inferior_ptid)));
1463 }
1464
1465 struct target_ops child_ops;
1466
1467 static void
1468 init_child_ops (void)
1469 {
1470 child_ops.to_shortname = "child";
1471 child_ops.to_longname = "Win32 child process";
1472 child_ops.to_doc = "Win32 child process (started by the \"run\" command).";
1473 child_ops.to_open = child_open;
1474 child_ops.to_close = child_close;
1475 child_ops.to_attach = child_attach;
1476 child_ops.to_detach = child_detach;
1477 child_ops.to_resume = child_resume;
1478 child_ops.to_wait = child_wait;
1479 child_ops.to_fetch_registers = child_fetch_inferior_registers;
1480 child_ops.to_store_registers = child_store_inferior_registers;
1481 child_ops.to_prepare_to_store = child_prepare_to_store;
1482 child_ops.to_xfer_memory = child_xfer_memory;
1483 child_ops.to_files_info = child_files_info;
1484 child_ops.to_insert_breakpoint = memory_insert_breakpoint;
1485 child_ops.to_remove_breakpoint = memory_remove_breakpoint;
1486 child_ops.to_terminal_init = terminal_init_inferior;
1487 child_ops.to_terminal_inferior = terminal_inferior;
1488 child_ops.to_terminal_ours_for_output = terminal_ours_for_output;
1489 child_ops.to_terminal_ours = terminal_ours;
1490 child_ops.to_terminal_info = child_terminal_info;
1491 child_ops.to_kill = child_kill_inferior;
1492 child_ops.to_load = 0;
1493 child_ops.to_lookup_symbol = 0;
1494 child_ops.to_create_inferior = child_create_inferior;
1495 child_ops.to_mourn_inferior = child_mourn_inferior;
1496 child_ops.to_can_run = child_can_run;
1497 child_ops.to_notice_signals = 0;
1498 child_ops.to_thread_alive = win32_child_thread_alive;
1499 child_ops.to_pid_to_str = cygwin_pid_to_str;
1500 child_ops.to_stop = child_stop;
1501 child_ops.to_stratum = process_stratum;
1502 child_ops.DONT_USE = 0;
1503 child_ops.to_has_all_memory = 1;
1504 child_ops.to_has_memory = 1;
1505 child_ops.to_has_stack = 1;
1506 child_ops.to_has_registers = 1;
1507 child_ops.to_has_execution = 1;
1508 child_ops.to_sections = 0;
1509 child_ops.to_sections_end = 0;
1510 child_ops.to_magic = OPS_MAGIC;
1511 }
1512
1513 void
1514 _initialize_inftarg (void)
1515 {
1516 struct cmd_list_element *c;
1517
1518 init_child_ops ();
1519
1520 c = add_com ("dll-symbols", class_files, dll_symbol_command,
1521 "Load dll library symbols from FILE.");
1522 c->completer = filename_completer;
1523
1524 add_com_alias ("sharedlibrary", "dll-symbols", class_alias, 1);
1525
1526 add_show_from_set (add_set_cmd ("new-console", class_support, var_boolean,
1527 (char *) &new_console,
1528 "Set creation of new console when creating child process.",
1529 &setlist),
1530 &showlist);
1531
1532 add_show_from_set (add_set_cmd ("new-group", class_support, var_boolean,
1533 (char *) &new_group,
1534 "Set creation of new group when creating child process.",
1535 &setlist),
1536 &showlist);
1537
1538 add_show_from_set (add_set_cmd ("debugexec", class_support, var_boolean,
1539 (char *) &debug_exec,
1540 "Set whether to display execution in child process.",
1541 &setlist),
1542 &showlist);
1543
1544 add_show_from_set (add_set_cmd ("debugevents", class_support, var_boolean,
1545 (char *) &debug_events,
1546 "Set whether to display kernel events in child process.",
1547 &setlist),
1548 &showlist);
1549
1550 add_show_from_set (add_set_cmd ("debugmemory", class_support, var_boolean,
1551 (char *) &debug_memory,
1552 "Set whether to display memory accesses in child process.",
1553 &setlist),
1554 &showlist);
1555
1556 add_show_from_set (add_set_cmd ("debugexceptions", class_support, var_boolean,
1557 (char *) &debug_exceptions,
1558 "Set whether to display kernel exceptions in child process.",
1559 &setlist),
1560 &showlist);
1561
1562 add_info ("dll", info_dll_command, "Status of loaded DLLs.");
1563 add_info_alias ("sharedlibrary", "dll", 1);
1564
1565 add_target (&child_ops);
1566 }
1567
1568 /* Determine if the thread referenced by "pid" is alive
1569 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
1570 it means that the pid has died. Otherwise it is assumed to be alive. */
1571 static int
1572 win32_child_thread_alive (ptid_t ptid)
1573 {
1574 int pid = PIDGET (ptid);
1575
1576 return WaitForSingleObject (thread_rec (pid, FALSE)->h, 0) == WAIT_OBJECT_0 ?
1577 FALSE : TRUE;
1578 }
1579
1580 /* Convert pid to printable format. */
1581 char *
1582 cygwin_pid_to_str (ptid_t ptid)
1583 {
1584 static char buf[80];
1585 int pid = PIDGET (ptid);
1586
1587 if ((DWORD) pid == current_event.dwProcessId)
1588 sprintf (buf, "process %d", pid);
1589 else
1590 sprintf (buf, "thread %ld.0x%x", current_event.dwProcessId, pid);
1591 return buf;
1592 }
1593
1594 static int
1595 core_dll_symbols_add (char *dll_name, DWORD base_addr)
1596 {
1597 struct objfile *objfile;
1598 char *objfile_basename;
1599 const char *dll_basename;
1600
1601 if (!(dll_basename = strrchr (dll_name, '/')))
1602 dll_basename = dll_name;
1603 else
1604 dll_basename++;
1605
1606 ALL_OBJFILES (objfile)
1607 {
1608 objfile_basename = strrchr (objfile->name, '/');
1609
1610 if (objfile_basename &&
1611 strcmp (dll_basename, objfile_basename + 1) == 0)
1612 {
1613 printf_unfiltered ("%08lx:%s (symbols previously loaded)\n",
1614 base_addr, dll_name);
1615 goto out;
1616 }
1617 }
1618
1619 register_loaded_dll (dll_name, base_addr + 0x1000);
1620 solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000);
1621
1622 out:
1623 return 1;
1624 }
1625
1626 typedef struct
1627 {
1628 struct target_ops *target;
1629 bfd_vma addr;
1630 }
1631 map_code_section_args;
1632
1633 static void
1634 map_single_dll_code_section (bfd * abfd, asection * sect, void *obj)
1635 {
1636 int old;
1637 int update_coreops;
1638 struct section_table *new_target_sect_ptr;
1639
1640 map_code_section_args *args = (map_code_section_args *) obj;
1641 struct target_ops *target = args->target;
1642 if (sect->flags & SEC_CODE)
1643 {
1644 update_coreops = core_ops.to_sections == target->to_sections;
1645
1646 if (target->to_sections)
1647 {
1648 old = target->to_sections_end - target->to_sections;
1649 target->to_sections = (struct section_table *)
1650 xrealloc ((char *) target->to_sections,
1651 (sizeof (struct section_table)) * (1 + old));
1652 }
1653 else
1654 {
1655 old = 0;
1656 target->to_sections = (struct section_table *)
1657 xmalloc ((sizeof (struct section_table)));
1658 }
1659 target->to_sections_end = target->to_sections + (1 + old);
1660
1661 /* Update the to_sections field in the core_ops structure
1662 if needed. */
1663 if (update_coreops)
1664 {
1665 core_ops.to_sections = target->to_sections;
1666 core_ops.to_sections_end = target->to_sections_end;
1667 }
1668 new_target_sect_ptr = target->to_sections + old;
1669 new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect);
1670 new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) +
1671 bfd_section_size (abfd, sect);;
1672 new_target_sect_ptr->the_bfd_section = sect;
1673 new_target_sect_ptr->bfd = abfd;
1674 }
1675 }
1676
1677 static int
1678 dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target)
1679 {
1680 bfd *dll_bfd;
1681 map_code_section_args map_args;
1682 asection *lowest_sect;
1683 char *name;
1684 if (dll_name == NULL || target == NULL)
1685 return 0;
1686 name = xstrdup (dll_name);
1687 dll_bfd = bfd_openr (name, "pei-i386");
1688 if (dll_bfd == NULL)
1689 return 0;
1690
1691 if (bfd_check_format (dll_bfd, bfd_object))
1692 {
1693 lowest_sect = bfd_get_section_by_name (dll_bfd, ".text");
1694 if (lowest_sect == NULL)
1695 return 0;
1696 map_args.target = target;
1697 map_args.addr = base_addr - bfd_section_vma (dll_bfd, lowest_sect);
1698
1699 bfd_map_over_sections (dll_bfd, &map_single_dll_code_section, (void *) (&map_args));
1700 }
1701
1702 return 1;
1703 }
1704
1705 static void
1706 core_section_load_dll_symbols (bfd * abfd, asection * sect, void *obj)
1707 {
1708 struct target_ops *target = (struct target_ops *) obj;
1709
1710 DWORD base_addr;
1711
1712 int dll_name_size;
1713 char *dll_name = NULL;
1714 char *buf = NULL;
1715 struct win32_pstatus *pstatus;
1716 char *p;
1717
1718 if (strncmp (sect->name, ".module", 7))
1719 return;
1720
1721 buf = (char *) xmalloc (sect->_raw_size + 1);
1722 if (!buf)
1723 {
1724 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
1725 goto out;
1726 }
1727 if (!bfd_get_section_contents (abfd, sect, buf, 0, sect->_raw_size))
1728 goto out;
1729
1730 pstatus = (struct win32_pstatus *) buf;
1731
1732 memmove (&base_addr, &(pstatus->data.module_info.base_address), sizeof (base_addr));
1733 dll_name_size = pstatus->data.module_info.module_name_size;
1734 if (offsetof (struct win32_pstatus, data.module_info.module_name) + dll_name_size > sect->_raw_size)
1735 goto out;
1736
1737 dll_name = (char *) xmalloc (dll_name_size + 1);
1738 if (!dll_name)
1739 {
1740 printf_unfiltered ("memory allocation failed for %s\n", sect->name);
1741 goto out;
1742 }
1743 strncpy (dll_name, pstatus->data.module_info.module_name, dll_name_size);
1744
1745 while ((p = strchr (dll_name, '\\')))
1746 *p = '/';
1747
1748 if (!core_dll_symbols_add (dll_name, (DWORD) base_addr))
1749 printf_unfiltered ("%s: Failed to load dll symbols.\n", dll_name);
1750
1751 if (!dll_code_sections_add (dll_name, (DWORD) base_addr + 0x1000, target))
1752 printf_unfiltered ("%s: Failed to map dll code sections.\n", dll_name);
1753
1754 out:
1755 if (buf)
1756 xfree (buf);
1757 if (dll_name)
1758 xfree (dll_name);
1759 return;
1760 }
1761
1762 void
1763 child_solib_add (char *filename, int from_tty, struct target_ops *target,
1764 int readsyms)
1765 {
1766 if (!readsyms)
1767 return;
1768 if (core_bfd)
1769 {
1770 child_clear_solibs ();
1771 bfd_map_over_sections (core_bfd, &core_section_load_dll_symbols, target);
1772 }
1773 else
1774 {
1775 if (solib_end && solib_end->name)
1776 solib_end->objfile = solib_symbols_add (solib_end->name, from_tty,
1777 solib_end->load_addr);
1778 }
1779 }
1780
1781 static void
1782 fetch_elf_core_registers (char *core_reg_sect,
1783 unsigned core_reg_size,
1784 int which,
1785 CORE_ADDR reg_addr)
1786 {
1787 int r;
1788 if (core_reg_size < sizeof (CONTEXT))
1789 {
1790 error ("Core file register section too small (%u bytes).", core_reg_size);
1791 return;
1792 }
1793 for (r = 0; r < NUM_REGS; r++)
1794 supply_register (r, core_reg_sect + mappings[r]);
1795 }
1796
1797 static struct core_fns win32_elf_core_fns =
1798 {
1799 bfd_target_elf_flavour,
1800 default_check_format,
1801 default_core_sniffer,
1802 fetch_elf_core_registers,
1803 NULL
1804 };
1805
1806 void
1807 _initialize_core_win32 (void)
1808 {
1809 add_core_fns (&win32_elf_core_fns);
1810 }
1811
1812 void
1813 _initialize_check_for_gdb_ini (void)
1814 {
1815 char *homedir;
1816 if (inhibit_gdbinit)
1817 return;
1818
1819 homedir = getenv ("HOME");
1820 if (homedir)
1821 {
1822 char *p;
1823 char *oldini = (char *) alloca (strlen (homedir) +
1824 sizeof ("/gdb.ini"));
1825 strcpy (oldini, homedir);
1826 p = strchr (oldini, '\0');
1827 if (p > oldini && p[-1] != '/')
1828 *p++ = '/';
1829 strcpy (p, "gdb.ini");
1830 if (access (oldini, 0) == 0)
1831 {
1832 int len = strlen (oldini);
1833 char *newini = alloca (len + 1);
1834 sprintf (newini, "%.*s.gdbinit", len - (sizeof ("gdb.ini") - 1), oldini);
1835 warning ("obsolete '%s' found. Rename to '%s'.", oldini, newini);
1836 }
1837 }
1838 }
This page took 0.070469 seconds and 4 git commands to generate.