1 /* Core dump and executable file functions below target vector, for GDB.
2 Copyright 1986, 87, 89, 91, 92, 93, 94, 95, 96, 97, 1998
3 Free Software Foundation, Inc.
5 This file is part of GDB.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330,
20 Boston, MA 02111-1307, USA. */
23 #include "gdb_string.h"
28 #include "frame.h" /* required by inferior.h */
35 #include "gdbthread.h"
37 /* List of all available core_fns. On gdb startup, each core file register
38 reader calls add_core_fns() to register information on each core format it
39 is prepared to read. */
41 static struct core_fns *core_file_fns = NULL;
43 static void core_files_info PARAMS ((struct target_ops *));
46 static int solib_add_stub PARAMS ((PTR));
49 static void core_open PARAMS ((char *, int));
51 static void core_detach PARAMS ((char *, int));
53 static void core_close PARAMS ((int));
55 static void get_core_registers PARAMS ((int));
57 static void add_to_thread_list PARAMS ((bfd *, asection *, PTR));
59 static int ignore PARAMS ((CORE_ADDR, char *));
61 static char *core_file_to_sym_file PARAMS ((char *));
63 static int core_file_thread_alive PARAMS ((int tid));
65 static void init_core_ops PARAMS ((void));
67 void _initialize_corelow PARAMS ((void));
69 struct target_ops core_ops;
71 /* Link a new core_fns into the global core_file_fns list. Called on gdb
72 startup by the _initialize routine in each core file register reader, to
73 register information about each format the the reader is prepared to
80 cf->next = core_file_fns;
85 /* Discard all vestiges of any previous core file and mark data and stack
97 inferior_pid = 0; /* Avoid confusion from thread stuff */
99 /* Clear out solib state while the bfd is still open. See
100 comments in clear_solib in solib.c. */
105 name = bfd_get_filename (core_bfd);
106 if (!bfd_close (core_bfd))
107 warning ("cannot close \"%s\": %s",
108 name, bfd_errmsg (bfd_get_error ()));
111 if (core_ops.to_sections)
113 free ((PTR) core_ops.to_sections);
114 core_ops.to_sections = NULL;
115 core_ops.to_sections_end = NULL;
121 /* Stub function for catch_errors around shared library hacking. FROM_TTYP
122 is really an int * which points to from_tty. */
125 solib_add_stub (from_ttyp)
128 SOLIB_ADD (NULL, *(int *) from_ttyp, ¤t_target);
129 re_enable_breakpoints_in_shlibs ();
132 #endif /* SOLIB_ADD */
134 /* Look for sections whose names start with `.reg/' so that we can extract the
135 list of threads in a core file. */
138 add_to_thread_list (abfd, asect, reg_sect_arg)
144 asection *reg_sect = (asection *) reg_sect_arg;
146 if (strncmp (bfd_section_name (abfd, asect), ".reg/", 5) != 0)
149 thread_id = atoi (bfd_section_name (abfd, asect) + 5);
151 add_thread (thread_id);
153 /* Warning, Will Robinson, looking at BFD private data! */
156 && asect->filepos == reg_sect->filepos) /* Did we find .reg? */
157 inferior_pid = thread_id; /* Yes, make it current */
160 /* This routine opens and sets up the core file bfd. */
163 core_open (filename, from_tty)
169 struct cleanup *old_chain;
175 target_preopen (from_tty);
179 "No core file specified. (Use `detach' to stop debugging a core file.)"
180 : "No core file specified.");
183 filename = tilde_expand (filename);
184 if (filename[0] != '/')
186 temp = concat (current_directory, "/", filename, NULL);
191 old_chain = make_cleanup (free, filename);
193 scratch_chan = open (filename, write_files ? O_RDWR : O_RDONLY, 0);
194 if (scratch_chan < 0)
195 perror_with_name (filename);
197 temp_bfd = bfd_fdopenr (filename, gnutarget, scratch_chan);
198 if (temp_bfd == NULL)
199 perror_with_name (filename);
201 if (!bfd_check_format (temp_bfd, bfd_core))
203 /* Do it after the err msg */
204 /* FIXME: should be checking for errors from bfd_close (for one thing,
205 on error it does not free all the storage associated with the
207 make_cleanup ((make_cleanup_func) bfd_close, temp_bfd);
208 error ("\"%s\" is not a core dump: %s",
209 filename, bfd_errmsg (bfd_get_error ()));
212 /* Looks semi-reasonable. Toss the old core file and work on the new. */
214 discard_cleanups (old_chain); /* Don't free filename any more */
215 unpush_target (&core_ops);
217 old_chain = make_cleanup ((make_cleanup_func) core_close, core_bfd);
221 /* Find the data section */
222 if (build_section_table (core_bfd, &core_ops.to_sections,
223 &core_ops.to_sections_end))
224 error ("\"%s\": Can't find sections: %s",
225 bfd_get_filename (core_bfd), bfd_errmsg (bfd_get_error ()));
227 ontop = !push_target (&core_ops);
228 discard_cleanups (old_chain);
230 p = bfd_core_file_failing_command (core_bfd);
232 printf_filtered ("Core was generated by `%s'.\n", p);
234 siggy = bfd_core_file_failing_signal (core_bfd);
236 printf_filtered ("Program terminated with signal %d, %s.\n", siggy,
237 safe_strsignal (siggy));
239 /* Build up thread list from BFD sections. */
242 bfd_map_over_sections (core_bfd, add_to_thread_list,
243 bfd_get_section_by_name (core_bfd, ".reg"));
247 /* Fetch all registers from core file. */
248 target_fetch_registers (-1);
250 /* Add symbols and section mappings for any shared libraries. */
252 catch_errors (solib_add_stub, &from_tty, (char *) 0,
256 /* Now, set up the frame cache, and print the top of stack. */
257 flush_cached_frames ();
258 select_frame (get_current_frame (), 0);
259 print_stack_frame (selected_frame, selected_frame_level, 1);
264 "you won't be able to access this core file until you terminate\n\
265 your %s; do ``info files''", target_longname);
270 core_detach (args, from_tty)
275 error ("Too many arguments");
276 unpush_target (&core_ops);
277 reinit_frame_cache ();
279 printf_filtered ("No core file now.\n");
282 /* Get the registers out of a core file. This is the machine-
283 independent part. Fetch_core_registers is the machine-dependent
284 part, typically implemented in the xm-file for each architecture. */
286 /* We just get all the registers, so we don't use regno. */
290 get_core_registers (regno)
297 enum bfd_flavour our_flavour = bfd_get_flavour (core_bfd);
298 struct core_fns *cf = NULL;
300 if (core_file_fns == NULL)
302 fprintf_filtered (gdb_stderr,
303 "Can't fetch registers from this type of core file\n");
307 /* Thread support. If inferior_pid is non-zero, then we have found a core
308 file with threads (or multiple processes). In that case, we need to
309 use the appropriate register section, else we just use `.reg'. */
311 /* XXX - same thing needs to be done for floating-point (.reg2) sections. */
314 sprintf (secname, ".reg/%d", inferior_pid);
316 strcpy (secname, ".reg");
318 reg_sec = bfd_get_section_by_name (core_bfd, secname);
321 size = bfd_section_size (core_bfd, reg_sec);
322 the_regs = alloca (size);
323 /* Look for the core functions that match this flavor. Default to the
324 first one if nothing matches. */
325 for (cf = core_file_fns; cf != NULL; cf = cf->next)
327 if (our_flavour == cf->core_flavour)
337 bfd_get_section_contents (core_bfd, reg_sec, the_regs, (file_ptr) 0, size) &&
338 cf->core_read_registers != NULL)
340 (cf->core_read_registers (the_regs, size, 0,
341 (unsigned) bfd_section_vma (abfd, reg_sec)));
346 fprintf_filtered (gdb_stderr,
347 "Couldn't fetch registers from core file: %s\n",
348 bfd_errmsg (bfd_get_error ()));
351 /* Now do it again for the float registers, if they exist. */
352 reg_sec = bfd_get_section_by_name (core_bfd, ".reg2");
355 size = bfd_section_size (core_bfd, reg_sec);
356 the_regs = alloca (size);
358 bfd_get_section_contents (core_bfd, reg_sec, the_regs, (file_ptr) 0, size) &&
359 cf->core_read_registers != NULL)
361 (cf->core_read_registers (the_regs, size, 2,
362 (unsigned) bfd_section_vma (abfd, reg_sec)));
366 fprintf_filtered (gdb_stderr,
367 "Couldn't fetch register set 2 from core file: %s\n",
368 bfd_errmsg (bfd_get_error ()));
371 registers_fetched ();
375 core_file_to_sym_file (core)
378 CONST char *failing_command;
385 error ("No core file specified.");
387 core = tilde_expand (core);
390 temp = concat (current_directory, "/", core, NULL);
394 scratch_chan = open (core, write_files ? O_RDWR : O_RDONLY, 0);
395 if (scratch_chan < 0)
396 perror_with_name (core);
398 temp_bfd = bfd_fdopenr (core, gnutarget, scratch_chan);
399 if (temp_bfd == NULL)
400 perror_with_name (core);
402 if (!bfd_check_format (temp_bfd, bfd_core))
404 /* Do it after the err msg */
405 /* FIXME: should be checking for errors from bfd_close (for one thing,
406 on error it does not free all the storage associated with the
408 make_cleanup ((make_cleanup_func) bfd_close, temp_bfd);
409 error ("\"%s\" is not a core dump: %s",
410 core, bfd_errmsg (bfd_get_error ()));
413 /* Find the data section */
414 if (build_section_table (temp_bfd, &core_ops.to_sections,
415 &core_ops.to_sections_end))
416 error ("\"%s\": Can't find sections: %s",
417 bfd_get_filename (temp_bfd), bfd_errmsg (bfd_get_error ()));
419 failing_command = bfd_core_file_failing_command (temp_bfd);
421 bfd_close (temp_bfd);
423 /* If we found a filename, remember that it is probably saved
424 relative to the executable that created it. If working directory
425 isn't there now, we may not be able to find the executable. Rather
426 than trying to be sauve about finding it, just check if the file
427 exists where we are now. If not, then punt and tell our client
428 we couldn't find the sym file.
430 p = (char *) failing_command;
431 if ((p != NULL) && (access (p, F_OK) != 0))
439 struct target_ops *t;
441 print_section_info (t, core_bfd);
444 /* If mourn is being called in all the right places, this could be say
445 `gdb internal error' (since generic_mourn calls breakpoint_init_inferior). */
448 ignore (addr, contents)
456 /* Okay, let's be honest: threads gleaned from a core file aren't
457 exactly lively, are they? On the other hand, if we don't claim
458 that each & every one is alive, then we don't get any of them
459 to appear in an "info thread" command, which is quite a useful
463 core_file_thread_alive (tid)
469 /* Fill in core_ops with its defined operations and properties. */
474 core_ops.to_shortname = "core";
475 core_ops.to_longname = "Local core dump file";
477 "Use a core file as a target. Specify the filename of the core file.";
478 core_ops.to_open = core_open;
479 core_ops.to_close = core_close;
480 core_ops.to_attach = find_default_attach;
481 core_ops.to_require_attach = find_default_require_attach;
482 core_ops.to_detach = core_detach;
483 core_ops.to_require_detach = find_default_require_detach;
484 core_ops.to_fetch_registers = get_core_registers;
485 core_ops.to_xfer_memory = xfer_memory;
486 core_ops.to_files_info = core_files_info;
487 core_ops.to_insert_breakpoint = ignore;
488 core_ops.to_remove_breakpoint = ignore;
489 core_ops.to_create_inferior = find_default_create_inferior;
490 core_ops.to_clone_and_follow_inferior = find_default_clone_and_follow_inferior;
491 core_ops.to_thread_alive = core_file_thread_alive;
492 core_ops.to_core_file_to_sym_file = core_file_to_sym_file;
493 core_ops.to_stratum = core_stratum;
494 core_ops.to_has_memory = 1;
495 core_ops.to_has_stack = 1;
496 core_ops.to_has_registers = 1;
497 core_ops.to_magic = OPS_MAGIC;
500 /* non-zero if we should not do the add_target call in
501 _initialize_corelow; not initialized (i.e., bss) so that
502 the target can initialize it (i.e., data) if appropriate.
503 This needs to be set at compile time because we don't know
504 for sure whether the target's initialize routine is called
505 before us or after us. */
506 int coreops_suppress_target;
509 _initialize_corelow ()
513 if (!coreops_suppress_target)
514 add_target (&core_ops);