doc/ChangeLog:
[deliverable/binutils-gdb.git] / gdb / gcore.c
index b5513728ef5108ff0d0f410424129e31ebc55b4c..00b8ebaaa581ddf47859979222c1ee92b94b4c81 100644 (file)
@@ -1,6 +1,7 @@
 /* Generate a core file for the inferior process.
 
-   Copyright 2001, 2002, 2003, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2001, 2002, 2003, 2004, 2005, 2006, 2007
+   Free Software Foundation, Inc.
 
    This file is part of GDB.
 
@@ -16,8 +17,8 @@
 
    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   Foundation, Inc., 51 Franklin Street, Fifth Floor,
+   Boston, MA 02110-1301, USA.  */
 
 #include "defs.h"
 #include "elf-bfd.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 enum bfd_architecture default_gcore_arch (void);
 static unsigned long default_gcore_mach (void);
@@ -68,7 +74,7 @@ gcore_command (char *args, int from_tty)
   /* Open the output file.  */
   obfd = bfd_openw (corefilename, default_gcore_target ());
   if (!obfd)
-    error ("Failed to open '%s' for output.", corefilename);
+    error (_("Failed to open '%s' for output."), corefilename);
 
   /* Need a cleanup that will close the file (FIXME: delete it?).  */
   old_chain = make_cleanup_bfd_close (obfd);
@@ -84,7 +90,7 @@ gcore_command (char *args, int from_tty)
     {
       note_sec = bfd_make_section_anyway (obfd, "note0");
       if (note_sec == NULL)
-       error ("Failed to create 'note' section for corefile: %s",
+       error (_("Failed to create 'note' section for corefile: %s"),
               bfd_errmsg (bfd_get_error ()));
 
       bfd_set_section_vma (obfd, note_sec, 0);
@@ -96,13 +102,13 @@ gcore_command (char *args, int from_tty)
 
   /* Now create the memory/load sections.  */
   if (gcore_memory_sections (obfd) == 0)
-    error ("gcore: failed to get corefile memory sections from target.");
+    error (_("gcore: failed to get corefile memory sections from target."));
 
   /* Write out the contents of the note section.  */
   if (note_data != NULL && note_size != 0)
     {
       if (!bfd_set_section_contents (obfd, note_sec, note_data, 0, note_size))
-       warning ("writing note section (%s)", bfd_errmsg (bfd_get_error ()));
+       warning (_("writing note section (%s)"), bfd_errmsg (bfd_get_error ()));
     }
 
   /* Succeeded.  */
@@ -126,7 +132,7 @@ default_gcore_mach (void)
     return bfdarch->mach;
 #endif /* TARGET_ARCHITECTURE */
   if (exec_bfd == NULL)
-    error ("Can't find default bfd machine type (need execfile).");
+    error (_("Can't find default bfd machine type (need execfile)."));
 
   return bfd_get_mach (exec_bfd);
 #endif /* 1 */
@@ -142,7 +148,7 @@ default_gcore_arch (void)
     return bfdarch->arch;
 #endif
   if (exec_bfd == NULL)
-    error ("Can't find bfd architecture for corefile (need execfile).");
+    error (_("Can't find bfd architecture for corefile (need execfile)."));
 
   return bfd_get_arch (exec_bfd);
 }
@@ -244,7 +250,7 @@ derive_heap_segment (bfd *abfd, bfd_vma *bottom, bfd_vma *top)
          || strcmp (".bss", bfd_section_name (abfd, sec)) == 0)
        {
          sec_vaddr = bfd_get_section_vma (abfd, sec);
-         sec_size = bfd_get_section_size_before_reloc (sec);
+         sec_size = bfd_get_section_size (sec);
          if (sec_vaddr + sec_size > top_of_data_memory)
            top_of_data_memory = sec_vaddr + sec_size;
        }
@@ -371,7 +377,7 @@ gcore_create_callback (CORE_ADDR vaddr, unsigned long size,
   osec = bfd_make_section_anyway (obfd, "load");
   if (osec == NULL)
     {
-      warning ("Couldn't make gcore segment: %s",
+      warning (_("Couldn't make gcore segment: %s"),
               bfd_errmsg (bfd_get_error ()));
       return 1;
     }
@@ -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.");
+    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\n",
-            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.  */
 }
@@ -491,10 +514,9 @@ gcore_memory_sections (bfd *obfd)
 void
 _initialize_gcore (void)
 {
-  add_com ("generate-core-file", class_files, gcore_command,
-          "\
+  add_com ("generate-core-file", class_files, gcore_command, _("\
 Save a core file with the current state of the debugged process.\n\
-Argument is optional filename.  Default filename is 'core.<process_id>'.");
+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);
This page took 0.026203 seconds and 4 git commands to generate.