1 /* Target-vector operations for controlling windows child processes, for GDB.
3 Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004,
4 2005, 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
6 Contributed by Cygnus Solutions, A Red Hat Company.
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
23 /* Originally by Steve Chamberlain, sac@cygnus.com */
26 #include "frame.h" /* required by inferior.h */
29 #include "exceptions.h"
32 #include "completer.h"
36 #include <sys/types.h>
43 #include <sys/cygwin.h>
50 #include "gdb_obstack.h"
51 #include "gdb_string.h"
52 #include "gdbthread.h"
54 #include <sys/param.h>
59 #include "xml-support.h"
61 #include "i386-tdep.h"
62 #include "i387-tdep.h"
64 #include "windows-tdep.h"
65 #include "windows-nat.h"
67 #define AdjustTokenPrivileges dyn_AdjustTokenPrivileges
68 #define DebugActiveProcessStop dyn_DebugActiveProcessStop
69 #define DebugBreakProcess dyn_DebugBreakProcess
70 #define DebugSetProcessKillOnExit dyn_DebugSetProcessKillOnExit
71 #define EnumProcessModules dyn_EnumProcessModules
72 #define GetModuleFileNameExA dyn_GetModuleFileNameExA
73 #define GetModuleInformation dyn_GetModuleInformation
74 #define LookupPrivilegeValueA dyn_LookupPrivilegeValueA
75 #define OpenProcessToken dyn_OpenProcessToken
77 static BOOL
WINAPI (*AdjustTokenPrivileges
)(HANDLE
, BOOL
, PTOKEN_PRIVILEGES
,
78 DWORD
, PTOKEN_PRIVILEGES
, PDWORD
);
79 static BOOL
WINAPI (*DebugActiveProcessStop
) (DWORD
);
80 static BOOL
WINAPI (*DebugBreakProcess
) (HANDLE
);
81 static BOOL
WINAPI (*DebugSetProcessKillOnExit
) (BOOL
);
82 static BOOL
WINAPI (*EnumProcessModules
) (HANDLE
, HMODULE
*, DWORD
,
84 static DWORD
WINAPI (*GetModuleFileNameExA
) (HANDLE
, HMODULE
, LPSTR
,
86 static BOOL
WINAPI (*GetModuleInformation
) (HANDLE
, HMODULE
, LPMODULEINFO
,
88 static BOOL
WINAPI (*LookupPrivilegeValueA
)(LPCSTR
, LPCSTR
, PLUID
);
89 static BOOL
WINAPI (*OpenProcessToken
)(HANDLE
, DWORD
, PHANDLE
);
91 static struct target_ops windows_ops
;
94 /* The starting and ending address of the cygwin1.dll text segment. */
95 static CORE_ADDR cygwin_load_start
;
96 static CORE_ADDR cygwin_load_end
;
99 static int have_saved_context
; /* True if we've saved context from a cygwin signal. */
100 static CONTEXT saved_context
; /* Containes the saved context from a cygwin signal. */
102 /* If we're not using the old Cygwin header file set, define the
103 following which never should have been in the generic Win32 API
104 headers in the first place since they were our own invention... */
105 #ifndef _GNU_H_WINDOWS_H
108 FLAG_TRACE_BIT
= 0x100,
109 CONTEXT_DEBUGGER
= (CONTEXT_FULL
| CONTEXT_FLOATING_POINT
)
113 #ifndef CONTEXT_EXTENDED_REGISTERS
114 /* This macro is only defined on ia32. It only makes sense on this target,
115 so define it as zero if not already defined. */
116 #define CONTEXT_EXTENDED_REGISTERS 0
119 #define CONTEXT_DEBUGGER_DR CONTEXT_DEBUGGER | CONTEXT_DEBUG_REGISTERS \
120 | CONTEXT_EXTENDED_REGISTERS
122 static uintptr_t dr
[8];
123 static int debug_registers_changed
;
124 static int debug_registers_used
;
125 #define DR6_CLEAR_VALUE 0xffff0ff0
127 /* The string sent by cygwin when it processes a signal.
128 FIXME: This should be in a cygwin include file. */
129 #ifndef _CYGWIN_SIGNAL_STRING
130 #define _CYGWIN_SIGNAL_STRING "cYgSiGw00f"
133 #define CHECK(x) check (x, __FILE__,__LINE__)
134 #define DEBUG_EXEC(x) if (debug_exec) printf_unfiltered x
135 #define DEBUG_EVENTS(x) if (debug_events) printf_unfiltered x
136 #define DEBUG_MEM(x) if (debug_memory) printf_unfiltered x
137 #define DEBUG_EXCEPT(x) if (debug_exceptions) printf_unfiltered x
139 static void windows_stop (ptid_t
);
140 static int windows_thread_alive (struct target_ops
*, ptid_t
);
141 static void windows_kill_inferior (struct target_ops
*);
143 static enum target_signal last_sig
= TARGET_SIGNAL_0
;
144 /* Set if a signal was received from the debugged process */
146 /* Thread information structure used to track information that is
147 not available in gdb's thread structure. */
148 typedef struct thread_info_struct
150 struct thread_info_struct
*next
;
161 static thread_info thread_head
;
163 /* The process and thread handles for the above context. */
165 static DEBUG_EVENT current_event
; /* The current debug event from
167 static HANDLE current_process_handle
; /* Currently executing process */
168 static thread_info
*current_thread
; /* Info on currently selected thread */
169 static DWORD main_thread_id
; /* Thread ID of the main thread */
171 /* Counts of things. */
172 static int exception_count
= 0;
173 static int event_count
= 0;
174 static int saw_create
;
175 static int open_process_used
= 0;
178 static int new_console
= 0;
180 static int cygwin_exceptions
= 0;
182 static int new_group
= 1;
183 static int debug_exec
= 0; /* show execution */
184 static int debug_events
= 0; /* show events from kernel */
185 static int debug_memory
= 0; /* show target memory accesses */
186 static int debug_exceptions
= 0; /* show target exceptions */
187 static int useshell
= 0; /* use shell for subprocesses */
189 /* This vector maps GDB's idea of a register's number into an offset
190 in the windows exception context vector.
192 It also contains the bit mask needed to load the register in question.
194 The contents of this table can only be computed by the units
195 that provide CPU-specific support for Windows native debugging.
196 These units should set the table by calling
197 windows_set_context_register_offsets.
199 One day we could read a reg, we could inspect the context we
200 already have loaded, if it doesn't have the bit set that we need,
201 we read that set of registers in using GetThreadContext. If the
202 context already contains what we need, we just unpack it. Then to
203 write a register, first we have to ensure that the context contains
204 the other regs of the group, and then we copy the info in and set
207 static const int *mappings
;
209 /* This vector maps the target's idea of an exception (extracted
210 from the DEBUG_EVENT structure) to GDB's idea. */
212 struct xlate_exception
215 enum target_signal us
;
218 static const struct xlate_exception
221 {EXCEPTION_ACCESS_VIOLATION
, TARGET_SIGNAL_SEGV
},
222 {STATUS_STACK_OVERFLOW
, TARGET_SIGNAL_SEGV
},
223 {EXCEPTION_BREAKPOINT
, TARGET_SIGNAL_TRAP
},
224 {DBG_CONTROL_C
, TARGET_SIGNAL_INT
},
225 {EXCEPTION_SINGLE_STEP
, TARGET_SIGNAL_TRAP
},
226 {STATUS_FLOAT_DIVIDE_BY_ZERO
, TARGET_SIGNAL_FPE
},
229 /* Set the MAPPINGS static global to OFFSETS.
230 See the description of MAPPINGS for more details. */
233 windows_set_context_register_offsets (const int *offsets
)
239 check (BOOL ok
, const char *file
, int line
)
242 printf_filtered ("error return %s:%d was %lu\n", file
, line
,
246 /* Find a thread record given a thread id. If GET_CONTEXT is not 0,
247 then also retrieve the context for this thread. If GET_CONTEXT is
248 negative, then don't suspend the thread. */
250 thread_rec (DWORD id
, int get_context
)
254 for (th
= &thread_head
; (th
= th
->next
) != NULL
;)
257 if (!th
->suspended
&& get_context
)
259 if (get_context
> 0 && id
!= current_event
.dwThreadId
)
261 if (SuspendThread (th
->h
) == (DWORD
) -1)
263 DWORD err
= GetLastError ();
264 warning (_("SuspendThread failed. (winerr %d)"),
270 else if (get_context
< 0)
272 th
->reload_context
= 1;
280 /* Add a thread to the thread list. */
282 windows_add_thread (ptid_t ptid
, HANDLE h
)
287 gdb_assert (ptid_get_tid (ptid
) != 0);
289 id
= ptid_get_tid (ptid
);
291 if ((th
= thread_rec (id
, FALSE
)))
294 th
= XZALLOC (thread_info
);
297 th
->next
= thread_head
.next
;
298 thread_head
.next
= th
;
300 /* Set the debug registers for the new thread if they are used. */
301 if (debug_registers_used
)
303 /* Only change the value of the debug registers. */
304 th
->context
.ContextFlags
= CONTEXT_DEBUG_REGISTERS
;
305 CHECK (GetThreadContext (th
->h
, &th
->context
));
306 th
->context
.Dr0
= dr
[0];
307 th
->context
.Dr1
= dr
[1];
308 th
->context
.Dr2
= dr
[2];
309 th
->context
.Dr3
= dr
[3];
310 th
->context
.Dr6
= DR6_CLEAR_VALUE
;
311 th
->context
.Dr7
= dr
[7];
312 CHECK (SetThreadContext (th
->h
, &th
->context
));
313 th
->context
.ContextFlags
= 0;
318 /* Clear out any old thread list and reintialize it to a
321 windows_init_thread_list (void)
323 thread_info
*th
= &thread_head
;
325 DEBUG_EVENTS (("gdb: windows_init_thread_list\n"));
327 while (th
->next
!= NULL
)
329 thread_info
*here
= th
->next
;
330 th
->next
= here
->next
;
333 thread_head
.next
= NULL
;
336 /* Delete a thread from the list of threads */
338 windows_delete_thread (ptid_t ptid
)
343 gdb_assert (ptid_get_tid (ptid
) != 0);
345 id
= ptid_get_tid (ptid
);
348 printf_unfiltered ("[Deleting %s]\n", target_pid_to_str (ptid
));
349 delete_thread (ptid
);
351 for (th
= &thread_head
;
352 th
->next
!= NULL
&& th
->next
->id
!= id
;
356 if (th
->next
!= NULL
)
358 thread_info
*here
= th
->next
;
359 th
->next
= here
->next
;
365 do_windows_fetch_inferior_registers (struct regcache
*regcache
, int r
)
367 char *context_offset
= ((char *) ¤t_thread
->context
) + mappings
[r
];
368 struct gdbarch
*gdbarch
= get_regcache_arch (regcache
);
369 struct gdbarch_tdep
*tdep
= gdbarch_tdep (gdbarch
);
373 return; /* Windows sometimes uses a non-existent thread id in its
376 if (current_thread
->reload_context
)
378 #ifdef __COPY_CONTEXT_SIZE
379 if (have_saved_context
)
381 /* Lie about where the program actually is stopped since cygwin has informed us that
382 we should consider the signal to have occurred at another location which is stored
383 in "saved_context. */
384 memcpy (¤t_thread
->context
, &saved_context
, __COPY_CONTEXT_SIZE
);
385 have_saved_context
= 0;
390 thread_info
*th
= current_thread
;
391 th
->context
.ContextFlags
= CONTEXT_DEBUGGER_DR
;
392 GetThreadContext (th
->h
, &th
->context
);
393 /* Copy dr values from that thread.
394 But only if there were not modified since last stop. PR gdb/2388 */
395 if (!debug_registers_changed
)
397 dr
[0] = th
->context
.Dr0
;
398 dr
[1] = th
->context
.Dr1
;
399 dr
[2] = th
->context
.Dr2
;
400 dr
[3] = th
->context
.Dr3
;
401 dr
[6] = th
->context
.Dr6
;
402 dr
[7] = th
->context
.Dr7
;
405 current_thread
->reload_context
= 0;
408 if (r
== I387_FISEG_REGNUM (tdep
))
410 l
= *((long *) context_offset
) & 0xffff;
411 regcache_raw_supply (regcache
, r
, (char *) &l
);
413 else if (r
== I387_FOP_REGNUM (tdep
))
415 l
= (*((long *) context_offset
) >> 16) & ((1 << 11) - 1);
416 regcache_raw_supply (regcache
, r
, (char *) &l
);
419 regcache_raw_supply (regcache
, r
, context_offset
);
422 for (r
= 0; r
< gdbarch_num_regs (gdbarch
); r
++)
423 do_windows_fetch_inferior_registers (regcache
, r
);
428 windows_fetch_inferior_registers (struct target_ops
*ops
,
429 struct regcache
*regcache
, int r
)
431 current_thread
= thread_rec (ptid_get_tid (inferior_ptid
), TRUE
);
432 /* Check if current_thread exists. Windows sometimes uses a non-existent
433 thread id in its events */
435 do_windows_fetch_inferior_registers (regcache
, r
);
439 do_windows_store_inferior_registers (const struct regcache
*regcache
, int r
)
442 /* Windows sometimes uses a non-existent thread id in its events */;
444 regcache_raw_collect (regcache
, r
,
445 ((char *) ¤t_thread
->context
) + mappings
[r
]);
448 for (r
= 0; r
< gdbarch_num_regs (get_regcache_arch (regcache
)); r
++)
449 do_windows_store_inferior_registers (regcache
, r
);
453 /* Store a new register value into the current thread context */
455 windows_store_inferior_registers (struct target_ops
*ops
,
456 struct regcache
*regcache
, int r
)
458 current_thread
= thread_rec (ptid_get_tid (inferior_ptid
), TRUE
);
459 /* Check if current_thread exists. Windows sometimes uses a non-existent
460 thread id in its events */
462 do_windows_store_inferior_registers (regcache
, r
);
465 /* Get the name of a given module at at given base address. If base_address
466 is zero return the first loaded module (which is always the name of the
469 get_module_name (LPVOID base_address
, char *dll_name_ret
)
475 HMODULE
*DllHandle
= dh_buf
; /* Set to temporary storage for initial query */
478 char pathbuf
[PATH_MAX
+ 1]; /* Temporary storage prior to converting to
481 char *pathbuf
= dll_name_ret
; /* Just copy directly to passed-in arg */
485 /* Find size of buffer needed to handle list of modules loaded in inferior */
486 if (!EnumProcessModules (current_process_handle
, DllHandle
,
487 sizeof (HMODULE
), &cbNeeded
) || !cbNeeded
)
490 /* Allocate correct amount of space for module list */
491 DllHandle
= (HMODULE
*) alloca (cbNeeded
);
495 /* Get the list of modules */
496 if (!EnumProcessModules (current_process_handle
, DllHandle
, cbNeeded
,
500 for (i
= 0; i
< (int) (cbNeeded
/ sizeof (HMODULE
)); i
++)
502 /* Get information on this module */
503 if (!GetModuleInformation (current_process_handle
, DllHandle
[i
],
505 error (_("Can't get module info"));
507 if (!base_address
|| mi
.lpBaseOfDll
== base_address
)
509 /* Try to find the name of the given module */
510 len
= GetModuleFileNameExA (current_process_handle
,
511 DllHandle
[i
], pathbuf
, MAX_PATH
);
513 error (_("Error getting dll name: %u."), (unsigned) GetLastError ());
515 /* Cygwin prefers that the path be in /x/y/z format */
516 cygwin_conv_to_full_posix_path (pathbuf
, dll_name_ret
);
518 return 1; /* success */
523 dll_name_ret
[0] = '\0';
524 return 0; /* failure */
527 /* Encapsulate the information required in a call to
528 symbol_file_add_args */
529 struct safe_symbol_file_add_args
533 struct section_addr_info
*addrs
;
536 struct ui_file
*err
, *out
;
540 /* Maintain a linked list of "so" information. */
546 static struct so_list solib_start
, *solib_end
;
548 /* Call symbol_file_add with stderr redirected. We don't care if there
551 safe_symbol_file_add_stub (void *argv
)
553 #define p ((struct safe_symbol_file_add_args *) argv)
554 p
->ret
= symbol_file_add (p
->name
, p
->from_tty
, p
->addrs
, p
->mainline
, p
->flags
);
559 /* Restore gdb's stderr after calling symbol_file_add */
561 safe_symbol_file_add_cleanup (void *p
)
563 #define sp ((struct safe_symbol_file_add_args *)p)
564 gdb_flush (gdb_stderr
);
565 gdb_flush (gdb_stdout
);
566 ui_file_delete (gdb_stderr
);
567 ui_file_delete (gdb_stdout
);
568 gdb_stderr
= sp
->err
;
569 gdb_stdout
= sp
->out
;
573 /* symbol_file_add wrapper that prevents errors from being displayed. */
574 static struct objfile
*
575 safe_symbol_file_add (char *name
, int from_tty
,
576 struct section_addr_info
*addrs
,
577 int mainline
, int flags
)
579 struct safe_symbol_file_add_args p
;
580 struct cleanup
*cleanup
;
582 cleanup
= make_cleanup (safe_symbol_file_add_cleanup
, &p
);
586 gdb_flush (gdb_stderr
);
587 gdb_flush (gdb_stdout
);
588 gdb_stderr
= ui_file_new ();
589 gdb_stdout
= ui_file_new ();
591 p
.from_tty
= from_tty
;
593 p
.mainline
= mainline
;
595 catch_errors (safe_symbol_file_add_stub
, &p
, "", RETURN_MASK_ERROR
);
597 do_cleanups (cleanup
);
601 static struct so_list
*
602 windows_make_so (const char *name
, LPVOID load_addr
)
605 char buf
[MAX_PATH
+ 1];
606 char cwd
[MAX_PATH
+ 1];
608 WIN32_FIND_DATA w32_fd
;
609 HANDLE h
= FindFirstFile(name
, &w32_fd
);
610 MEMORY_BASIC_INFORMATION m
;
612 if (h
== INVALID_HANDLE_VALUE
)
618 if (GetCurrentDirectory (MAX_PATH
+ 1, cwd
))
620 p
= strrchr (buf
, '\\');
623 SetCurrentDirectory (buf
);
624 GetFullPathName (w32_fd
.cFileName
, MAX_PATH
, buf
, &p
);
625 SetCurrentDirectory (cwd
);
629 if (strcasecmp (buf
, "ntdll.dll") == 0)
631 GetSystemDirectory (buf
, sizeof (buf
));
632 strcat (buf
, "\\ntdll.dll");
634 so
= XZALLOC (struct so_list
);
635 so
->lm_info
= (struct lm_info
*) xmalloc (sizeof (struct lm_info
));
636 so
->lm_info
->load_addr
= load_addr
;
637 strcpy (so
->so_original_name
, name
);
639 strcpy (so
->so_name
, buf
);
641 cygwin_conv_to_posix_path (buf
, so
->so_name
);
642 /* Record cygwin1.dll .text start/end. */
643 p
= strchr (so
->so_name
, '\0') - (sizeof ("/cygwin1.dll") - 1);
644 if (p
>= so
->so_name
&& strcasecmp (p
, "/cygwin1.dll") == 0)
647 asection
*text
= NULL
;
650 abfd
= bfd_openr (so
->so_name
, "pei-i386");
655 if (bfd_check_format (abfd
, bfd_object
))
656 text
= bfd_get_section_by_name (abfd
, ".text");
664 /* The symbols in a dll are offset by 0x1000, which is the the
665 offset from 0 of the first byte in an image - because of the
666 file header and the section alignment. */
667 cygwin_load_start
= (CORE_ADDR
) (uintptr_t) ((char *) load_addr
+ 0x1000);
668 cygwin_load_end
= cygwin_load_start
+ bfd_section_size (abfd
, text
);
678 get_image_name (HANDLE h
, void *address
, int unicode
)
680 static char buf
[(2 * MAX_PATH
) + 1];
681 DWORD size
= unicode
? sizeof (WCHAR
) : sizeof (char);
687 /* Attempt to read the name of the dll that was detected.
688 This is documented to work only when actively debugging
689 a program. It will not work for attached processes. */
693 /* See if we could read the address of a string, and that the
694 address isn't null. */
695 if (!ReadProcessMemory (h
, address
, &address_ptr
, sizeof (address_ptr
), &done
)
696 || done
!= sizeof (address_ptr
) || !address_ptr
)
699 /* Find the length of the string */
700 while (ReadProcessMemory (h
, address_ptr
+ len
++ * size
, &b
, size
, &done
)
701 && (b
[0] != 0 || b
[size
- 1] != 0) && done
== size
)
705 ReadProcessMemory (h
, address_ptr
, buf
, len
, &done
);
708 WCHAR
*unicode_address
= (WCHAR
*) alloca (len
* sizeof (WCHAR
));
709 ReadProcessMemory (h
, address_ptr
, unicode_address
, len
* sizeof (WCHAR
),
712 WideCharToMultiByte (CP_ACP
, 0, unicode_address
, len
, buf
, len
, 0, 0);
718 /* Wait for child to do something. Return pid of child, or -1 in case
719 of error; store status through argument pointer OURSTATUS. */
721 handle_load_dll (void *dummy
)
723 LOAD_DLL_DEBUG_INFO
*event
= ¤t_event
.u
.LoadDll
;
724 char dll_buf
[MAX_PATH
+ 1];
725 char *dll_name
= NULL
;
727 dll_buf
[0] = dll_buf
[sizeof (dll_buf
) - 1] = '\0';
729 if (!get_module_name (event
->lpBaseOfDll
, dll_buf
))
730 dll_buf
[0] = dll_buf
[sizeof (dll_buf
) - 1] = '\0';
734 if (*dll_name
== '\0')
735 dll_name
= get_image_name (current_process_handle
,
736 event
->lpImageName
, event
->fUnicode
);
740 solib_end
->next
= windows_make_so (dll_name
, event
->lpBaseOfDll
);
741 solib_end
= solib_end
->next
;
743 DEBUG_EVENTS (("gdb: Loading dll \"%s\" at %s.\n", solib_end
->so_name
,
744 host_address_to_string (solib_end
->lm_info
->load_addr
)));
750 windows_free_so (struct so_list
*so
)
758 handle_unload_dll (void *dummy
)
760 LPVOID lpBaseOfDll
= current_event
.u
.UnloadDll
.lpBaseOfDll
;
763 for (so
= &solib_start
; so
->next
!= NULL
; so
= so
->next
)
764 if (so
->next
->lm_info
->load_addr
== lpBaseOfDll
)
766 struct so_list
*sodel
= so
->next
;
767 so
->next
= sodel
->next
;
770 DEBUG_EVENTS (("gdb: Unloading dll \"%s\".\n", sodel
->so_name
));
772 windows_free_so (sodel
);
773 solib_add (NULL
, 0, NULL
, auto_solib_add
);
777 error (_("Error: dll starting at %s not found."),
778 host_address_to_string (lpBaseOfDll
));
783 /* Clear list of loaded DLLs. */
785 windows_clear_solib (void)
787 solib_start
.next
= NULL
;
788 solib_end
= &solib_start
;
791 /* Load DLL symbol info. */
793 dll_symbol_command (char *args
, int from_tty
)
799 error (_("dll-symbols requires a file name"));
802 if (n
> 4 && strcasecmp (args
+ n
- 4, ".dll") != 0)
804 char *newargs
= (char *) alloca (n
+ 4 + 1);
805 strcpy (newargs
, args
);
806 strcat (newargs
, ".dll");
810 safe_symbol_file_add (args
, from_tty
, NULL
, 0, OBJF_SHARED
| OBJF_USERLOADED
);
813 /* Handle DEBUG_STRING output from child process.
814 Cygwin prepends its messages with a "cygwin:". Interpret this as
815 a Cygwin signal. Otherwise just print the string as a warning. */
817 handle_output_debug_string (struct target_waitstatus
*ourstatus
)
822 if (!target_read_string
823 ((CORE_ADDR
) (uintptr_t) current_event
.u
.DebugString
.lpDebugStringData
,
827 else if (strncmp (s
, _CYGWIN_SIGNAL_STRING
, sizeof (_CYGWIN_SIGNAL_STRING
) - 1) != 0)
830 if (strncmp (s
, "cYg", 3) != 0)
834 #ifdef __COPY_CONTEXT_SIZE
837 /* Got a cygwin signal marker. A cygwin signal is followed by the signal number
838 itself and then optionally followed by the thread id and address to saved context
839 within the DLL. If these are supplied, then the given thread is assumed to have
840 issued the signal and the context from the thread is assumed to be stored at the
841 given address in the inferior. Tell gdb to treat this like a real signal. */
843 int sig
= strtol (s
+ sizeof (_CYGWIN_SIGNAL_STRING
) - 1, &p
, 0);
844 int gotasig
= target_signal_from_host (sig
);
845 ourstatus
->value
.sig
= gotasig
;
850 ourstatus
->kind
= TARGET_WAITKIND_STOPPED
;
851 retval
= strtoul (p
, &p
, 0);
853 retval
= main_thread_id
;
854 else if ((x
= (LPCVOID
) strtoul (p
, &p
, 0))
855 && ReadProcessMemory (current_process_handle
, x
,
856 &saved_context
, __COPY_CONTEXT_SIZE
, &n
)
857 && n
== __COPY_CONTEXT_SIZE
)
858 have_saved_context
= 1;
859 current_event
.dwThreadId
= retval
;
870 display_selector (HANDLE thread
, DWORD sel
)
873 if (GetThreadSelectorEntry (thread
, sel
, &info
))
876 printf_filtered ("0x%03lx: ", sel
);
877 if (!info
.HighWord
.Bits
.Pres
)
879 puts_filtered ("Segment not present\n");
882 base
= (info
.HighWord
.Bits
.BaseHi
<< 24) +
883 (info
.HighWord
.Bits
.BaseMid
<< 16)
885 limit
= (info
.HighWord
.Bits
.LimitHi
<< 16) + info
.LimitLow
;
886 if (info
.HighWord
.Bits
.Granularity
)
887 limit
= (limit
<< 12) | 0xfff;
888 printf_filtered ("base=0x%08x limit=0x%08x", base
, limit
);
889 if (info
.HighWord
.Bits
.Default_Big
)
890 puts_filtered(" 32-bit ");
892 puts_filtered(" 16-bit ");
893 switch ((info
.HighWord
.Bits
.Type
& 0xf) >> 1)
896 puts_filtered ("Data (Read-Only, Exp-up");
899 puts_filtered ("Data (Read/Write, Exp-up");
902 puts_filtered ("Unused segment (");
905 puts_filtered ("Data (Read/Write, Exp-down");
908 puts_filtered ("Code (Exec-Only, N.Conf");
911 puts_filtered ("Code (Exec/Read, N.Conf");
914 puts_filtered ("Code (Exec-Only, Conf");
917 puts_filtered ("Code (Exec/Read, Conf");
920 printf_filtered ("Unknown type 0x%x",info
.HighWord
.Bits
.Type
);
922 if ((info
.HighWord
.Bits
.Type
& 0x1) == 0)
923 puts_filtered(", N.Acc");
924 puts_filtered (")\n");
925 if ((info
.HighWord
.Bits
.Type
& 0x10) == 0)
926 puts_filtered("System selector ");
927 printf_filtered ("Priviledge level = %d. ", info
.HighWord
.Bits
.Dpl
);
928 if (info
.HighWord
.Bits
.Granularity
)
929 puts_filtered ("Page granular.\n");
931 puts_filtered ("Byte granular.\n");
936 printf_filtered ("Invalid selector 0x%lx.\n",sel
);
942 display_selectors (char * args
, int from_tty
)
946 puts_filtered ("Impossible to display selectors now.\n");
952 puts_filtered ("Selector $cs\n");
953 display_selector (current_thread
->h
,
954 current_thread
->context
.SegCs
);
955 puts_filtered ("Selector $ds\n");
956 display_selector (current_thread
->h
,
957 current_thread
->context
.SegDs
);
958 puts_filtered ("Selector $es\n");
959 display_selector (current_thread
->h
,
960 current_thread
->context
.SegEs
);
961 puts_filtered ("Selector $ss\n");
962 display_selector (current_thread
->h
,
963 current_thread
->context
.SegSs
);
964 puts_filtered ("Selector $fs\n");
965 display_selector (current_thread
->h
,
966 current_thread
->context
.SegFs
);
967 puts_filtered ("Selector $gs\n");
968 display_selector (current_thread
->h
,
969 current_thread
->context
.SegGs
);
974 sel
= parse_and_eval_long (args
);
975 printf_filtered ("Selector \"%s\"\n",args
);
976 display_selector (current_thread
->h
, sel
);
980 static struct cmd_list_element
*info_w32_cmdlist
= NULL
;
983 info_w32_command (char *args
, int from_tty
)
985 help_list (info_w32_cmdlist
, "info w32 ", class_info
, gdb_stdout
);
989 #define DEBUG_EXCEPTION_SIMPLE(x) if (debug_exceptions) \
990 printf_unfiltered ("gdb: Target exception %s at %s\n", x, \
991 host_address_to_string (\
992 current_event.u.Exception.ExceptionRecord.ExceptionAddress))
995 handle_exception (struct target_waitstatus
*ourstatus
)
998 DWORD code
= current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
;
1000 ourstatus
->kind
= TARGET_WAITKIND_STOPPED
;
1002 /* Record the context of the current thread */
1003 th
= thread_rec (current_event
.dwThreadId
, -1);
1007 case EXCEPTION_ACCESS_VIOLATION
:
1008 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ACCESS_VIOLATION");
1009 ourstatus
->value
.sig
= TARGET_SIGNAL_SEGV
;
1012 /* See if the access violation happened within the cygwin DLL itself. Cygwin uses
1013 a kind of exception handling to deal with passed-in invalid addresses. gdb
1014 should not treat these as real SEGVs since they will be silently handled by
1015 cygwin. A real SEGV will (theoretically) be caught by cygwin later in the process
1016 and will be sent as a cygwin-specific-signal. So, ignore SEGVs if they show up
1017 within the text segment of the DLL itself. */
1019 CORE_ADDR addr
= (CORE_ADDR
) (uintptr_t) current_event
.u
.Exception
.ExceptionRecord
.ExceptionAddress
;
1020 if ((!cygwin_exceptions
&& (addr
>= cygwin_load_start
&& addr
< cygwin_load_end
))
1021 || (find_pc_partial_function (addr
, &fn
, NULL
, NULL
)
1022 && strncmp (fn
, "KERNEL32!IsBad", strlen ("KERNEL32!IsBad")) == 0))
1027 case STATUS_STACK_OVERFLOW
:
1028 DEBUG_EXCEPTION_SIMPLE ("STATUS_STACK_OVERFLOW");
1029 ourstatus
->value
.sig
= TARGET_SIGNAL_SEGV
;
1031 case STATUS_FLOAT_DENORMAL_OPERAND
:
1032 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DENORMAL_OPERAND");
1033 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1035 case EXCEPTION_ARRAY_BOUNDS_EXCEEDED
:
1036 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ARRAY_BOUNDS_EXCEEDED");
1037 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1039 case STATUS_FLOAT_INEXACT_RESULT
:
1040 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INEXACT_RESULT");
1041 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1043 case STATUS_FLOAT_INVALID_OPERATION
:
1044 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_INVALID_OPERATION");
1045 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1047 case STATUS_FLOAT_OVERFLOW
:
1048 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_OVERFLOW");
1049 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1051 case STATUS_FLOAT_STACK_CHECK
:
1052 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_STACK_CHECK");
1053 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1055 case STATUS_FLOAT_UNDERFLOW
:
1056 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_UNDERFLOW");
1057 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1059 case STATUS_FLOAT_DIVIDE_BY_ZERO
:
1060 DEBUG_EXCEPTION_SIMPLE ("STATUS_FLOAT_DIVIDE_BY_ZERO");
1061 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1063 case STATUS_INTEGER_DIVIDE_BY_ZERO
:
1064 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_DIVIDE_BY_ZERO");
1065 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1067 case STATUS_INTEGER_OVERFLOW
:
1068 DEBUG_EXCEPTION_SIMPLE ("STATUS_INTEGER_OVERFLOW");
1069 ourstatus
->value
.sig
= TARGET_SIGNAL_FPE
;
1071 case EXCEPTION_BREAKPOINT
:
1072 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_BREAKPOINT");
1073 ourstatus
->value
.sig
= TARGET_SIGNAL_TRAP
;
1076 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_C");
1077 ourstatus
->value
.sig
= TARGET_SIGNAL_INT
;
1079 case DBG_CONTROL_BREAK
:
1080 DEBUG_EXCEPTION_SIMPLE ("DBG_CONTROL_BREAK");
1081 ourstatus
->value
.sig
= TARGET_SIGNAL_INT
;
1083 case EXCEPTION_SINGLE_STEP
:
1084 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_SINGLE_STEP");
1085 ourstatus
->value
.sig
= TARGET_SIGNAL_TRAP
;
1087 case EXCEPTION_ILLEGAL_INSTRUCTION
:
1088 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_ILLEGAL_INSTRUCTION");
1089 ourstatus
->value
.sig
= TARGET_SIGNAL_ILL
;
1091 case EXCEPTION_PRIV_INSTRUCTION
:
1092 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_PRIV_INSTRUCTION");
1093 ourstatus
->value
.sig
= TARGET_SIGNAL_ILL
;
1095 case EXCEPTION_NONCONTINUABLE_EXCEPTION
:
1096 DEBUG_EXCEPTION_SIMPLE ("EXCEPTION_NONCONTINUABLE_EXCEPTION");
1097 ourstatus
->value
.sig
= TARGET_SIGNAL_ILL
;
1100 /* Treat unhandled first chance exceptions specially. */
1101 if (current_event
.u
.Exception
.dwFirstChance
)
1103 printf_unfiltered ("gdb: unknown target exception 0x%08lx at %s\n",
1104 current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
,
1105 host_address_to_string (
1106 current_event
.u
.Exception
.ExceptionRecord
.ExceptionAddress
));
1107 ourstatus
->value
.sig
= TARGET_SIGNAL_UNKNOWN
;
1111 last_sig
= ourstatus
->value
.sig
;
1115 /* Resume all artificially suspended threads if we are continuing
1118 windows_continue (DWORD continue_status
, int id
)
1124 DEBUG_EVENTS (("ContinueDebugEvent (cpid=%ld, ctid=%ld, %s);\n",
1125 current_event
.dwProcessId
, current_event
.dwThreadId
,
1126 continue_status
== DBG_CONTINUE
?
1127 "DBG_CONTINUE" : "DBG_EXCEPTION_NOT_HANDLED"));
1129 for (th
= &thread_head
; (th
= th
->next
) != NULL
;)
1130 if ((id
== -1 || id
== (int) th
->id
)
1133 if (debug_registers_changed
)
1135 th
->context
.ContextFlags
|= CONTEXT_DEBUG_REGISTERS
;
1136 th
->context
.Dr0
= dr
[0];
1137 th
->context
.Dr1
= dr
[1];
1138 th
->context
.Dr2
= dr
[2];
1139 th
->context
.Dr3
= dr
[3];
1140 th
->context
.Dr6
= DR6_CLEAR_VALUE
;
1141 th
->context
.Dr7
= dr
[7];
1143 if (th
->context
.ContextFlags
)
1145 CHECK (SetThreadContext (th
->h
, &th
->context
));
1146 th
->context
.ContextFlags
= 0;
1148 if (th
->suspended
> 0)
1149 (void) ResumeThread (th
->h
);
1153 res
= ContinueDebugEvent (current_event
.dwProcessId
,
1154 current_event
.dwThreadId
,
1157 debug_registers_changed
= 0;
1161 /* Called in pathological case where Windows fails to send a
1162 CREATE_PROCESS_DEBUG_EVENT after an attach. */
1164 fake_create_process (void)
1166 current_process_handle
= OpenProcess (PROCESS_ALL_ACCESS
, FALSE
,
1167 current_event
.dwProcessId
);
1168 if (current_process_handle
!= NULL
)
1169 open_process_used
= 1;
1172 error (_("OpenProcess call failed, GetLastError = %lud\n"),
1174 /* We can not debug anything in that case. */
1176 main_thread_id
= current_event
.dwThreadId
;
1177 current_thread
= windows_add_thread (ptid_build (current_event
.dwProcessId
, 0,
1178 current_event
.dwThreadId
),
1179 current_event
.u
.CreateThread
.hThread
);
1180 return main_thread_id
;
1184 windows_resume (struct target_ops
*ops
,
1185 ptid_t ptid
, int step
, enum target_signal sig
)
1188 DWORD continue_status
= DBG_CONTINUE
;
1190 /* A specific PTID means `step only this thread id'. */
1191 int resume_all
= ptid_equal (ptid
, minus_one_ptid
);
1193 /* If we're continuing all threads, it's the current inferior that
1194 should be handled specially. */
1196 ptid
= inferior_ptid
;
1198 if (sig
!= TARGET_SIGNAL_0
)
1200 if (current_event
.dwDebugEventCode
!= EXCEPTION_DEBUG_EVENT
)
1202 DEBUG_EXCEPT(("Cannot continue with signal %d here.\n",sig
));
1204 else if (sig
== last_sig
)
1205 continue_status
= DBG_EXCEPTION_NOT_HANDLED
;
1208 /* This code does not seem to work, because
1209 the kernel does probably not consider changes in the ExceptionRecord
1210 structure when passing the exception to the inferior.
1211 Note that this seems possible in the exception handler itself. */
1214 for (i
= 0; xlate
[i
].them
!= -1; i
++)
1215 if (xlate
[i
].us
== sig
)
1217 current_event
.u
.Exception
.ExceptionRecord
.ExceptionCode
=
1219 continue_status
= DBG_EXCEPTION_NOT_HANDLED
;
1222 if (continue_status
== DBG_CONTINUE
)
1224 DEBUG_EXCEPT(("Cannot continue with signal %d.\n",sig
));
1228 DEBUG_EXCEPT(("Can only continue with recieved signal %d.\n",
1232 last_sig
= TARGET_SIGNAL_0
;
1234 DEBUG_EXEC (("gdb: windows_resume (pid=%d, tid=%ld, step=%d, sig=%d);\n",
1235 ptid_get_pid (ptid
), ptid_get_tid (ptid
), step
, sig
));
1237 /* Get context for currently selected thread */
1238 th
= thread_rec (ptid_get_tid (inferior_ptid
), FALSE
);
1243 /* Single step by setting t bit */
1244 windows_fetch_inferior_registers (ops
,
1245 get_current_regcache (),
1246 gdbarch_ps_regnum (current_gdbarch
));
1247 th
->context
.EFlags
|= FLAG_TRACE_BIT
;
1250 if (th
->context
.ContextFlags
)
1252 if (debug_registers_changed
)
1254 th
->context
.Dr0
= dr
[0];
1255 th
->context
.Dr1
= dr
[1];
1256 th
->context
.Dr2
= dr
[2];
1257 th
->context
.Dr3
= dr
[3];
1258 th
->context
.Dr6
= DR6_CLEAR_VALUE
;
1259 th
->context
.Dr7
= dr
[7];
1261 CHECK (SetThreadContext (th
->h
, &th
->context
));
1262 th
->context
.ContextFlags
= 0;
1266 /* Allow continuing with the same signal that interrupted us.
1267 Otherwise complain. */
1270 windows_continue (continue_status
, -1);
1272 windows_continue (continue_status
, ptid_get_tid (ptid
));
1275 /* Ctrl-C handler used when the inferior is not run in the same console. The
1276 handler is in charge of interrupting the inferior using DebugBreakProcess.
1277 Note that this function is not available prior to Windows XP. In this case
1278 we emit a warning. */
1280 ctrl_c_handler (DWORD event_type
)
1282 const int attach_flag
= current_inferior ()->attach_flag
;
1284 /* Only handle Ctrl-C event. Ignore others. */
1285 if (event_type
!= CTRL_C_EVENT
)
1288 /* If the inferior and the debugger share the same console, do nothing as
1289 the inferior has also received the Ctrl-C event. */
1290 if (!new_console
&& !attach_flag
)
1293 if (!DebugBreakProcess (current_process_handle
))
1295 Could not interrupt program. Press Ctrl-c in the program console."));
1297 /* Return true to tell that Ctrl-C has been handled. */
1301 /* Get the next event from the child. Return 1 if the event requires
1302 handling by WFI (or whatever). */
1304 get_windows_debug_event (struct target_ops
*ops
,
1305 int pid
, struct target_waitstatus
*ourstatus
)
1308 DWORD continue_status
, event_code
;
1310 static thread_info dummy_thread_info
;
1313 last_sig
= TARGET_SIGNAL_0
;
1315 if (!(debug_event
= WaitForDebugEvent (¤t_event
, 1000)))
1319 continue_status
= DBG_CONTINUE
;
1321 event_code
= current_event
.dwDebugEventCode
;
1322 ourstatus
->kind
= TARGET_WAITKIND_SPURIOUS
;
1324 have_saved_context
= 0;
1328 case CREATE_THREAD_DEBUG_EVENT
:
1329 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%x code=%s)\n",
1330 (unsigned) current_event
.dwProcessId
,
1331 (unsigned) current_event
.dwThreadId
,
1332 "CREATE_THREAD_DEBUG_EVENT"));
1333 if (saw_create
!= 1)
1335 struct inferior
*inf
;
1336 inf
= find_inferior_pid (current_event
.dwProcessId
);
1337 if (!saw_create
&& inf
->attach_flag
)
1339 /* Kludge around a Windows bug where first event is a create
1340 thread event. Caused when attached process does not have
1342 retval
= fake_create_process ();
1348 /* Record the existence of this thread */
1349 retval
= current_event
.dwThreadId
;
1350 th
= windows_add_thread (ptid_build (current_event
.dwProcessId
, 0,
1351 current_event
.dwThreadId
),
1352 current_event
.u
.CreateThread
.hThread
);
1355 case EXIT_THREAD_DEBUG_EVENT
:
1356 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1357 (unsigned) current_event
.dwProcessId
,
1358 (unsigned) current_event
.dwThreadId
,
1359 "EXIT_THREAD_DEBUG_EVENT"));
1360 if (current_event
.dwThreadId
!= main_thread_id
)
1362 windows_delete_thread (ptid_build (current_event
.dwProcessId
, 0,
1363 current_event
.dwThreadId
));
1364 th
= &dummy_thread_info
;
1368 case CREATE_PROCESS_DEBUG_EVENT
:
1369 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1370 (unsigned) current_event
.dwProcessId
,
1371 (unsigned) current_event
.dwThreadId
,
1372 "CREATE_PROCESS_DEBUG_EVENT"));
1373 CloseHandle (current_event
.u
.CreateProcessInfo
.hFile
);
1374 if (++saw_create
!= 1)
1377 current_process_handle
= current_event
.u
.CreateProcessInfo
.hProcess
;
1379 windows_delete_thread (ptid_build (current_event
.dwProcessId
, 0,
1381 main_thread_id
= current_event
.dwThreadId
;
1382 /* Add the main thread */
1383 th
= windows_add_thread (ptid_build (current_event
.dwProcessId
, 0,
1384 current_event
.dwThreadId
),
1385 current_event
.u
.CreateProcessInfo
.hThread
);
1386 retval
= current_event
.dwThreadId
;
1389 case EXIT_PROCESS_DEBUG_EVENT
:
1390 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1391 (unsigned) current_event
.dwProcessId
,
1392 (unsigned) current_event
.dwThreadId
,
1393 "EXIT_PROCESS_DEBUG_EVENT"));
1394 if (saw_create
!= 1)
1396 ourstatus
->kind
= TARGET_WAITKIND_EXITED
;
1397 ourstatus
->value
.integer
= current_event
.u
.ExitProcess
.dwExitCode
;
1398 retval
= main_thread_id
;
1401 case LOAD_DLL_DEBUG_EVENT
:
1402 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1403 (unsigned) current_event
.dwProcessId
,
1404 (unsigned) current_event
.dwThreadId
,
1405 "LOAD_DLL_DEBUG_EVENT"));
1406 CloseHandle (current_event
.u
.LoadDll
.hFile
);
1407 if (saw_create
!= 1)
1409 catch_errors (handle_load_dll
, NULL
, (char *) "", RETURN_MASK_ALL
);
1410 ourstatus
->kind
= TARGET_WAITKIND_LOADED
;
1411 ourstatus
->value
.integer
= 0;
1412 retval
= main_thread_id
;
1415 case UNLOAD_DLL_DEBUG_EVENT
:
1416 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1417 (unsigned) current_event
.dwProcessId
,
1418 (unsigned) current_event
.dwThreadId
,
1419 "UNLOAD_DLL_DEBUG_EVENT"));
1420 if (saw_create
!= 1)
1422 catch_errors (handle_unload_dll
, NULL
, (char *) "", RETURN_MASK_ALL
);
1423 ourstatus
->kind
= TARGET_WAITKIND_LOADED
;
1424 ourstatus
->value
.integer
= 0;
1425 retval
= main_thread_id
;
1428 case EXCEPTION_DEBUG_EVENT
:
1429 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1430 (unsigned) current_event
.dwProcessId
,
1431 (unsigned) current_event
.dwThreadId
,
1432 "EXCEPTION_DEBUG_EVENT"));
1433 if (saw_create
!= 1)
1435 switch (handle_exception (ourstatus
))
1438 continue_status
= DBG_EXCEPTION_NOT_HANDLED
;
1441 retval
= current_event
.dwThreadId
;
1445 continue_status
= -1;
1450 case OUTPUT_DEBUG_STRING_EVENT
: /* message from the kernel */
1451 DEBUG_EVENTS (("gdb: kernel event for pid=%d tid=%d code=%s)\n",
1452 (unsigned) current_event
.dwProcessId
,
1453 (unsigned) current_event
.dwThreadId
,
1454 "OUTPUT_DEBUG_STRING_EVENT"));
1455 if (saw_create
!= 1)
1457 retval
= handle_output_debug_string (ourstatus
);
1461 if (saw_create
!= 1)
1463 printf_unfiltered ("gdb: kernel event for pid=%ld tid=%ld\n",
1464 (DWORD
) current_event
.dwProcessId
,
1465 (DWORD
) current_event
.dwThreadId
);
1466 printf_unfiltered (" unknown event code %ld\n",
1467 current_event
.dwDebugEventCode
);
1471 if (!retval
|| saw_create
!= 1)
1473 if (continue_status
== -1)
1474 windows_resume (ops
, minus_one_ptid
, 0, 1);
1476 CHECK (windows_continue (continue_status
, -1));
1480 inferior_ptid
= ptid_build (current_event
.dwProcessId
, 0,
1482 current_thread
= th
?: thread_rec (current_event
.dwThreadId
, TRUE
);
1489 /* Wait for interesting events to occur in the target process. */
1491 windows_wait (struct target_ops
*ops
,
1492 ptid_t ptid
, struct target_waitstatus
*ourstatus
)
1496 target_terminal_ours ();
1498 /* We loop when we get a non-standard exception rather than return
1499 with a SPURIOUS because resume can try and step or modify things,
1500 which needs a current_thread->h. But some of these exceptions mark
1501 the birth or death of threads, which mean that the current thread
1502 isn't necessarily what you think it is. */
1508 /* If the user presses Ctrl-c while the debugger is waiting
1509 for an event, he expects the debugger to interrupt his program
1510 and to get the prompt back. There are two possible situations:
1512 - The debugger and the program do not share the console, in
1513 which case the Ctrl-c event only reached the debugger.
1514 In that case, the ctrl_c handler will take care of interrupting
1515 the inferior. Note that this case is working starting with
1516 Windows XP. For Windows 2000, Ctrl-C should be pressed in the
1519 - The debugger and the program share the same console, in which
1520 case both debugger and inferior will receive the Ctrl-c event.
1521 In that case the ctrl_c handler will ignore the event, as the
1522 Ctrl-c event generated inside the inferior will trigger the
1523 expected debug event.
1525 FIXME: brobecker/2008-05-20: If the inferior receives the
1526 signal first and the delay until GDB receives that signal
1527 is sufficiently long, GDB can sometimes receive the SIGINT
1528 after we have unblocked the CTRL+C handler. This would
1529 lead to the debugger stopping prematurely while handling
1530 the new-thread event that comes with the handling of the SIGINT
1531 inside the inferior, and then stop again immediately when
1532 the user tries to resume the execution in the inferior.
1533 This is a classic race that we should try to fix one day. */
1534 SetConsoleCtrlHandler (&ctrl_c_handler
, TRUE
);
1535 retval
= get_windows_debug_event (ops
, pid
, ourstatus
);
1536 SetConsoleCtrlHandler (&ctrl_c_handler
, FALSE
);
1539 return ptid_build (current_event
.dwProcessId
, 0, retval
);
1544 if (deprecated_ui_loop_hook
!= NULL
)
1545 detach
= deprecated_ui_loop_hook (0);
1548 windows_kill_inferior (ops
);
1554 do_initial_windows_stuff (struct target_ops
*ops
, DWORD pid
, int attaching
)
1556 extern int stop_after_trap
;
1558 struct inferior
*inf
;
1559 struct thread_info
*tp
;
1561 last_sig
= TARGET_SIGNAL_0
;
1563 exception_count
= 0;
1564 open_process_used
= 0;
1565 debug_registers_changed
= 0;
1566 debug_registers_used
= 0;
1567 for (i
= 0; i
< sizeof (dr
) / sizeof (dr
[0]); i
++)
1570 cygwin_load_start
= cygwin_load_end
= 0;
1572 current_event
.dwProcessId
= pid
;
1573 memset (¤t_event
, 0, sizeof (current_event
));
1575 disable_breakpoints_in_shlibs ();
1576 windows_clear_solib ();
1577 clear_proceed_status ();
1578 init_wait_for_inferior ();
1580 inf
= add_inferior (pid
);
1581 inf
->attach_flag
= attaching
;
1583 /* Make the new process the current inferior, so terminal handling
1584 can rely on it. When attaching, we don't know about any thread
1585 id here, but that's OK --- nothing should be referencing the
1586 current thread until we report an event out of windows_wait. */
1587 inferior_ptid
= pid_to_ptid (pid
);
1589 terminal_init_inferior_with_pgrp (pid
);
1590 target_terminal_inferior ();
1592 inf
->stop_soon
= STOP_QUIETLY
;
1595 stop_after_trap
= 1;
1596 wait_for_inferior (0);
1597 tp
= inferior_thread ();
1598 if (tp
->stop_signal
!= TARGET_SIGNAL_TRAP
)
1599 resume (0, tp
->stop_signal
);
1604 inf
->stop_soon
= NO_STOP_QUIETLY
;
1605 stop_after_trap
= 0;
1609 /* Try to set or remove a user privilege to the current process. Return -1
1610 if that fails, the previous setting of that privilege otherwise.
1612 This code is copied from the Cygwin source code and rearranged to allow
1613 dynamically loading of the needed symbols from advapi32 which is only
1614 available on NT/2K/XP. */
1616 set_process_privilege (const char *privilege
, BOOL enable
)
1618 HANDLE token_hdl
= NULL
;
1620 TOKEN_PRIVILEGES new_priv
, orig_priv
;
1624 if (!OpenProcessToken (GetCurrentProcess (),
1625 TOKEN_QUERY
| TOKEN_ADJUST_PRIVILEGES
,
1629 if (!LookupPrivilegeValueA (NULL
, privilege
, &restore_priv
))
1632 new_priv
.PrivilegeCount
= 1;
1633 new_priv
.Privileges
[0].Luid
= restore_priv
;
1634 new_priv
.Privileges
[0].Attributes
= enable
? SE_PRIVILEGE_ENABLED
: 0;
1636 if (!AdjustTokenPrivileges (token_hdl
, FALSE
, &new_priv
,
1637 sizeof orig_priv
, &orig_priv
, &size
))
1640 /* Disabled, otherwise every `attach' in an unprivileged user session
1641 would raise the "Failed to get SE_DEBUG_NAME privilege" warning in
1642 windows_attach(). */
1643 /* AdjustTokenPrivileges returns TRUE even if the privilege could not
1644 be enabled. GetLastError () returns an correct error code, though. */
1645 if (enable
&& GetLastError () == ERROR_NOT_ALL_ASSIGNED
)
1649 ret
= orig_priv
.Privileges
[0].Attributes
== SE_PRIVILEGE_ENABLED
? 1 : 0;
1653 CloseHandle (token_hdl
);
1658 /* Attach to process PID, then initialize for debugging it. */
1660 windows_attach (struct target_ops
*ops
, char *args
, int from_tty
)
1666 error_no_arg (_("process-id to attach"));
1668 if (set_process_privilege (SE_DEBUG_NAME
, TRUE
) < 0)
1670 printf_unfiltered ("Warning: Failed to get SE_DEBUG_NAME privilege\n");
1671 printf_unfiltered ("This can cause attach to fail on Windows NT/2K/XP\n");
1674 pid
= strtoul (args
, 0, 0); /* Windows pid */
1676 windows_init_thread_list ();
1677 ok
= DebugActiveProcess (pid
);
1683 /* Try fall back to Cygwin pid */
1684 pid
= cygwin_internal (CW_CYGWIN_PID_TO_WINPID
, pid
);
1687 ok
= DebugActiveProcess (pid
);
1692 error (_("Can't attach to process."));
1694 DebugSetProcessKillOnExit (FALSE
);
1698 char *exec_file
= (char *) get_exec_file (0);
1701 printf_unfiltered ("Attaching to program `%s', %s\n", exec_file
,
1702 target_pid_to_str (pid_to_ptid (pid
)));
1704 printf_unfiltered ("Attaching to %s\n",
1705 target_pid_to_str (pid_to_ptid (pid
)));
1707 gdb_flush (gdb_stdout
);
1710 do_initial_windows_stuff (ops
, pid
, 1);
1711 target_terminal_ours ();
1715 windows_detach (struct target_ops
*ops
, char *args
, int from_tty
)
1720 windows_resume (ops
, ptid
, 0, TARGET_SIGNAL_0
);
1722 if (!DebugActiveProcessStop (current_event
.dwProcessId
))
1724 error (_("Can't detach process %lu (error %lu)"),
1725 current_event
.dwProcessId
, GetLastError ());
1728 DebugSetProcessKillOnExit (FALSE
);
1730 if (detached
&& from_tty
)
1732 char *exec_file
= get_exec_file (0);
1735 printf_unfiltered ("Detaching from program: %s, Pid %lu\n", exec_file
,
1736 current_event
.dwProcessId
);
1737 gdb_flush (gdb_stdout
);
1740 inferior_ptid
= null_ptid
;
1741 detach_inferior (current_event
.dwProcessId
);
1743 unpush_target (ops
);
1747 windows_pid_to_exec_file (int pid
)
1749 static char path
[MAX_PATH
+ 1];
1752 /* Try to find exe name as symlink target of /proc/<pid>/exe */
1754 char procexe
[sizeof ("/proc/4294967295/exe")];
1755 sprintf (procexe
, "/proc/%u/exe", pid
);
1756 nchars
= readlink (procexe
, path
, sizeof(path
));
1757 if (nchars
> 0 && nchars
< sizeof (path
))
1759 path
[nchars
] = '\0'; /* Got it */
1764 /* If we get here then either Cygwin is hosed, this isn't a Cygwin version
1765 of gdb, or we're trying to debug a non-Cygwin windows executable. */
1766 if (!get_module_name (0, path
))
1772 /* Print status information about what we're accessing. */
1775 windows_files_info (struct target_ops
*ignore
)
1777 struct inferior
*inf
= current_inferior ();
1779 printf_unfiltered ("\tUsing the running image of %s %s.\n",
1780 inf
->attach_flag
? "attached" : "child",
1781 target_pid_to_str (inferior_ptid
));
1785 windows_open (char *arg
, int from_tty
)
1787 error (_("Use the \"run\" command to start a Unix child process."));
1790 /* Start an inferior windows child process and sets inferior_ptid to its pid.
1791 EXEC_FILE is the file to run.
1792 ALLARGS is a string containing the arguments to the program.
1793 ENV is the environment vector to pass. Errors reported with error(). */
1796 windows_create_inferior (struct target_ops
*ops
, char *exec_file
,
1797 char *allargs
, char **in_env
, int from_tty
)
1800 PROCESS_INFORMATION pi
;
1804 char real_path
[MAXPATHLEN
];
1806 char shell
[MAX_PATH
+ 1]; /* Path to shell */
1810 int ostdin
, ostdout
, ostderr
;
1814 const char *inferior_io_terminal
= get_inferior_io_terminal ();
1817 error (_("No executable specified, use `target exec'."));
1819 memset (&si
, 0, sizeof (si
));
1820 si
.cb
= sizeof (si
);
1825 flags
= DEBUG_ONLY_THIS_PROCESS
;
1826 cygwin_conv_to_win32_path (exec_file
, real_path
);
1832 sh
= getenv ("SHELL");
1835 cygwin_conv_to_win32_path (sh
, shell
);
1836 newallargs
= alloca (sizeof (" -c 'exec '") + strlen (exec_file
)
1837 + strlen (allargs
) + 2);
1838 sprintf (newallargs
, " -c 'exec %s %s'", exec_file
, allargs
);
1839 allargs
= newallargs
;
1841 flags
= DEBUG_PROCESS
;
1845 flags
= DEBUG_ONLY_THIS_PROCESS
;
1849 flags
|= CREATE_NEW_PROCESS_GROUP
;
1852 flags
|= CREATE_NEW_CONSOLE
;
1854 args
= alloca (strlen (toexec
) + strlen (allargs
) + 2);
1855 strcpy (args
, toexec
);
1857 strcat (args
, allargs
);
1860 /* Prepare the environment vars for CreateProcess. */
1861 cygwin_internal (CW_SYNC_WINENV
);
1863 if (!inferior_io_terminal
)
1864 tty
= ostdin
= ostdout
= ostderr
= -1;
1867 tty
= open (inferior_io_terminal
, O_RDWR
| O_NOCTTY
);
1870 print_sys_errmsg (inferior_io_terminal
, errno
);
1871 ostdin
= ostdout
= ostderr
= -1;
1884 if (!inferior_io_terminal
)
1885 tty
= INVALID_HANDLE_VALUE
;
1888 SECURITY_ATTRIBUTES sa
;
1889 sa
.nLength
= sizeof(sa
);
1890 sa
.lpSecurityDescriptor
= 0;
1891 sa
.bInheritHandle
= TRUE
;
1892 tty
= CreateFileA (inferior_io_terminal
, GENERIC_READ
| GENERIC_WRITE
,
1893 0, &sa
, OPEN_EXISTING
, FILE_ATTRIBUTE_NORMAL
, 0);
1894 if (tty
== INVALID_HANDLE_VALUE
)
1895 warning (_("Warning: Failed to open TTY %s, error %#x."),
1896 inferior_io_terminal
, (unsigned) GetLastError ());
1900 si
.hStdOutput
= tty
;
1902 si
.dwFlags
|= STARTF_USESTDHANDLES
;
1907 windows_init_thread_list ();
1908 ret
= CreateProcess (0,
1909 args
, /* command line */
1910 NULL
, /* Security */
1912 TRUE
, /* inherit handles */
1913 flags
, /* start flags */
1914 NULL
, /* environment */
1915 NULL
, /* current directory */
1931 if (tty
!= INVALID_HANDLE_VALUE
)
1936 error (_("Error creating process %s, (error %d)."),
1937 exec_file
, (unsigned) GetLastError ());
1939 CloseHandle (pi
.hThread
);
1940 CloseHandle (pi
.hProcess
);
1942 if (useshell
&& shell
[0] != '\0')
1947 do_initial_windows_stuff (ops
, pi
.dwProcessId
, 0);
1949 /* windows_continue (DBG_CONTINUE, -1); */
1953 windows_mourn_inferior (struct target_ops
*ops
)
1955 (void) windows_continue (DBG_CONTINUE
, -1);
1956 i386_cleanup_dregs();
1957 if (open_process_used
)
1959 CHECK (CloseHandle (current_process_handle
));
1960 open_process_used
= 0;
1962 unpush_target (ops
);
1963 generic_mourn_inferior ();
1966 /* Send a SIGINT to the process group. This acts just like the user typed a
1967 ^C on the controlling terminal. */
1970 windows_stop (ptid_t ptid
)
1972 DEBUG_EVENTS (("gdb: GenerateConsoleCtrlEvent (CTRLC_EVENT, 0)\n"));
1973 CHECK (GenerateConsoleCtrlEvent (CTRL_C_EVENT
, current_event
.dwProcessId
));
1974 registers_changed (); /* refresh register state */
1978 windows_xfer_memory (CORE_ADDR memaddr
, gdb_byte
*our
, int len
,
1979 int write
, struct mem_attrib
*mem
,
1980 struct target_ops
*target
)
1985 DEBUG_MEM (("gdb: write target memory, %d bytes at 0x%08lx\n",
1986 len
, (DWORD
) (uintptr_t) memaddr
));
1987 if (!WriteProcessMemory (current_process_handle
,
1988 (LPVOID
) (uintptr_t) memaddr
, our
,
1991 FlushInstructionCache (current_process_handle
,
1992 (LPCVOID
) (uintptr_t) memaddr
, len
);
1996 DEBUG_MEM (("gdb: read target memory, %d bytes at 0x%08lx\n",
1997 len
, (DWORD
) (uintptr_t) memaddr
));
1998 if (!ReadProcessMemory (current_process_handle
,
1999 (LPCVOID
) (uintptr_t) memaddr
, our
,
2007 windows_kill_inferior (struct target_ops
*ops
)
2009 CHECK (TerminateProcess (current_process_handle
, 0));
2013 if (!windows_continue (DBG_CONTINUE
, -1))
2015 if (!WaitForDebugEvent (¤t_event
, INFINITE
))
2017 if (current_event
.dwDebugEventCode
== EXIT_PROCESS_DEBUG_EVENT
)
2021 target_mourn_inferior (); /* or just windows_mourn_inferior? */
2025 windows_prepare_to_store (struct regcache
*regcache
)
2027 /* Do nothing, since we can store individual regs */
2031 windows_can_run (void)
2037 windows_close (int x
)
2039 DEBUG_EVENTS (("gdb: windows_close, inferior_ptid=%d\n",
2040 PIDGET (inferior_ptid
)));
2043 /* Convert pid to printable format. */
2045 windows_pid_to_str (struct target_ops
*ops
, ptid_t ptid
)
2047 static char buf
[80];
2049 if (ptid_get_tid (ptid
) != 0)
2051 snprintf (buf
, sizeof (buf
), "Thread %d.0x%lx",
2052 ptid_get_pid (ptid
), ptid_get_tid (ptid
));
2056 return normal_pid_to_str (ptid
);
2060 windows_xfer_shared_libraries (struct target_ops
*ops
,
2061 enum target_object object
, const char *annex
,
2062 gdb_byte
*readbuf
, const gdb_byte
*writebuf
,
2063 ULONGEST offset
, LONGEST len
)
2065 struct obstack obstack
;
2073 obstack_init (&obstack
);
2074 obstack_grow_str (&obstack
, "<library-list>\n");
2075 for (so
= solib_start
.next
; so
; so
= so
->next
)
2076 windows_xfer_shared_library (so
->so_name
, (CORE_ADDR
) (uintptr_t) so
->lm_info
->load_addr
,
2078 obstack_grow_str0 (&obstack
, "</library-list>\n");
2080 buf
= obstack_finish (&obstack
);
2081 len_avail
= strlen (buf
);
2082 if (offset
>= len_avail
)
2085 if (len
> len_avail
- offset
)
2086 len
= len_avail
- offset
;
2087 memcpy (readbuf
, buf
+ offset
, len
);
2089 obstack_free (&obstack
, NULL
);
2094 windows_xfer_partial (struct target_ops
*ops
, enum target_object object
,
2095 const char *annex
, gdb_byte
*readbuf
,
2096 const gdb_byte
*writebuf
, ULONGEST offset
, LONGEST len
)
2100 case TARGET_OBJECT_MEMORY
:
2102 return (*ops
->deprecated_xfer_memory
) (offset
, readbuf
,
2103 len
, 0/*read*/, NULL
, ops
);
2105 return (*ops
->deprecated_xfer_memory
) (offset
, (gdb_byte
*) writebuf
,
2106 len
, 1/*write*/, NULL
, ops
);
2109 case TARGET_OBJECT_LIBRARIES
:
2110 return windows_xfer_shared_libraries (ops
, object
, annex
, readbuf
,
2111 writebuf
, offset
, len
);
2114 if (ops
->beneath
!= NULL
)
2115 return ops
->beneath
->to_xfer_partial (ops
->beneath
, object
, annex
,
2116 readbuf
, writebuf
, offset
, len
);
2122 windows_get_ada_task_ptid (long lwp
, long thread
)
2124 return ptid_build (ptid_get_pid (inferior_ptid
), 0, lwp
);
2128 init_windows_ops (void)
2130 windows_ops
.to_shortname
= "child";
2131 windows_ops
.to_longname
= "Win32 child process";
2132 windows_ops
.to_doc
= "Win32 child process (started by the \"run\" command).";
2133 windows_ops
.to_open
= windows_open
;
2134 windows_ops
.to_close
= windows_close
;
2135 windows_ops
.to_attach
= windows_attach
;
2136 windows_ops
.to_attach_no_wait
= 1;
2137 windows_ops
.to_detach
= windows_detach
;
2138 windows_ops
.to_resume
= windows_resume
;
2139 windows_ops
.to_wait
= windows_wait
;
2140 windows_ops
.to_fetch_registers
= windows_fetch_inferior_registers
;
2141 windows_ops
.to_store_registers
= windows_store_inferior_registers
;
2142 windows_ops
.to_prepare_to_store
= windows_prepare_to_store
;
2143 windows_ops
.deprecated_xfer_memory
= windows_xfer_memory
;
2144 windows_ops
.to_xfer_partial
= windows_xfer_partial
;
2145 windows_ops
.to_files_info
= windows_files_info
;
2146 windows_ops
.to_insert_breakpoint
= memory_insert_breakpoint
;
2147 windows_ops
.to_remove_breakpoint
= memory_remove_breakpoint
;
2148 windows_ops
.to_terminal_init
= terminal_init_inferior
;
2149 windows_ops
.to_terminal_inferior
= terminal_inferior
;
2150 windows_ops
.to_terminal_ours_for_output
= terminal_ours_for_output
;
2151 windows_ops
.to_terminal_ours
= terminal_ours
;
2152 windows_ops
.to_terminal_save_ours
= terminal_save_ours
;
2153 windows_ops
.to_terminal_info
= child_terminal_info
;
2154 windows_ops
.to_kill
= windows_kill_inferior
;
2155 windows_ops
.to_create_inferior
= windows_create_inferior
;
2156 windows_ops
.to_mourn_inferior
= windows_mourn_inferior
;
2157 windows_ops
.to_can_run
= windows_can_run
;
2158 windows_ops
.to_thread_alive
= windows_thread_alive
;
2159 windows_ops
.to_pid_to_str
= windows_pid_to_str
;
2160 windows_ops
.to_stop
= windows_stop
;
2161 windows_ops
.to_stratum
= process_stratum
;
2162 windows_ops
.to_has_all_memory
= 1;
2163 windows_ops
.to_has_memory
= 1;
2164 windows_ops
.to_has_stack
= 1;
2165 windows_ops
.to_has_registers
= 1;
2166 windows_ops
.to_has_execution
= 1;
2167 windows_ops
.to_pid_to_exec_file
= windows_pid_to_exec_file
;
2168 windows_ops
.to_get_ada_task_ptid
= windows_get_ada_task_ptid
;
2169 i386_use_watchpoints (&windows_ops
);
2171 windows_ops
.to_magic
= OPS_MAGIC
;
2175 set_windows_aliases (char *argv0
)
2177 add_info_alias ("dll", "sharedlibrary", 1);
2181 _initialize_windows_nat (void)
2183 struct cmd_list_element
*c
;
2185 init_windows_ops ();
2187 c
= add_com ("dll-symbols", class_files
, dll_symbol_command
,
2188 _("Load dll library symbols from FILE."));
2189 set_cmd_completer (c
, filename_completer
);
2191 add_com_alias ("sharedlibrary", "dll-symbols", class_alias
, 1);
2194 add_setshow_boolean_cmd ("shell", class_support
, &useshell
, _("\
2195 Set use of shell to start subprocess."), _("\
2196 Show use of shell to start subprocess."), NULL
,
2198 NULL
, /* FIXME: i18n: */
2199 &setlist
, &showlist
);
2201 add_setshow_boolean_cmd ("cygwin-exceptions", class_support
, &cygwin_exceptions
, _("\
2202 Break when an exception is detected in the Cygwin DLL itself."), _("\
2203 Show whether gdb breaks on exceptions in the Cygwin DLL itself."), NULL
,
2205 NULL
, /* FIXME: i18n: */
2206 &setlist
, &showlist
);
2209 add_setshow_boolean_cmd ("new-console", class_support
, &new_console
, _("\
2210 Set creation of new console when creating child process."), _("\
2211 Show creation of new console when creating child process."), NULL
,
2213 NULL
, /* FIXME: i18n: */
2214 &setlist
, &showlist
);
2216 add_setshow_boolean_cmd ("new-group", class_support
, &new_group
, _("\
2217 Set creation of new group when creating child process."), _("\
2218 Show creation of new group when creating child process."), NULL
,
2220 NULL
, /* FIXME: i18n: */
2221 &setlist
, &showlist
);
2223 add_setshow_boolean_cmd ("debugexec", class_support
, &debug_exec
, _("\
2224 Set whether to display execution in child process."), _("\
2225 Show whether to display execution in child process."), NULL
,
2227 NULL
, /* FIXME: i18n: */
2228 &setlist
, &showlist
);
2230 add_setshow_boolean_cmd ("debugevents", class_support
, &debug_events
, _("\
2231 Set whether to display kernel events in child process."), _("\
2232 Show whether to display kernel events in child process."), NULL
,
2234 NULL
, /* FIXME: i18n: */
2235 &setlist
, &showlist
);
2237 add_setshow_boolean_cmd ("debugmemory", class_support
, &debug_memory
, _("\
2238 Set whether to display memory accesses in child process."), _("\
2239 Show whether to display memory accesses in child process."), NULL
,
2241 NULL
, /* FIXME: i18n: */
2242 &setlist
, &showlist
);
2244 add_setshow_boolean_cmd ("debugexceptions", class_support
,
2245 &debug_exceptions
, _("\
2246 Set whether to display kernel exceptions in child process."), _("\
2247 Show whether to display kernel exceptions in child process."), NULL
,
2249 NULL
, /* FIXME: i18n: */
2250 &setlist
, &showlist
);
2252 add_prefix_cmd ("w32", class_info
, info_w32_command
,
2253 _("Print information specific to Win32 debugging."),
2254 &info_w32_cmdlist
, "info w32 ", 0, &infolist
);
2256 add_cmd ("selector", class_info
, display_selectors
,
2257 _("Display selectors infos."),
2259 add_target (&windows_ops
);
2260 deprecated_init_ui_hook
= set_windows_aliases
;
2263 /* Hardware watchpoint support, adapted from go32-nat.c code. */
2265 /* Pass the address ADDR to the inferior in the I'th debug register.
2266 Here we just store the address in dr array, the registers will be
2267 actually set up when windows_continue is called. */
2269 cygwin_set_dr (int i
, CORE_ADDR addr
)
2272 internal_error (__FILE__
, __LINE__
,
2273 _("Invalid register %d in cygwin_set_dr.\n"), i
);
2275 debug_registers_changed
= 1;
2276 debug_registers_used
= 1;
2279 /* Pass the value VAL to the inferior in the DR7 debug control
2280 register. Here we just store the address in D_REGS, the watchpoint
2281 will be actually set up in windows_wait. */
2283 cygwin_set_dr7 (unsigned val
)
2286 debug_registers_changed
= 1;
2287 debug_registers_used
= 1;
2290 /* Get the value of the DR6 debug status register from the inferior.
2291 Here we just return the value stored in dr[6]
2292 by the last call to thread_rec for current_event.dwThreadId id. */
2294 cygwin_get_dr6 (void)
2299 /* Determine if the thread referenced by "ptid" is alive
2300 by "polling" it. If WaitForSingleObject returns WAIT_OBJECT_0
2301 it means that the thread has died. Otherwise it is assumed to be alive. */
2303 windows_thread_alive (struct target_ops
*ops
, ptid_t ptid
)
2307 gdb_assert (ptid_get_tid (ptid
) != 0);
2308 tid
= ptid_get_tid (ptid
);
2310 return WaitForSingleObject (thread_rec (tid
, FALSE
)->h
, 0) == WAIT_OBJECT_0
?
2315 _initialize_check_for_gdb_ini (void)
2318 if (inhibit_gdbinit
)
2321 homedir
= getenv ("HOME");
2325 char *oldini
= (char *) alloca (strlen (homedir
) +
2326 sizeof ("/gdb.ini"));
2327 strcpy (oldini
, homedir
);
2328 p
= strchr (oldini
, '\0');
2329 if (p
> oldini
&& p
[-1] != '/')
2331 strcpy (p
, "gdb.ini");
2332 if (access (oldini
, 0) == 0)
2334 int len
= strlen (oldini
);
2335 char *newini
= alloca (len
+ 1);
2336 sprintf (newini
, "%.*s.gdbinit",
2337 (int) (len
- (sizeof ("gdb.ini") - 1)), oldini
);
2338 warning (_("obsolete '%s' found. Rename to '%s'."), oldini
, newini
);
2343 /* Define dummy functions which always return error for the rare cases where
2344 these functions could not be found. */
2346 bad_DebugActiveProcessStop (DWORD w
)
2351 bad_DebugBreakProcess (HANDLE w
)
2356 bad_DebugSetProcessKillOnExit (BOOL w
)
2361 bad_EnumProcessModules (HANDLE w
, HMODULE
*x
, DWORD y
, LPDWORD z
)
2366 bad_GetModuleFileNameExA (HANDLE w
, HMODULE x
, LPSTR y
, DWORD z
)
2371 bad_GetModuleInformation (HANDLE w
, HMODULE x
, LPMODULEINFO y
, DWORD z
)
2377 bad_OpenProcessToken (HANDLE w
, DWORD x
, PHANDLE y
)
2382 /* Load any functions which may not be available in ancient versions
2385 _initialize_loadable (void)
2389 hm
= LoadLibrary ("kernel32.dll");
2392 dyn_DebugActiveProcessStop
= (void *)
2393 GetProcAddress (hm
, "DebugActiveProcessStop");
2394 dyn_DebugBreakProcess
= (void *)
2395 GetProcAddress (hm
, "DebugBreakProcess");
2396 dyn_DebugSetProcessKillOnExit
= (void *)
2397 GetProcAddress (hm
, "DebugSetProcessKillOnExit");
2400 /* Set variables to dummy versions of these processes if the function
2401 wasn't found in kernel32.dll. */
2402 if (!dyn_DebugBreakProcess
)
2403 dyn_DebugBreakProcess
= bad_DebugBreakProcess
;
2404 if (!dyn_DebugActiveProcessStop
|| !dyn_DebugSetProcessKillOnExit
)
2406 dyn_DebugActiveProcessStop
= bad_DebugActiveProcessStop
;
2407 dyn_DebugSetProcessKillOnExit
= bad_DebugSetProcessKillOnExit
;
2410 /* Load optional functions used for retrieving filename information
2411 associated with the currently debugged process or its dlls. */
2412 hm
= LoadLibrary ("psapi.dll");
2415 dyn_EnumProcessModules
= (void *)
2416 GetProcAddress (hm
, "EnumProcessModules");
2417 dyn_GetModuleInformation
= (void *)
2418 GetProcAddress (hm
, "GetModuleInformation");
2419 dyn_GetModuleFileNameExA
= (void *)
2420 GetProcAddress (hm
, "GetModuleFileNameExA");
2423 if (!dyn_EnumProcessModules
|| !dyn_GetModuleInformation
|| !dyn_GetModuleFileNameExA
)
2425 /* Set variables to dummy versions of these processes if the function
2426 wasn't found in psapi.dll. */
2427 dyn_EnumProcessModules
= bad_EnumProcessModules
;
2428 dyn_GetModuleInformation
= bad_GetModuleInformation
;
2429 dyn_GetModuleFileNameExA
= bad_GetModuleFileNameExA
;
2430 /* This will probably fail on Windows 9x/Me. Let the user know that we're
2431 missing some functionality. */
2432 warning(_("cannot automatically find executable file or library to read symbols.\nUse \"file\" or \"dll\" command to load executable/libraries directly."));
2435 hm
= LoadLibrary ("advapi32.dll");
2438 dyn_OpenProcessToken
= (void *)
2439 GetProcAddress (hm
, "OpenProcessToken");
2440 dyn_LookupPrivilegeValueA
= (void *)
2441 GetProcAddress (hm
, "LookupPrivilegeValueA");
2442 dyn_AdjustTokenPrivileges
= (void *)
2443 GetProcAddress (hm
, "AdjustTokenPrivileges");
2444 /* Only need to set one of these since if OpenProcessToken fails nothing
2446 if (!dyn_OpenProcessToken
|| !dyn_LookupPrivilegeValueA
|| !dyn_AdjustTokenPrivileges
)
2447 dyn_OpenProcessToken
= bad_OpenProcessToken
;