* gcore.c (MAX_COPY_BYTES): Define.
authorDaniel Jacobowitz <drow@false.org>
Fri, 20 Oct 2006 22:06:28 +0000 (22:06 +0000)
committerDaniel Jacobowitz <drow@false.org>
Fri, 20 Oct 2006 22:06:28 +0000 (22:06 +0000)
(gcore_copy_callback): Use it to limit allocation.

gdb/ChangeLog
gdb/gcore.c

index 51e0ba99f8f2fcda30e8782ac17f41f3ecd97b37..2a1e6fea8d432c72c10a421e98d6724a45c0831e 100644 (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
index 6d9ae0664109d68fd72b9faaeba173931c304e61..2d22ef963616e49941ab010d27cd30dbab69649a 100644 (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.
 
 
 #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.  */
 }