* gcore.c (MAX_COPY_BYTES): Define.
(gcore_copy_callback): Use it to limit allocation.
This commit is contained in:
parent
92e059d8dc
commit
804e0f53e7
2 changed files with 37 additions and 9 deletions
|
@ -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>
|
2006-10-19 Ulrich Weigand <uweigand@de.ibm.com>
|
||||||
|
|
||||||
* linux-thread-db.c (check_for_thread_db): Don't attempt to use
|
* linux-thread-db.c (check_for_thread_db): Don't attempt to use
|
||||||
|
|
41
gdb/gcore.c
41
gdb/gcore.c
|
@ -1,6 +1,7 @@
|
||||||
/* Generate a core file for the inferior process.
|
/* 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.
|
This file is part of GDB.
|
||||||
|
|
||||||
|
@ -31,6 +32,11 @@
|
||||||
|
|
||||||
#include "gdb_assert.h"
|
#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 char *default_gcore_target (void);
|
||||||
static enum bfd_architecture default_gcore_arch (void);
|
static enum bfd_architecture default_gcore_arch (void);
|
||||||
static unsigned long default_gcore_mach (void);
|
static unsigned long default_gcore_mach (void);
|
||||||
|
@ -444,7 +450,8 @@ objfile_find_memory_regions (int (*func) (CORE_ADDR, unsigned long,
|
||||||
static void
|
static void
|
||||||
gcore_copy_callback (bfd *obfd, asection *osec, void *ignored)
|
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;
|
struct cleanup *old_chain = NULL;
|
||||||
void *memhunk;
|
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)
|
if (strncmp ("load", bfd_section_name (obfd, osec), 4) != 0)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
size = min (total_size, MAX_COPY_BYTES);
|
||||||
memhunk = xmalloc (size);
|
memhunk = xmalloc (size);
|
||||||
/* ??? This is crap since xmalloc should never return NULL. */
|
/* ??? This is crap since xmalloc should never return NULL. */
|
||||||
if (memhunk == NULL)
|
if (memhunk == NULL)
|
||||||
error (_("Not enough memory to create corefile."));
|
error (_("Not enough memory to create corefile."));
|
||||||
old_chain = make_cleanup (xfree, memhunk);
|
old_chain = make_cleanup (xfree, memhunk);
|
||||||
|
|
||||||
if (target_read_memory (bfd_section_vma (obfd, osec),
|
while (total_size > 0)
|
||||||
memhunk, size) != 0)
|
{
|
||||||
warning (_("Memory read failed for corefile section, %s bytes at 0x%s."),
|
if (size > total_size)
|
||||||
paddr_d (size), paddr (bfd_section_vma (obfd, osec)));
|
size = total_size;
|
||||||
if (!bfd_set_section_contents (obfd, osec, memhunk, 0, size))
|
|
||||||
warning (_("Failed to write corefile contents (%s)."),
|
if (target_read_memory (bfd_section_vma (obfd, osec) + offset,
|
||||||
bfd_errmsg (bfd_get_error ()));
|
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. */
|
do_cleanups (old_chain); /* Frees MEMHUNK. */
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue