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