diff options
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/win32-nat.c | 124 | ||||
-rw-r--r-- | gdb/windows-nat.c | 124 |
3 files changed, 132 insertions, 122 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a4e5aaf..e0f06d9 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2003-12-25 Christopher Faylor <cgf@redhat.com> + + * win32-nat.c (get_child_debug_event): Keep main thread id around even + after thread exits since Windows insists on continuing to report events + against it. + 2003-12-22 Mark Kettenis <kettenis@gnu.org> * dwarf2-frame.c (dwarf2_frame_cache): Don't skip the return diff --git a/gdb/win32-nat.c b/gdb/win32-nat.c index 358bdf7..c29bcc0 100644 --- a/gdb/win32-nat.c +++ b/gdb/win32-nat.c @@ -76,8 +76,8 @@ enum | CONTEXT_EXTENDED_REGISTERS static unsigned dr[8]; -static int debug_registers_changed = 0; -static int debug_registers_used = 0; +static int debug_registers_changed; +static int debug_registers_used; /* The string sent by cygwin when it processes a signal. FIXME: This should be in a cygwin include file. */ @@ -1205,7 +1205,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) { BOOL debug_event; DWORD continue_status, event_code; - thread_info *th = NULL; + thread_info *th; static thread_info dummy_thread_info; int retval = 0; @@ -1219,6 +1219,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) event_code = current_event.dwDebugEventCode; ourstatus->kind = TARGET_WAITKIND_SPURIOUS; + th = NULL; switch (event_code) { @@ -1246,8 +1247,11 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) "EXIT_THREAD_DEBUG_EVENT")); if (saw_create != 1) break; - child_delete_thread (current_event.dwThreadId); - th = &dummy_thread_info; + if (current_event.dwThreadId != main_thread_id) + { + child_delete_thread (current_event.dwThreadId); + th = &dummy_thread_info; + } break; case CREATE_PROCESS_DEBUG_EVENT: @@ -1263,12 +1267,10 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) } current_process_handle = current_event.u.CreateProcessInfo.hProcess; + if (main_thread_id) + child_delete_thread (main_thread_id); main_thread_id = current_event.dwThreadId; /* Add the main thread */ -#if 0 - th = child_add_thread (current_event.dwProcessId, - current_event.u.CreateProcessInfo.hProcess); -#endif th = child_add_thread (main_thread_id, current_event.u.CreateProcessInfo.hThread); retval = ourstatus->value.related_pid = current_event.dwThreadId; @@ -2199,65 +2201,65 @@ core_dll_symbols_add (char *dll_name, DWORD base_addr) } } - register_loaded_dll (dll_name, base_addr + 0x1000); - solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000); + register_loaded_dll (dll_name, base_addr + 0x1000); + solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000); -out: - return 1; -} + out: + return 1; + } -typedef struct -{ - struct target_ops *target; - bfd_vma addr; -} map_code_section_args; + typedef struct + { + struct target_ops *target; + bfd_vma addr; + } map_code_section_args; -static void -map_single_dll_code_section (bfd * abfd, asection * sect, void *obj) -{ - int old; - int update_coreops; - struct section_table *new_target_sect_ptr; + static void + map_single_dll_code_section (bfd * abfd, asection * sect, void *obj) + { + int old; + int update_coreops; + struct section_table *new_target_sect_ptr; - map_code_section_args *args = (map_code_section_args *) obj; - struct target_ops *target = args->target; - if (sect->flags & SEC_CODE) - { - update_coreops = core_ops.to_sections == target->to_sections; + map_code_section_args *args = (map_code_section_args *) obj; + struct target_ops *target = args->target; + if (sect->flags & SEC_CODE) + { + update_coreops = core_ops.to_sections == target->to_sections; - if (target->to_sections) - { - old = target->to_sections_end - target->to_sections; - target->to_sections = (struct section_table *) - xrealloc ((char *) target->to_sections, - (sizeof (struct section_table)) * (1 + old)); - } - else - { - old = 0; - target->to_sections = (struct section_table *) - xmalloc ((sizeof (struct section_table))); - } - target->to_sections_end = target->to_sections + (1 + old); + if (target->to_sections) + { + old = target->to_sections_end - target->to_sections; + target->to_sections = (struct section_table *) + xrealloc ((char *) target->to_sections, + (sizeof (struct section_table)) * (1 + old)); + } + else + { + old = 0; + target->to_sections = (struct section_table *) + xmalloc ((sizeof (struct section_table))); + } + target->to_sections_end = target->to_sections + (1 + old); - /* Update the to_sections field in the core_ops structure - if needed. */ - if (update_coreops) - { - core_ops.to_sections = target->to_sections; - core_ops.to_sections_end = target->to_sections_end; - } - new_target_sect_ptr = target->to_sections + old; - new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect); - new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) + - bfd_section_size (abfd, sect);; - new_target_sect_ptr->the_bfd_section = sect; - new_target_sect_ptr->bfd = abfd; - } -} + /* Update the to_sections field in the core_ops structure + if needed. */ + if (update_coreops) + { + core_ops.to_sections = target->to_sections; + core_ops.to_sections_end = target->to_sections_end; + } + new_target_sect_ptr = target->to_sections + old; + new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect); + new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) + + bfd_section_size (abfd, sect);; + new_target_sect_ptr->the_bfd_section = sect; + new_target_sect_ptr->bfd = abfd; + } + } -static int -dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target) + static int + dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target) { bfd *dll_bfd; map_code_section_args map_args; diff --git a/gdb/windows-nat.c b/gdb/windows-nat.c index 358bdf7..c29bcc0 100644 --- a/gdb/windows-nat.c +++ b/gdb/windows-nat.c @@ -76,8 +76,8 @@ enum | CONTEXT_EXTENDED_REGISTERS static unsigned dr[8]; -static int debug_registers_changed = 0; -static int debug_registers_used = 0; +static int debug_registers_changed; +static int debug_registers_used; /* The string sent by cygwin when it processes a signal. FIXME: This should be in a cygwin include file. */ @@ -1205,7 +1205,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) { BOOL debug_event; DWORD continue_status, event_code; - thread_info *th = NULL; + thread_info *th; static thread_info dummy_thread_info; int retval = 0; @@ -1219,6 +1219,7 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) event_code = current_event.dwDebugEventCode; ourstatus->kind = TARGET_WAITKIND_SPURIOUS; + th = NULL; switch (event_code) { @@ -1246,8 +1247,11 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) "EXIT_THREAD_DEBUG_EVENT")); if (saw_create != 1) break; - child_delete_thread (current_event.dwThreadId); - th = &dummy_thread_info; + if (current_event.dwThreadId != main_thread_id) + { + child_delete_thread (current_event.dwThreadId); + th = &dummy_thread_info; + } break; case CREATE_PROCESS_DEBUG_EVENT: @@ -1263,12 +1267,10 @@ get_child_debug_event (int pid, struct target_waitstatus *ourstatus) } current_process_handle = current_event.u.CreateProcessInfo.hProcess; + if (main_thread_id) + child_delete_thread (main_thread_id); main_thread_id = current_event.dwThreadId; /* Add the main thread */ -#if 0 - th = child_add_thread (current_event.dwProcessId, - current_event.u.CreateProcessInfo.hProcess); -#endif th = child_add_thread (main_thread_id, current_event.u.CreateProcessInfo.hThread); retval = ourstatus->value.related_pid = current_event.dwThreadId; @@ -2199,65 +2201,65 @@ core_dll_symbols_add (char *dll_name, DWORD base_addr) } } - register_loaded_dll (dll_name, base_addr + 0x1000); - solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000); + register_loaded_dll (dll_name, base_addr + 0x1000); + solib_symbols_add (dll_name, 0, (CORE_ADDR) base_addr + 0x1000); -out: - return 1; -} + out: + return 1; + } -typedef struct -{ - struct target_ops *target; - bfd_vma addr; -} map_code_section_args; + typedef struct + { + struct target_ops *target; + bfd_vma addr; + } map_code_section_args; -static void -map_single_dll_code_section (bfd * abfd, asection * sect, void *obj) -{ - int old; - int update_coreops; - struct section_table *new_target_sect_ptr; + static void + map_single_dll_code_section (bfd * abfd, asection * sect, void *obj) + { + int old; + int update_coreops; + struct section_table *new_target_sect_ptr; - map_code_section_args *args = (map_code_section_args *) obj; - struct target_ops *target = args->target; - if (sect->flags & SEC_CODE) - { - update_coreops = core_ops.to_sections == target->to_sections; + map_code_section_args *args = (map_code_section_args *) obj; + struct target_ops *target = args->target; + if (sect->flags & SEC_CODE) + { + update_coreops = core_ops.to_sections == target->to_sections; - if (target->to_sections) - { - old = target->to_sections_end - target->to_sections; - target->to_sections = (struct section_table *) - xrealloc ((char *) target->to_sections, - (sizeof (struct section_table)) * (1 + old)); - } - else - { - old = 0; - target->to_sections = (struct section_table *) - xmalloc ((sizeof (struct section_table))); - } - target->to_sections_end = target->to_sections + (1 + old); + if (target->to_sections) + { + old = target->to_sections_end - target->to_sections; + target->to_sections = (struct section_table *) + xrealloc ((char *) target->to_sections, + (sizeof (struct section_table)) * (1 + old)); + } + else + { + old = 0; + target->to_sections = (struct section_table *) + xmalloc ((sizeof (struct section_table))); + } + target->to_sections_end = target->to_sections + (1 + old); - /* Update the to_sections field in the core_ops structure - if needed. */ - if (update_coreops) - { - core_ops.to_sections = target->to_sections; - core_ops.to_sections_end = target->to_sections_end; - } - new_target_sect_ptr = target->to_sections + old; - new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect); - new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) + - bfd_section_size (abfd, sect);; - new_target_sect_ptr->the_bfd_section = sect; - new_target_sect_ptr->bfd = abfd; - } -} + /* Update the to_sections field in the core_ops structure + if needed. */ + if (update_coreops) + { + core_ops.to_sections = target->to_sections; + core_ops.to_sections_end = target->to_sections_end; + } + new_target_sect_ptr = target->to_sections + old; + new_target_sect_ptr->addr = args->addr + bfd_section_vma (abfd, sect); + new_target_sect_ptr->endaddr = args->addr + bfd_section_vma (abfd, sect) + + bfd_section_size (abfd, sect);; + new_target_sect_ptr->the_bfd_section = sect; + new_target_sect_ptr->bfd = abfd; + } + } -static int -dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target) + static int + dll_code_sections_add (const char *dll_name, int base_addr, struct target_ops *target) { bfd *dll_bfd; map_code_section_args map_args; |