X-Git-Url: http://drtracing.org/?a=blobdiff_plain;ds=sidebyside;f=gdb%2Fcorelow.c;h=224719e8b322f6547e55243d92a78b0e03c1c36d;hb=f3abeff575541dd80e1facd6d0f920e10f77fede;hp=42af7f44753dd4309bc07cd3a122ccca38888fba;hpb=8f0435f75e3c9676d2e177ce055fed3155fd9476;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/corelow.c b/gdb/corelow.c index 42af7f4475..224719e8b3 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -1,6 +1,6 @@ /* Core dump and executable file functions below target vector, for GDB. - Copyright (C) 1986-2014 Free Software Foundation, Inc. + Copyright (C) 1986-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -38,7 +38,6 @@ #include "symfile.h" #include "exec.h" #include "readline/readline.h" -#include "exceptions.h" #include "solib.h" #include "filenames.h" #include "progspace.h" @@ -134,9 +133,7 @@ sniff_core_bfd (bfd *abfd) /* Don't sniff if we have support for register sets in CORE_GDBARCH. */ - if (core_gdbarch - && (gdbarch_iterate_over_regset_sections_p (core_gdbarch) - || gdbarch_regset_from_core_section_p (core_gdbarch))) + if (core_gdbarch && gdbarch_iterate_over_regset_sections_p (core_gdbarch)) return NULL; for (cf = core_file_fns; cf != NULL; cf = cf->next) @@ -237,7 +234,7 @@ add_to_thread_list (bfd *abfd, asection *asect, void *reg_sect_arg) int fake_pid_p = 0; struct inferior *inf; - if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0) + if (!startswith (bfd_section_name (abfd, asect), ".reg/")) return; core_tid = atoi (bfd_section_name (abfd, asect) + 5); @@ -281,7 +278,6 @@ core_open (const char *arg, int from_tty) bfd *temp_bfd; int scratch_chan; int flags; - volatile struct gdb_exception except; char *filename; target_preopen (from_tty); @@ -414,13 +410,16 @@ core_open (const char *arg, int from_tty) may be a thread_stratum target loaded on top of target core by now. The layer above should claim threads found in the BFD sections. */ - TRY_CATCH (except, RETURN_MASK_ERROR) + TRY { - target_find_new_threads (); + target_update_thread_list (); } - if (except.reason < 0) - exception_print (gdb_stderr, except); + CATCH (except, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, except); + } + END_CATCH p = bfd_core_file_failing_command (core_bfd); if (p) @@ -459,6 +458,22 @@ core_open (const char *arg, int from_tty) /* Now, set up the frame cache, and print the top of stack. */ reinit_frame_cache (); print_stack_frame (get_selected_frame (NULL), 1, SRC_AND_LOC, 1); + + /* Current thread should be NUM 1 but the user does not know that. + If a program is single threaded gdb in general does not mention + anything about threads. That is why the test is >= 2. */ + if (thread_count () >= 2) + { + TRY + { + thread_command (NULL, from_tty); + } + CATCH (except, RETURN_MASK_ERROR) + { + exception_print (gdb_stderr, except); + } + END_CATCH + } } static void @@ -526,8 +541,13 @@ get_core_register_section (struct regcache *regcache, warning (_("Section `%s' in core file too small."), section_name); return; } + if (size != min_size && !(regset->flags & REGSET_VARIABLE_SIZE)) + { + warning (_("Unexpected size of section `%s' in core file."), + section_name); + } - contents = alloca (size); + contents = (char *) alloca (size); if (! bfd_get_section_contents (core_bfd, section, contents, (file_ptr) 0, size)) { @@ -536,20 +556,6 @@ get_core_register_section (struct regcache *regcache, return; } - if (regset == NULL - && core_gdbarch && gdbarch_regset_from_core_section_p (core_gdbarch)) - { - regset = gdbarch_regset_from_core_section (core_gdbarch, - name, size); - if (regset == NULL) - { - if (required) - warning (_("Couldn't recognize %s registers in core file."), - human_name); - return; - } - } - if (regset != NULL) { regset->supply_regset (regset, regcache, -1, contents, size); @@ -605,9 +611,7 @@ get_core_registers (struct target_ops *ops, int i; struct gdbarch *gdbarch; - if (!(core_gdbarch - && (gdbarch_iterate_over_regset_sections_p (core_gdbarch) - || gdbarch_regset_from_core_section_p (core_gdbarch))) + if (!(core_gdbarch && gdbarch_iterate_over_regset_sections_p (core_gdbarch)) && (core_vec == NULL || core_vec->core_read_registers == NULL)) { fprintf_filtered (gdb_stderr, @@ -652,7 +656,7 @@ struct spuid_list static void add_to_spuid_list (bfd *abfd, asection *asect, void *list_p) { - struct spuid_list *list = list_p; + struct spuid_list *list = (struct spuid_list *) list_p; enum bfd_endian byte_order = bfd_big_endian (abfd) ? BFD_ENDIAN_BIG : BFD_ENDIAN_LITTLE; int fd, pos = 0; @@ -973,7 +977,7 @@ core_pid_to_str (struct target_ops *ops, ptid_t ptid) /* Otherwise, this isn't a "threaded" core -- use the PID field, but only if it isn't a fake PID. */ - inf = find_inferior_pid (ptid_get_pid (ptid)); + inf = find_inferior_ptid (ptid); if (inf != NULL && !inf->fake_pid_p) return normal_pid_to_str (ptid); @@ -982,6 +986,15 @@ core_pid_to_str (struct target_ops *ops, ptid_t ptid) return buf; } +static const char * +core_thread_name (struct target_ops *self, struct thread_info *thr) +{ + if (core_gdbarch + && gdbarch_core_thread_name_p (core_gdbarch)) + return gdbarch_core_thread_name (core_gdbarch, thr); + return NULL; +} + static int core_has_memory (struct target_ops *ops) { @@ -1034,6 +1047,7 @@ init_core_ops (void) core_ops.to_thread_alive = core_thread_alive; core_ops.to_read_description = core_read_description; core_ops.to_pid_to_str = core_pid_to_str; + core_ops.to_thread_name = core_thread_name; core_ops.to_stratum = process_stratum; core_ops.to_has_memory = core_has_memory; core_ops.to_has_stack = core_has_stack;