* gcore.c (MAX_COPY_BYTES): Define.

(gcore_copy_callback): Use it to limit allocation.
This commit is contained in:
Daniel Jacobowitz 2006-10-20 22:06:28 +00:00
parent 92e059d8dc
commit 804e0f53e7
2 changed files with 37 additions and 9 deletions

View File

@ -1,3 +1,8 @@
2006-10-20 Daniel Jacobowitz <dan@codesourcery.com>
* gcore.c (MAX_COPY_BYTES): Define.
(gcore_copy_callback): Use it to limit allocation.
2006-10-19 Ulrich Weigand <uweigand@de.ibm.com>
* linux-thread-db.c (check_for_thread_db): Don't attempt to use

View File

@ -1,6 +1,7 @@
/* Generate a core file for the inferior process.
Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006
Free Software Foundation, Inc.
This file is part of GDB.
@ -31,6 +32,11 @@
#include "gdb_assert.h"
/* The largest amount of memory to read from the target at once. We
must throttle it to limit the amount of memory used by GDB during
generate-core-file for programs with large resident data. */
#define MAX_COPY_BYTES (1024 * 1024)
static char *default_gcore_target (void);
static enum bfd_architecture default_gcore_arch (void);
static unsigned long default_gcore_mach (void);
@ -444,7 +450,8 @@ objfile_find_memory_regions (int (*func) (CORE_ADDR, unsigned long,
static void
gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
{
bfd_size_type size = bfd_section_size (obfd, osec);
bfd_size_type size, total_size = bfd_section_size (obfd, osec);
file_ptr offset = 0;
struct cleanup *old_chain = NULL;
void *memhunk;
@ -456,19 +463,35 @@ gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
if (strncmp ("load", bfd_section_name (obfd, osec), 4) != 0)
return;
size = min (total_size, MAX_COPY_BYTES);
memhunk = xmalloc (size);
/* ??? This is crap since xmalloc should never return NULL. */
if (memhunk == NULL)
error (_("Not enough memory to create corefile."));
old_chain = make_cleanup (xfree, memhunk);
if (target_read_memory (bfd_section_vma (obfd, osec),
memhunk, size) != 0)
warning (_("Memory read failed for corefile section, %s bytes at 0x%s."),
paddr_d (size), paddr (bfd_section_vma (obfd, osec)));
if (!bfd_set_section_contents (obfd, osec, memhunk, 0, size))
warning (_("Failed to write corefile contents (%s)."),
bfd_errmsg (bfd_get_error ()));
while (total_size > 0)
{
if (size > total_size)
size = total_size;
if (target_read_memory (bfd_section_vma (obfd, osec) + offset,
memhunk, size) != 0)
{
warning (_("Memory read failed for corefile section, %s bytes at 0x%s."),
paddr_d (size), paddr (bfd_section_vma (obfd, osec)));
break;
}
if (!bfd_set_section_contents (obfd, osec, memhunk, offset, size))
{
warning (_("Failed to write corefile contents (%s)."),
bfd_errmsg (bfd_get_error ()));
break;
}
total_size -= size;
offset += size;
}
do_cleanups (old_chain); /* Frees MEMHUNK. */
}