/* Generate a core file for the inferior process.
- Copyright (C) 2001-2013 Free Software Foundation, Inc.
+ Copyright (C) 2001-2015 Free Software Foundation, Inc.
This file is part of GDB.
#include "completer.h"
#include "gcore.h"
#include "cli/cli-decode.h"
-#include "gdb_assert.h"
#include <fcntl.h>
#include "regcache.h"
#include "regset.h"
bfd *
create_gcore_bfd (const char *filename)
{
- char *fullname;
- bfd *obfd;
-
- fullname = tilde_expand (filename);
- obfd = gdb_bfd_openw (fullname, default_gcore_target ());
- xfree (fullname);
+ bfd *obfd = gdb_bfd_openw (filename, default_gcore_target ());
if (!obfd)
error (_("Failed to open '%s' for output."), filename);
return obfd;
}
-/* write_gcore_file -- helper for gcore_command (exported).
- Compose and write the corefile data to the core file. */
-
+/* write_gcore_file_1 -- do the actual work of write_gcore_file. */
-void
-write_gcore_file (bfd *obfd)
+static void
+write_gcore_file_1 (bfd *obfd)
{
+ struct cleanup *cleanup;
void *note_data = NULL;
int note_size = 0;
asection *note_sec = NULL;
else
note_data = gdbarch_make_corefile_notes (target_gdbarch (), obfd, ¬e_size);
+ cleanup = make_cleanup (xfree, note_data);
+
if (note_data == NULL || note_size == 0)
error (_("Target does not support core file generation."));
/* Write out the contents of the note section. */
if (!bfd_set_section_contents (obfd, note_sec, note_data, 0, note_size))
warning (_("writing note section (%s)"), bfd_errmsg (bfd_get_error ()));
+
+ do_cleanups (cleanup);
+}
+
+/* write_gcore_file -- helper for gcore_command (exported).
+ Compose and write the corefile data to the core file. */
+
+void
+write_gcore_file (bfd *obfd)
+{
+ struct gdb_exception except = exception_none;
+
+ target_prepare_to_generate_core ();
+
+ TRY
+ {
+ write_gcore_file_1 (obfd);
+ }
+ CATCH (e, RETURN_MASK_ALL)
+ {
+ except = e;
+ }
+ END_CATCH
+
+ target_done_generating_core ();
+
+ if (except.reason < 0)
+ throw_exception (except);
}
static void
static void
gcore_command (char *args, int from_tty)
{
- struct cleanup *old_chain;
- char *corefilename, corefilename_buffer[40];
+ struct cleanup *filename_chain;
+ struct cleanup *bfd_chain;
+ char *corefilename;
bfd *obfd;
/* No use generating a corefile without a target process. */
noprocess ();
if (args && *args)
- corefilename = args;
+ corefilename = tilde_expand (args);
else
{
/* Default corefile name is "core.PID". */
- xsnprintf (corefilename_buffer, sizeof (corefilename_buffer),
- "core.%d", PIDGET (inferior_ptid));
- corefilename = corefilename_buffer;
+ corefilename = xstrprintf ("core.%d", ptid_get_pid (inferior_ptid));
}
+ filename_chain = make_cleanup (xfree, corefilename);
if (info_verbose)
fprintf_filtered (gdb_stdout,
obfd = create_gcore_bfd (corefilename);
/* Need a cleanup that will close and delete the file. */
- old_chain = make_cleanup (do_bfd_delete_cleanup, obfd);
+ bfd_chain = make_cleanup (do_bfd_delete_cleanup, obfd);
/* Call worker function. */
write_gcore_file (obfd);
/* Succeeded. */
- fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename);
-
- discard_cleanups (old_chain);
+ discard_cleanups (bfd_chain);
gdb_bfd_unref (obfd);
+
+ fprintf_filtered (gdb_stdout, "Saved corefile %s\n", corefilename);
+ do_cleanups (filename_chain);
}
static unsigned long
struct value *sbrk_fn, *ret;
bfd_vma tmp;
- if (lookup_minimal_symbol ("sbrk", NULL, NULL) != NULL)
+ if (lookup_minimal_symbol ("sbrk", NULL, NULL).minsym != NULL)
{
sbrk_fn = find_function_in_inferior ("sbrk", &sbrk_objf);
if (sbrk_fn == NULL)
return (bfd_vma) 0;
}
- else if (lookup_minimal_symbol ("_sbrk", NULL, NULL) != NULL)
+ else if (lookup_minimal_symbol ("_sbrk", NULL, NULL).minsym != NULL)
{
sbrk_fn = find_function_in_inferior ("_sbrk", &sbrk_objf);
if (sbrk_fn == NULL)
int p_type = 0;
/* FIXME: these constants may only be applicable for ELF. */
- if (strncmp (bfd_section_name (obfd, osec), "load", 4) == 0)
+ if (startswith (bfd_section_name (obfd, osec), "load"))
p_type = PT_LOAD;
- else if (strncmp (bfd_section_name (obfd, osec), "note", 4) == 0)
+ else if (startswith (bfd_section_name (obfd, osec), "note"))
p_type = PT_NOTE;
else
p_type = PT_NULL;
return 0;
}
-static int
-objfile_find_memory_regions (find_memory_region_ftype func, void *obfd)
+int
+objfile_find_memory_regions (struct target_ops *self,
+ find_memory_region_ftype func, void *obfd)
{
/* Use objfile data to create memory sections. */
struct objfile *objfile;
return;
/* Only interested in "load" sections. */
- if (strncmp ("load", bfd_section_name (obfd, osec), 4) != 0)
+ if (!startswith (bfd_section_name (obfd, osec), "load"))
return;
size = min (total_size, MAX_COPY_BYTES);
Argument is optional filename. Default filename is 'core.<process_id>'."));
add_com_alias ("gcore", "generate-core-file", class_files, 1);
- exec_set_find_memory_regions (objfile_find_memory_regions);
}