From d113e6b28e88d16de8cb23f5f6f73e6cb8981042 Mon Sep 17 00:00:00 2001 From: Stu Grossman Date: Sat, 25 Sep 1993 00:40:20 +0000 Subject: [PATCH] * corelow.c: Add multi thread/process support for core files with .reg/XXX pseudo-sections. * i386lynx-nat.c thread.h thread.c: Remove unnecessary core file support. --- gdb/ChangeLog | 9 ++ gdb/corelow.c | 46 ++++++++- gdb/i386lynx-nat.c | 244 --------------------------------------------- gdb/thread.c | 13 --- gdb/thread.h | 8 -- 5 files changed, 54 insertions(+), 266 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 05c31feaed6..3f5f4f234a3 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,14 @@ +Fri Sep 24 17:25:41 1993 Stu Grossman (grossman at cygnus.com) + + * corelow.c: Add multi thread/process support for core files with + .reg/XXX pseudo-sections. + * i386lynx-nat.c thread.h thread.c: Remove unnecessary core file + support. + Thu Sep 23 10:49:37 1993 Jim Kingdon (kingdon@lioth.cygnus.com) + * remote-udi.c (download): Skip zero length sections. + * valops.c (search_struct_method, value_struct_elt): Use (value)-1, not -1, for error. diff --git a/gdb/corelow.c b/gdb/corelow.c index dfafe4966c7..749acce6e18 100644 --- a/gdb/corelow.c +++ b/gdb/corelow.c @@ -51,6 +51,8 @@ static void core_close (quitting) int quitting; { + inferior_pid = 0; /* Avoid confusion from thread stuff */ + if (core_bfd) { free (bfd_get_filename (core_bfd)); bfd_close (core_bfd); @@ -78,6 +80,30 @@ solib_add_stub (from_tty) } #endif /* SOLIB_ADD */ +/* Look for sections whose names start with `.reg/' so that we can extract the + list of threads in a core file. */ + +static void +add_to_thread_list (abfd, asect, reg_sect) + bfd *abfd; + asection *asect; + asection *reg_sect; +{ + int thread_id; + + if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0) + return; + + thread_id = atoi (bfd_section_name (abfd, asect) + 5); + + add_thread (thread_id); + +/* Warning, Will Robinson, looking at BFD private data! */ + + if (asect->filepos == reg_sect->filepos) /* Did we find .reg? */ + inferior_pid = thread_id; /* Yes, make it current */ +} + /* This routine opens and sets up the core file bfd */ void @@ -154,6 +180,12 @@ core_open (filename, from_tty) printf_filtered ("Program terminated with signal %d, %s.\n", siggy, safe_strsignal (siggy)); + /* Build up thread list from BFD sections. */ + + init_thread_list (); + bfd_map_over_sections (core_bfd, add_to_thread_list, + bfd_get_section_by_name (core_bfd, ".reg")); + if (ontop) { /* Fetch all registers from core file */ target_fetch_registers (-1); @@ -201,8 +233,20 @@ get_core_registers (regno) sec_ptr reg_sec; unsigned size; char *the_regs; + char secname[10]; + + /* Thread support. If inferior_pid is non-zero, then we have found a core + file with threads (or multiple processes). In that case, we need to + use the appropriate register section, else we just use `.reg'. */ + + /* XXX - same thing needs to be done for floating-point (.reg2) sections. */ + + if (inferior_pid) + sprintf (secname, ".reg/%d", inferior_pid); + else + strcpy (secname, ".reg"); - reg_sec = bfd_get_section_by_name (core_bfd, ".reg"); + reg_sec = bfd_get_section_by_name (core_bfd, secname); if (!reg_sec) goto cant; size = bfd_section_size (core_bfd, reg_sec); the_regs = alloca (size); diff --git a/gdb/i386lynx-nat.c b/gdb/i386lynx-nat.c index 63300f149ec..5d3fb211a6f 100644 --- a/gdb/i386lynx-nat.c +++ b/gdb/i386lynx-nat.c @@ -21,7 +21,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include "defs.h" #include "frame.h" #include "inferior.h" -#include "gdbcore.h" #include "target.h" #include @@ -50,8 +49,6 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #define FS 0 #define GS 0 -static struct target_ops lynx_core_ops; - /* this table must line up with REGISTER_NAMES in m-i386.h */ static unsigned int regmap[] = { @@ -284,244 +281,3 @@ fetch_core_registers (core_reg_sect, core_reg_size, which, reg_addr) supply_register (regno, core_reg_sect + addr); } } - -#if 0 - -/* Discard all vestiges of any previous core file - and mark data and stack spaces as empty. */ - -/* ARGSUSED */ -static void -lynx_core_close (quitting) - int quitting; -{ - if (core_bfd) - { - free (bfd_get_filename (core_bfd)); - bfd_close (core_bfd); - core_bfd = NULL; - - if (core_ops.to_sections) - { - free ((PTR)lynx_core_ops.to_sections); - lynx_core_ops.to_sections = NULL; - lynx_core_ops.to_sections_end = NULL; - } - } -} - -/* This routine opens and sets up the core file bfd */ - -static void -lynx_core_open (filename, from_tty) - char *filename; - int from_tty; -{ - const char *p; - int siggy; - struct cleanup *old_chain; - char *temp; - bfd *temp_bfd; - int ontop; - int scratch_chan; - - target_preopen (from_tty); - if (!filename) - { - error (core_bfd ? - "No core file specified. (Use `detach' to stop debugging a core file.)" - : "No core file specified."); - } - - filename = tilde_expand (filename); - if (filename[0] != '/') - { - temp = concat (current_directory, "/", filename, NULL); - free (filename); - filename = temp; - } - - old_chain = make_cleanup (free, filename); - - scratch_chan = open (filename, write_files? O_RDWR: O_RDONLY, 0); - if (scratch_chan < 0) - perror_with_name (filename); - - temp_bfd = bfd_fdopenr (filename, NULL, scratch_chan); - if (temp_bfd == NULL) - perror_with_name (filename); - - if (!bfd_check_format (temp_bfd, bfd_core)) - { - /* Do it after the err msg */ - make_cleanup (bfd_close, temp_bfd); - error ("\"%s\" is not a core dump: %s", filename, bfd_errmsg(bfd_error)); - } - - /* Looks semi-reasonable. Toss the old core file and work on the new. */ - - discard_cleanups (old_chain); /* Don't free filename any more */ - unpush_target (&core_ops); - core_bfd = temp_bfd; - old_chain = make_cleanup (core_close, core_bfd); - - validate_files (); - - /* Find the data section */ - if (build_section_table (core_bfd, &core_ops.to_sections, - &core_ops.to_sections_end)) - error ("Can't find sections in `%s': %s", bfd_get_filename(core_bfd), - bfd_errmsg (bfd_error)); - - ontop = !push_target (&core_ops); - discard_cleanups (old_chain); - - p = bfd_core_file_failing_command (core_bfd); - if (p) - printf_filtered ("Core was generated by `%s'.\n", p); - - siggy = bfd_core_file_failing_signal (core_bfd); - if (siggy > 0) - printf_filtered ("Program terminated with signal %d, %s.\n", siggy, - safe_strsignal (siggy)); - - /* Locate all of the thread register sections. They have names like .regxx, - where xx is the thread-id. */ - - bfd_map_over_sections (core_bfd, grok_register_sections, - - if (ontop) - { - /* Fetch all registers from core file */ - target_fetch_registers (-1); - - /* Now, set up the frame cache, and print the top of stack */ - set_current_frame (create_new_frame (read_fp (), - read_pc ())); - select_frame (get_current_frame (), 0); - print_stack_frame (selected_frame, selected_frame_level, 1); - } - else - { - warning ( - "you won't be able to access this core file until you terminate\n\ -your %s; do ``info files''", current_target->to_longname); - } -} - -static void -lynx_core_detach (args, from_tty) - char *args; - int from_tty; -{ - if (args) - error ("Too many arguments"); - unpush_target (&core_ops); - if (from_tty) - printf_filtered ("No core file now.\n"); -} - -/* Get the registers out of a core file. This is the machine- - independent part. Fetch_core_registers is the machine-dependent - part, typically implemented in the xm-file for each architecture. */ - -/* We just get all the registers, so we don't use regno. */ -/* ARGSUSED */ -static void -get_core_registers (regno) - int regno; -{ - sec_ptr reg_sec; - unsigned size; - char *the_regs; - char regsecname[20]; - - sprintf (regsecname, ".reg%d", TIDGET (inferior_pid)); - - reg_sec = bfd_get_section_by_name (core_bfd, regsecname); - if (!reg_sec) - goto cant; - size = bfd_section_size (core_bfd, reg_sec); - the_regs = alloca (size); - if (bfd_get_section_contents (core_bfd, reg_sec, the_regs, (file_ptr)0, - size)) - { - fetch_core_registers (the_regs, size, 0, - (unsigned) bfd_section_vma (abfd,reg_sec)); - } - else - { -cant: - fprintf_filtered (stderr, "Couldn't fetch registers from core file: %s\n", - bfd_errmsg (bfd_error)); - } - - registers_fetched(); -} - -static void -core_files_info (t) - struct target_ops *t; -{ - print_section_info (t, core_bfd); -} - -/* If mourn is being called in all the right places, this could be say - `gdb internal error' (since generic_mourn calls mark_breakpoints_out). */ - -static int -ignore (addr, contents) - CORE_ADDR addr; - char *contents; -{ -} - -static struct target_ops -lynx_core_ops = -{ - "core", - "Local core dump file", - "Use a core file as a target. Specify the filename of the core file.", - lynx_core_open, - lynx_core_close, - find_default_attach, - lynx_core_detach, - 0, - 0, - get_core_registers, - 0, - 0, - xfer_memory, - lynx_core_files_info, - ignore, - ignore, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - 0, - find_default_create_inferior, - 0, /* mourn_inferior */ - 0, /* can_run */ - 0, /* notice_signals */ - core_stratum, - 0, /* next */ - 0, - 1, - 1, - 1, - 0, - 0, - 0, - OPS_MAGIC, /* Always the last thing */ -}; - -void -_initialize_i386lynx_nat() -{ - add_target (&lynx_core_ops); -} -#endif diff --git a/gdb/thread.c b/gdb/thread.c index 0e809753902..fdc13bc9113 100644 --- a/gdb/thread.c +++ b/gdb/thread.c @@ -109,19 +109,6 @@ in_thread_list (pid) return 0; /* Never heard of 'im */ } -#if 0 -void -bfd_get_core_threads (abfd) - bfd *abfd; -{ - int i; - - inferior_pid = BUILDPID (inferior_pid, core_thread (abfd)->pid); - for (i = 0; i < core_pss (abfd).threadcnt; i++) - add_thread (core_thread (abfd)[i].pid); -} -#endif - static void prune_threads () { diff --git a/gdb/thread.h b/gdb/thread.h index 6f450b4ab89..36b003557b5 100644 --- a/gdb/thread.h +++ b/gdb/thread.h @@ -29,12 +29,4 @@ extern void add_thread PARAMS ((int)); extern int in_thread_list PARAMS ((int)); -#if 0 -#ifdef __STDC__ -struct _bfd; -#endif - -extern void bfd_get_core_threads PARAMS ((struct _bfd *)); -#endif - #endif /* THREAD_H */ -- 2.30.2