Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* RFA: Fix a big memory leak reading minimal symbols
@ 2003-01-26 19:13 Daniel Jacobowitz
  2003-02-05 19:31 ` Elena Zannoni
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2003-01-26 19:13 UTC (permalink / raw)
  To: gdb-patches

This patch is good for a whopping 13% (7MB) of memory usage when reading in
all of mozilla's minimal symbols (stabs).  The control flow looks like this
right now:
  - init_minimal_symbol_collection in elf_symfile_read
  - install_minimal_symbols in elfstab_build_psymtabs.  Presumably added so
    that we don't lose the minimal symbols above.
  - dbx_symfile_read contains a complete init_minimal_symbol_collection /
    install_minimal_symbols pair, which generally finds no minimal symbols
    in ELF.
  - install_minimal_symbols and matching cleanup in elf_symfile_read.

Only problem is, that second init_minimal_symbol_collection call zeroed out
the bunch pointer.  We've installed them but we never free them, so they
just sit around wasting memory.

This patch arranges for all calls to init_minimal_symbol_collection in ELF
targets to be paired with matching cleanups and install_minimal_symbols
calls.  This means that elfmdebug_build_psymtabs gets its own pair instead
of relying on elf_symfile_read, and that elf_symfile_read installs its own
minimal symbols much earlier.

I'd like a symtab maintainer to look over this patch; the more eyes the
better.  I'm probably also short some copyright dates; I'll get them when/if
I check it in.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer

2002-01-26  Daniel Jacobowitz  <drow@mvista.com>

	* dbxread.c (elfstab_build_psymtabs): Don't call
	install_minimal_symbols.
	* elfread.c (elf_symfile_read): Call install_minimal_symbols
	earlier.
	* mdebugread.c (elfmdebug_build_psymtabs): Call
	install_minimal_symbols and make appropriate cleanups.

Index: dbxread.c
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/gdb/dbxread.c,v
retrieving revision 1.40
diff -u -p -r1.40 dbxread.c
--- dbxread.c	18 Jan 2003 15:55:51 -0000	1.40
+++ dbxread.c	22 Jan 2003 23:19:29 -0000
@@ -3511,13 +3511,16 @@ elfstab_build_psymtabs (struct objfile *
   buildsym_new_init ();
   free_header_files ();
   init_header_files ();
-  install_minimal_symbols (objfile);
 
   processing_acc_compilation = 1;
 
   /* In an elf file, we've already installed the minimal symbols that came
      from the elf (non-stab) symbol table, so always act like an
-     incremental load here. */
+     incremental load here.  dbx_symfile_read should not generate any new
+     minimal symbols, since we will have already read the ELF dynamic symbol
+     table and normal symbol entries won't be in the ".stab" section; but in
+     case it does, it will install them itself.  */
+
   dbx_symfile_read (objfile, 0);
 }
 \f
Index: elfread.c
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/gdb/elfread.c,v
retrieving revision 1.29
diff -u -p -r1.29 elfread.c
--- elfread.c	14 Jan 2003 00:49:03 -0000	1.29
+++ elfread.c	22 Jan 2003 23:16:02 -0000
@@ -542,6 +542,15 @@ elf_symfile_read (struct objfile *objfil
 
   elf_symtab_read (objfile, 1);
 
+  /* Install any minimal symbols that have been collected as the current
+     minimal symbols for this objfile.  The debug readers below this point
+     should not generate new minimal symbols; if they do it's their
+     responsibility to install them.  "mdebug" appears to be the only one
+     which will do this.  */
+
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
+
   /* Now process debugging information, which is contained in
      special ELF sections. */
 
@@ -612,13 +621,6 @@ elf_symfile_read (struct objfile *objfil
 
   if (DWARF2_BUILD_FRAME_INFO_P ())
     DWARF2_BUILD_FRAME_INFO(objfile);
-
-  /* Install any minimal symbols that have been collected as the current
-     minimal symbols for this objfile. */
-
-  install_minimal_symbols (objfile);
-
-  do_cleanups (back_to);
 }
 
 /* This cleans up the objfile's sym_stab_info pointer, and the chain of
Index: mdebugread.c
===================================================================
RCS file: /big/fsf/rsync/src-cvs/src/gdb/mdebugread.c,v
retrieving revision 1.39
diff -u -p -r1.39 mdebugread.c
--- mdebugread.c	18 Jan 2003 15:55:52 -0000	1.39
+++ mdebugread.c	26 Jan 2003 17:01:39 -0000
@@ -4810,6 +4810,14 @@ elfmdebug_build_psymtabs (struct objfile
 {
   bfd *abfd = objfile->obfd;
   struct ecoff_debug_info *info;
+  struct cleanup *back_to;
+
+  /* FIXME: It's not clear whether we should be getting minimal symbol
+     information from .mdebug in an ELF file, or whether we will.
+     Re-initialize the minimal symbol reader in case we do.  */
+
+  init_minimal_symbol_collection ();
+  back_to = make_cleanup_discard_minimal_symbols ();
 
   info = ((struct ecoff_debug_info *)
 	  obstack_alloc (&objfile->psymbol_obstack,
@@ -4820,6 +4826,9 @@ elfmdebug_build_psymtabs (struct objfile
 	   bfd_errmsg (bfd_get_error ()));
 
   mdebug_build_psymtabs (objfile, swap, info);
+
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
 }
 \f
 


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: RFA: Fix a big memory leak reading minimal symbols
  2003-01-26 19:13 RFA: Fix a big memory leak reading minimal symbols Daniel Jacobowitz
@ 2003-02-05 19:31 ` Elena Zannoni
  2003-02-05 22:26   ` Daniel Jacobowitz
  0 siblings, 1 reply; 5+ messages in thread
From: Elena Zannoni @ 2003-02-05 19:31 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb-patches

Daniel Jacobowitz writes:
 > This patch is good for a whopping 13% (7MB) of memory usage when reading in
 > all of mozilla's minimal symbols (stabs).  The control flow looks like this
 > right now:
 >   - init_minimal_symbol_collection in elf_symfile_read
 >   - install_minimal_symbols in elfstab_build_psymtabs.  Presumably added so
 >     that we don't lose the minimal symbols above.

right, elfstab_build_psymtab is called by elf_symfile_read, after
init_minimal_symbol_collection.

 >   - dbx_symfile_read contains a complete init_minimal_symbol_collection /
 >     install_minimal_symbols pair, which generally finds no minimal symbols
 >     in ELF.

elfstab_build_psymtab calls dbx_symfile_read.

 >   - install_minimal_symbols and matching cleanup in elf_symfile_read.
 > 

at the end.

 > Only problem is, that second init_minimal_symbol_collection call zeroed out
 > the bunch pointer.  We've installed them but we never free them, so they
 > just sit around wasting memory.

OK, I see the problem in this sequence.  There is another 'stray' call
to install_minimal_symbols, in stabsect_build_psymtab, and this
function also calls dbx_symfile_read. The sequence is the same. So the
problem should occur there as well.
stabsect_build_psymtab is called by som_symfile_read.

 > 
 > This patch arranges for all calls to init_minimal_symbol_collection in ELF
 > targets to be paired with matching cleanups and install_minimal_symbols
 > calls.  This means that elfmdebug_build_psymtabs gets its own pair instead
 > of relying on elf_symfile_read, and that elf_symfile_read installs its own
 > minimal symbols much earlier.

How does elfstab_build_psymtabs get invoked from mdebug? Oh, it
doesn't.  It gets invoked after the mdebug stuff is over.

I see, you are adding pairs of install+cleanup to the mdebug psymtab
builder, i.e. each piece is self-sufficient. For the stabs psymtab
builder the appropriate steps are done in dbx_symfile_read already.

let's see all the symtabs builders:

coffstab_build_psymtabs -> calls dbx_symfile_read ok
elfstab_build_psymtabs -> you fixed ok
stabsect_build_psymtabs -> dubious
dwarf2_build_psymtabs -> no need
dwarf_build_psymtabs -> don't care
hpread_build_psymtabs -> no clue, messy. I think it does it directly.
mdebug_build_psymtabs -> you fixed ok

if the table above makes sense, then can you verify/fix the dubious case?

elena



 > 
 > I'd like a symtab maintainer to look over this patch; the more eyes the
 > better.  I'm probably also short some copyright dates; I'll get them when/if
 > I check it in.
 > 
 > -- 
 > Daniel Jacobowitz
 > MontaVista Software                         Debian GNU/Linux Developer
 > 
 > 2002-01-26  Daniel Jacobowitz  <drow@mvista.com>
 > 
 > 	* dbxread.c (elfstab_build_psymtabs): Don't call
 > 	install_minimal_symbols.
 > 	* elfread.c (elf_symfile_read): Call install_minimal_symbols
 > 	earlier.
 > 	* mdebugread.c (elfmdebug_build_psymtabs): Call
 > 	install_minimal_symbols and make appropriate cleanups.
 > 
 > Index: dbxread.c
 > ===================================================================
 > RCS file: /big/fsf/rsync/src-cvs/src/gdb/dbxread.c,v
 > retrieving revision 1.40
 > diff -u -p -r1.40 dbxread.c
 > --- dbxread.c	18 Jan 2003 15:55:51 -0000	1.40
 > +++ dbxread.c	22 Jan 2003 23:19:29 -0000
 > @@ -3511,13 +3511,16 @@ elfstab_build_psymtabs (struct objfile *
 >    buildsym_new_init ();
 >    free_header_files ();
 >    init_header_files ();
 > -  install_minimal_symbols (objfile);
 >  
 >    processing_acc_compilation = 1;
 >  
 >    /* In an elf file, we've already installed the minimal symbols that came
 >       from the elf (non-stab) symbol table, so always act like an
 > -     incremental load here. */
 > +     incremental load here.  dbx_symfile_read should not generate any new
 > +     minimal symbols, since we will have already read the ELF dynamic symbol
 > +     table and normal symbol entries won't be in the ".stab" section; but in
 > +     case it does, it will install them itself.  */
 > +
 >    dbx_symfile_read (objfile, 0);
 >  }
 >  \f
 > Index: elfread.c
 > ===================================================================
 > RCS file: /big/fsf/rsync/src-cvs/src/gdb/elfread.c,v
 > retrieving revision 1.29
 > diff -u -p -r1.29 elfread.c
 > --- elfread.c	14 Jan 2003 00:49:03 -0000	1.29
 > +++ elfread.c	22 Jan 2003 23:16:02 -0000
 > @@ -542,6 +542,15 @@ elf_symfile_read (struct objfile *objfil
 >  
 >    elf_symtab_read (objfile, 1);
 >  
 > +  /* Install any minimal symbols that have been collected as the current
 > +     minimal symbols for this objfile.  The debug readers below this point
 > +     should not generate new minimal symbols; if they do it's their
 > +     responsibility to install them.  "mdebug" appears to be the only one
 > +     which will do this.  */
 > +
 > +  install_minimal_symbols (objfile);
 > +  do_cleanups (back_to);
 > +
 >    /* Now process debugging information, which is contained in
 >       special ELF sections. */
 >  
 > @@ -612,13 +621,6 @@ elf_symfile_read (struct objfile *objfil
 >  
 >    if (DWARF2_BUILD_FRAME_INFO_P ())
 >      DWARF2_BUILD_FRAME_INFO(objfile);
 > -
 > -  /* Install any minimal symbols that have been collected as the current
 > -     minimal symbols for this objfile. */
 > -
 > -  install_minimal_symbols (objfile);
 > -
 > -  do_cleanups (back_to);
 >  }
 >  
 >  /* This cleans up the objfile's sym_stab_info pointer, and the chain of
 > Index: mdebugread.c
 > ===================================================================
 > RCS file: /big/fsf/rsync/src-cvs/src/gdb/mdebugread.c,v
 > retrieving revision 1.39
 > diff -u -p -r1.39 mdebugread.c
 > --- mdebugread.c	18 Jan 2003 15:55:52 -0000	1.39
 > +++ mdebugread.c	26 Jan 2003 17:01:39 -0000
 > @@ -4810,6 +4810,14 @@ elfmdebug_build_psymtabs (struct objfile
 >  {
 >    bfd *abfd = objfile->obfd;
 >    struct ecoff_debug_info *info;
 > +  struct cleanup *back_to;
 > +
 > +  /* FIXME: It's not clear whether we should be getting minimal symbol
 > +     information from .mdebug in an ELF file, or whether we will.
 > +     Re-initialize the minimal symbol reader in case we do.  */
 > +
 > +  init_minimal_symbol_collection ();
 > +  back_to = make_cleanup_discard_minimal_symbols ();
 >  
 >    info = ((struct ecoff_debug_info *)
 >  	  obstack_alloc (&objfile->psymbol_obstack,
 > @@ -4820,6 +4826,9 @@ elfmdebug_build_psymtabs (struct objfile
 >  	   bfd_errmsg (bfd_get_error ()));
 >  
 >    mdebug_build_psymtabs (objfile, swap, info);
 > +
 > +  install_minimal_symbols (objfile);
 > +  do_cleanups (back_to);
 >  }
 >  \f
 >  


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: RFA: Fix a big memory leak reading minimal symbols
  2003-02-05 19:31 ` Elena Zannoni
@ 2003-02-05 22:26   ` Daniel Jacobowitz
  2003-02-19 21:20     ` Elena Zannoni
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2003-02-05 22:26 UTC (permalink / raw)
  To: Elena Zannoni; +Cc: gdb-patches

On Wed, Feb 05, 2003 at 02:35:27PM -0500, Elena Zannoni wrote:
> Daniel Jacobowitz writes:
>  > This patch is good for a whopping 13% (7MB) of memory usage when reading in
>  > all of mozilla's minimal symbols (stabs).  The control flow looks like this
>  > right now:
>  >   - init_minimal_symbol_collection in elf_symfile_read
>  >   - install_minimal_symbols in elfstab_build_psymtabs.  Presumably added so
>  >     that we don't lose the minimal symbols above.
> 
> right, elfstab_build_psymtab is called by elf_symfile_read, after
> init_minimal_symbol_collection.
> 
>  >   - dbx_symfile_read contains a complete init_minimal_symbol_collection /
>  >     install_minimal_symbols pair, which generally finds no minimal symbols
>  >     in ELF.
> 
> elfstab_build_psymtab calls dbx_symfile_read.
> 
>  >   - install_minimal_symbols and matching cleanup in elf_symfile_read.
>  > 
> 
> at the end.
> 
>  > Only problem is, that second init_minimal_symbol_collection call zeroed out
>  > the bunch pointer.  We've installed them but we never free them, so they
>  > just sit around wasting memory.
> 
> OK, I see the problem in this sequence.  There is another 'stray' call
> to install_minimal_symbols, in stabsect_build_psymtab, and this
> function also calls dbx_symfile_read. The sequence is the same. So the
> problem should occur there as well.
> stabsect_build_psymtab is called by som_symfile_read.

And by nlm_symfile_read too.

>  > This patch arranges for all calls to init_minimal_symbol_collection in ELF
>  > targets to be paired with matching cleanups and install_minimal_symbols
>  > calls.  This means that elfmdebug_build_psymtabs gets its own pair instead
>  > of relying on elf_symfile_read, and that elf_symfile_read installs its own
>  > minimal symbols much earlier.
> 
> How does elfstab_build_psymtabs get invoked from mdebug? Oh, it
> doesn't.  It gets invoked after the mdebug stuff is over.
> 
> I see, you are adding pairs of install+cleanup to the mdebug psymtab
> builder, i.e. each piece is self-sufficient. For the stabs psymtab
> builder the appropriate steps are done in dbx_symfile_read already.

Right.  Each reader that wants to do this, should do it itself, since
they don't nest.

> let's see all the symtabs builders:
> 
> coffstab_build_psymtabs -> calls dbx_symfile_read ok

Ugh.  This is OK but its caller isn't; coff_symtab_read has some
minimal symbols outstanding when it calls coffstab_build_psymtabs. 
Fixed, but I don't have any tests for COFF set up.

> elfstab_build_psymtabs -> you fixed ok
> stabsect_build_psymtabs -> dubious

Fixed, in both callers.

> dwarf2_build_psymtabs -> no need
> dwarf_build_psymtabs -> don't care
> hpread_build_psymtabs -> no clue, messy. I think it does it directly.
> mdebug_build_psymtabs -> you fixed ok
> 
> if the table above makes sense, then can you verify/fix the dubious case?

How's this look?  New changes in coff_symfile_read, nlm_symfile_read,
som_symfile_read, and stabsect_build_psymtabs.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer

2002-02-05  Daniel Jacobowitz  <drow@mvista.com>

	* coffread.c (coff_symfile_read): Clean up minimal symbols earlier.
	* dbxread.c (elfstab_build_psymtabs): Don't call
	install_minimal_symbols.
	(stabsect_build_psymtabs): Likewise.
	* elfread.c (elf_symfile_read): Call install_minimal_symbols
	earlier.
	* somread.c (som_symfile_read): Call install_minimal_symbols
	and do_cleanups earlier.
	* nlmread.c (nlm_symfile_read): Likewise.
	* mdebugread.c (elfmdebug_build_psymtabs): Call
	install_minimal_symbols and make appropriate cleanups.

Index: coffread.c
===================================================================
RCS file: /cvs/src/src/gdb/coffread.c,v
retrieving revision 1.33
diff -u -p -r1.33 coffread.c
--- coffread.c	4 Feb 2003 18:07:00 -0000	1.33
+++ coffread.c	5 Feb 2003 22:22:13 -0000
@@ -515,7 +515,7 @@ coff_symfile_read (struct objfile *objfi
   unsigned int num_symbols;
   int symtab_offset;
   int stringtab_offset;
-  struct cleanup *back_to;
+  struct cleanup *back_to, *cleanup_minimal_symbols;
   int stabstrsize;
   int len;
   char * target;
@@ -595,7 +595,7 @@ coff_symfile_read (struct objfile *objfi
     error ("\"%s\": can't get string table", name);
 
   init_minimal_symbol_collection ();
-  make_cleanup_discard_minimal_symbols ();
+  cleanup_minimal_symbols = make_cleanup_discard_minimal_symbols ();
 
   /* Now that the executable file is positioned at symbol table,
      process it and define symbols accordingly.  */
@@ -615,6 +615,9 @@ coff_symfile_read (struct objfile *objfi
      minimal symbols for this objfile.  */
 
   install_minimal_symbols (objfile);
+
+  /* Free the installed minimal symbol data.  */
+  do_cleanups (cleanup_minimal_symbols);
 
   bfd_map_over_sections (abfd, coff_locate_sections, (void *) info);
 
Index: dbxread.c
===================================================================
RCS file: /cvs/src/src/gdb/dbxread.c,v
retrieving revision 1.41
diff -u -p -r1.41 dbxread.c
--- dbxread.c	31 Jan 2003 19:22:17 -0000	1.41
+++ dbxread.c	5 Feb 2003 22:22:13 -0000
@@ -3555,7 +3555,6 @@ elfstab_build_psymtabs (struct objfile *
   buildsym_new_init ();
   free_header_files ();
   init_header_files ();
-  install_minimal_symbols (objfile);
 
   processing_acc_compilation = 1;
 
@@ -3567,7 +3566,10 @@ elfstab_build_psymtabs (struct objfile *
 
   /* In an elf file, we've already installed the minimal symbols that came
      from the elf (non-stab) symbol table, so always act like an
-     incremental load here. */
+     incremental load here.  dbx_symfile_read should not generate any new
+     minimal symbols, since we will have already read the ELF dynamic symbol
+     table and normal symbol entries won't be in the ".stab" section; but in
+     case it does, it will install them itself.  */
   dbx_symfile_read (objfile, 0);
 
   if (back_to)
@@ -3649,7 +3651,6 @@ stabsect_build_psymtabs (struct objfile 
   buildsym_new_init ();
   free_header_files ();
   init_header_files ();
-  install_minimal_symbols (objfile);
 
   /* Now, do an incremental load */
 
Index: elfread.c
===================================================================
RCS file: /cvs/src/src/gdb/elfread.c,v
retrieving revision 1.30
diff -u -p -r1.30 elfread.c
--- elfread.c	31 Jan 2003 19:22:18 -0000	1.30
+++ elfread.c	5 Feb 2003 22:22:14 -0000
@@ -542,6 +542,15 @@ elf_symfile_read (struct objfile *objfil
 
   elf_symtab_read (objfile, 1);
 
+  /* Install any minimal symbols that have been collected as the current
+     minimal symbols for this objfile.  The debug readers below this point
+     should not generate new minimal symbols; if they do it's their
+     responsibility to install them.  "mdebug" appears to be the only one
+     which will do this.  */
+
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
+
   /* Now process debugging information, which is contained in
      special ELF sections. */
 
@@ -611,13 +620,6 @@ elf_symfile_read (struct objfile *objfil
 
   if (DWARF2_BUILD_FRAME_INFO_P ())
     DWARF2_BUILD_FRAME_INFO(objfile);
-
-  /* Install any minimal symbols that have been collected as the current
-     minimal symbols for this objfile. */
-
-  install_minimal_symbols (objfile);
-
-  do_cleanups (back_to);
 }
 
 /* This cleans up the objfile's sym_stab_info pointer, and the chain of
Index: mdebugread.c
===================================================================
RCS file: /cvs/src/src/gdb/mdebugread.c,v
retrieving revision 1.40
diff -u -p -r1.40 mdebugread.c
--- mdebugread.c	4 Feb 2003 18:07:01 -0000	1.40
+++ mdebugread.c	5 Feb 2003 22:22:15 -0000
@@ -4808,6 +4808,14 @@ elfmdebug_build_psymtabs (struct objfile
 {
   bfd *abfd = objfile->obfd;
   struct ecoff_debug_info *info;
+  struct cleanup *back_to;
+
+  /* FIXME: It's not clear whether we should be getting minimal symbol
+     information from .mdebug in an ELF file, or whether we will.
+     Re-initialize the minimal symbol reader in case we do.  */
+
+  init_minimal_symbol_collection ();
+  back_to = make_cleanup_discard_minimal_symbols ();
 
   info = ((struct ecoff_debug_info *)
 	  obstack_alloc (&objfile->psymbol_obstack,
@@ -4818,6 +4826,9 @@ elfmdebug_build_psymtabs (struct objfile
 	   bfd_errmsg (bfd_get_error ()));
 
   mdebug_build_psymtabs (objfile, swap, info);
+
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
 }
 \f
 
Index: nlmread.c
===================================================================
RCS file: /cvs/src/src/gdb/nlmread.c,v
retrieving revision 1.9
diff -u -p -r1.9 nlmread.c
--- nlmread.c	2 Dec 2001 22:38:23 -0000	1.9
+++ nlmread.c	5 Feb 2003 22:22:15 -0000
@@ -190,6 +190,12 @@ nlm_symfile_read (struct objfile *objfil
 
   nlm_symtab_read (abfd, offset, objfile);
 
+  /* Install any minimal symbols that have been collected as the current
+     minimal symbols for this objfile. */
+
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
+
   stabsect_build_psymtabs (objfile, mainline, ".stab",
 			   ".stabstr", ".text");
 
@@ -204,13 +210,6 @@ nlm_symfile_read (struct objfile *objfil
 
   /* FIXME:  We could locate and read the optional native debugging format
      here and add the symbols to the minimal symbol table. */
-
-  /* Install any minimal symbols that have been collected as the current
-     minimal symbols for this objfile. */
-
-  install_minimal_symbols (objfile);
-
-  do_cleanups (back_to);
 }
 
 
Index: somread.c
===================================================================
RCS file: /cvs/src/src/gdb/somread.c,v
retrieving revision 1.16
diff -u -p -r1.16 somread.c
--- somread.c	19 Jan 2003 04:06:46 -0000	1.16
+++ somread.c	5 Feb 2003 22:22:15 -0000
@@ -353,6 +353,14 @@ som_symfile_read (struct objfile *objfil
 
   som_symtab_read (abfd, objfile, objfile->section_offsets);
 
+  /* Install any minimal symbols that have been collected as the current
+     minimal symbols for this objfile. 
+     Further symbol-reading is done incrementally, file-by-file,
+     in a step known as "psymtab-to-symtab" expansion. hp-symtab-read.c
+     contains the code to do the actual DNTT scanning and symtab building. */
+  install_minimal_symbols (objfile);
+  do_cleanups (back_to);
+
   /* Now read information from the stabs debug sections.
      This is a no-op for SOM.
      Perhaps it is intended for some kind of mixed STABS/SOM
@@ -366,16 +374,8 @@ som_symfile_read (struct objfile *objfil
      together with a scan of the GNTT. See hp-psymtab-read.c. */
   hpread_build_psymtabs (objfile, mainline);
 
-  /* Install any minimal symbols that have been collected as the current
-     minimal symbols for this objfile. 
-     Further symbol-reading is done incrementally, file-by-file,
-     in a step known as "psymtab-to-symtab" expansion. hp-symtab-read.c
-     contains the code to do the actual DNTT scanning and symtab building. */
-  install_minimal_symbols (objfile);
-
   /* Force hppa-tdep.c to re-read the unwind descriptors.  */
   objfile->obj_private = NULL;
-  do_cleanups (back_to);
 }
 
 /* Initialize anything that needs initializing when a completely new symbol


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: RFA: Fix a big memory leak reading minimal symbols
  2003-02-05 22:26   ` Daniel Jacobowitz
@ 2003-02-19 21:20     ` Elena Zannoni
  2003-02-20 19:32       ` Daniel Jacobowitz
  0 siblings, 1 reply; 5+ messages in thread
From: Elena Zannoni @ 2003-02-19 21:20 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: Elena Zannoni, gdb-patches

Daniel Jacobowitz writes:
 > On Wed, Feb 05, 2003 at 02:35:27PM -0500, Elena Zannoni wrote:
 > > Daniel Jacobowitz writes:
 > >  > This patch is good for a whopping 13% (7MB) of memory usage when reading in
 > >  > all of mozilla's minimal symbols (stabs).  The control flow looks like this
 > >  > right now:
 > >  >   - init_minimal_symbol_collection in elf_symfile_read
 > >  >   - install_minimal_symbols in elfstab_build_psymtabs.  Presumably added so
 > >  >     that we don't lose the minimal symbols above.
 > > 
 > > right, elfstab_build_psymtab is called by elf_symfile_read, after
 > > init_minimal_symbol_collection.
 > > 
 > >  >   - dbx_symfile_read contains a complete init_minimal_symbol_collection /
 > >  >     install_minimal_symbols pair, which generally finds no minimal symbols
 > >  >     in ELF.
 > > 
 > > elfstab_build_psymtab calls dbx_symfile_read.
 > > 
 > >  >   - install_minimal_symbols and matching cleanup in elf_symfile_read.
 > >  > 
 > > 
 > > at the end.
 > > 
 > >  > Only problem is, that second init_minimal_symbol_collection call zeroed out
 > >  > the bunch pointer.  We've installed them but we never free them, so they
 > >  > just sit around wasting memory.
 > > 
 > > OK, I see the problem in this sequence.  There is another 'stray' call
 > > to install_minimal_symbols, in stabsect_build_psymtab, and this
 > > function also calls dbx_symfile_read. The sequence is the same. So the
 > > problem should occur there as well.
 > > stabsect_build_psymtab is called by som_symfile_read.
 > 
 > And by nlm_symfile_read too.
 > 
 > >  > This patch arranges for all calls to init_minimal_symbol_collection in ELF
 > >  > targets to be paired with matching cleanups and install_minimal_symbols
 > >  > calls.  This means that elfmdebug_build_psymtabs gets its own pair instead
 > >  > of relying on elf_symfile_read, and that elf_symfile_read installs its own
 > >  > minimal symbols much earlier.
 > > 
 > > How does elfstab_build_psymtabs get invoked from mdebug? Oh, it
 > > doesn't.  It gets invoked after the mdebug stuff is over.
 > > 
 > > I see, you are adding pairs of install+cleanup to the mdebug psymtab
 > > builder, i.e. each piece is self-sufficient. For the stabs psymtab
 > > builder the appropriate steps are done in dbx_symfile_read already.
 > 
 > Right.  Each reader that wants to do this, should do it itself, since
 > they don't nest.
 > 
 > > let's see all the symtabs builders:
 > > 
 > > coffstab_build_psymtabs -> calls dbx_symfile_read ok
 > 
 > Ugh.  This is OK but its caller isn't; coff_symtab_read has some
 > minimal symbols outstanding when it calls coffstab_build_psymtabs. 
 > Fixed, but I don't have any tests for COFF set up.
 > 
 > > elfstab_build_psymtabs -> you fixed ok
 > > stabsect_build_psymtabs -> dubious
 > 
 > Fixed, in both callers.
 > 
 > > dwarf2_build_psymtabs -> no need
 > > dwarf_build_psymtabs -> don't care
 > > hpread_build_psymtabs -> no clue, messy. I think it does it directly.
 > > mdebug_build_psymtabs -> you fixed ok
 > > 
 > > if the table above makes sense, then can you verify/fix the dubious case?
 > 
 > How's this look?  New changes in coff_symfile_read, nlm_symfile_read,
 > som_symfile_read, and stabsect_build_psymtabs.
 > 

Okey

elena


 > -- 
 > Daniel Jacobowitz
 > MontaVista Software                         Debian GNU/Linux Developer
 > 
 > 2002-02-05  Daniel Jacobowitz  <drow@mvista.com>
 > 
 > 	* coffread.c (coff_symfile_read): Clean up minimal symbols earlier.
 > 	* dbxread.c (elfstab_build_psymtabs): Don't call
 > 	install_minimal_symbols.
 > 	(stabsect_build_psymtabs): Likewise.
 > 	* elfread.c (elf_symfile_read): Call install_minimal_symbols
 > 	earlier.
 > 	* somread.c (som_symfile_read): Call install_minimal_symbols
 > 	and do_cleanups earlier.
 > 	* nlmread.c (nlm_symfile_read): Likewise.
 > 	* mdebugread.c (elfmdebug_build_psymtabs): Call
 > 	install_minimal_symbols and make appropriate cleanups.
 > 
 > Index: coffread.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/coffread.c,v
 > retrieving revision 1.33
 > diff -u -p -r1.33 coffread.c
 > --- coffread.c	4 Feb 2003 18:07:00 -0000	1.33
 > +++ coffread.c	5 Feb 2003 22:22:13 -0000
 > @@ -515,7 +515,7 @@ coff_symfile_read (struct objfile *objfi
 >    unsigned int num_symbols;
 >    int symtab_offset;
 >    int stringtab_offset;
 > -  struct cleanup *back_to;
 > +  struct cleanup *back_to, *cleanup_minimal_symbols;
 >    int stabstrsize;
 >    int len;
 >    char * target;
 > @@ -595,7 +595,7 @@ coff_symfile_read (struct objfile *objfi
 >      error ("\"%s\": can't get string table", name);
 >  
 >    init_minimal_symbol_collection ();
 > -  make_cleanup_discard_minimal_symbols ();
 > +  cleanup_minimal_symbols = make_cleanup_discard_minimal_symbols ();
 >  
 >    /* Now that the executable file is positioned at symbol table,
 >       process it and define symbols accordingly.  */
 > @@ -615,6 +615,9 @@ coff_symfile_read (struct objfile *objfi
 >       minimal symbols for this objfile.  */
 >  
 >    install_minimal_symbols (objfile);
 > +
 > +  /* Free the installed minimal symbol data.  */
 > +  do_cleanups (cleanup_minimal_symbols);
 >  
 >    bfd_map_over_sections (abfd, coff_locate_sections, (void *) info);
 >  
 > Index: dbxread.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/dbxread.c,v
 > retrieving revision 1.41
 > diff -u -p -r1.41 dbxread.c
 > --- dbxread.c	31 Jan 2003 19:22:17 -0000	1.41
 > +++ dbxread.c	5 Feb 2003 22:22:13 -0000
 > @@ -3555,7 +3555,6 @@ elfstab_build_psymtabs (struct objfile *
 >    buildsym_new_init ();
 >    free_header_files ();
 >    init_header_files ();
 > -  install_minimal_symbols (objfile);
 >  
 >    processing_acc_compilation = 1;
 >  
 > @@ -3567,7 +3566,10 @@ elfstab_build_psymtabs (struct objfile *
 >  
 >    /* In an elf file, we've already installed the minimal symbols that came
 >       from the elf (non-stab) symbol table, so always act like an
 > -     incremental load here. */
 > +     incremental load here.  dbx_symfile_read should not generate any new
 > +     minimal symbols, since we will have already read the ELF dynamic symbol
 > +     table and normal symbol entries won't be in the ".stab" section; but in
 > +     case it does, it will install them itself.  */
 >    dbx_symfile_read (objfile, 0);
 >  
 >    if (back_to)
 > @@ -3649,7 +3651,6 @@ stabsect_build_psymtabs (struct objfile 
 >    buildsym_new_init ();
 >    free_header_files ();
 >    init_header_files ();
 > -  install_minimal_symbols (objfile);
 >  
 >    /* Now, do an incremental load */
 >  
 > Index: elfread.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/elfread.c,v
 > retrieving revision 1.30
 > diff -u -p -r1.30 elfread.c
 > --- elfread.c	31 Jan 2003 19:22:18 -0000	1.30
 > +++ elfread.c	5 Feb 2003 22:22:14 -0000
 > @@ -542,6 +542,15 @@ elf_symfile_read (struct objfile *objfil
 >  
 >    elf_symtab_read (objfile, 1);
 >  
 > +  /* Install any minimal symbols that have been collected as the current
 > +     minimal symbols for this objfile.  The debug readers below this point
 > +     should not generate new minimal symbols; if they do it's their
 > +     responsibility to install them.  "mdebug" appears to be the only one
 > +     which will do this.  */
 > +
 > +  install_minimal_symbols (objfile);
 > +  do_cleanups (back_to);
 > +
 >    /* Now process debugging information, which is contained in
 >       special ELF sections. */
 >  
 > @@ -611,13 +620,6 @@ elf_symfile_read (struct objfile *objfil
 >  
 >    if (DWARF2_BUILD_FRAME_INFO_P ())
 >      DWARF2_BUILD_FRAME_INFO(objfile);
 > -
 > -  /* Install any minimal symbols that have been collected as the current
 > -     minimal symbols for this objfile. */
 > -
 > -  install_minimal_symbols (objfile);
 > -
 > -  do_cleanups (back_to);
 >  }
 >  
 >  /* This cleans up the objfile's sym_stab_info pointer, and the chain of
 > Index: mdebugread.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/mdebugread.c,v
 > retrieving revision 1.40
 > diff -u -p -r1.40 mdebugread.c
 > --- mdebugread.c	4 Feb 2003 18:07:01 -0000	1.40
 > +++ mdebugread.c	5 Feb 2003 22:22:15 -0000
 > @@ -4808,6 +4808,14 @@ elfmdebug_build_psymtabs (struct objfile
 >  {
 >    bfd *abfd = objfile->obfd;
 >    struct ecoff_debug_info *info;
 > +  struct cleanup *back_to;
 > +
 > +  /* FIXME: It's not clear whether we should be getting minimal symbol
 > +     information from .mdebug in an ELF file, or whether we will.
 > +     Re-initialize the minimal symbol reader in case we do.  */
 > +
 > +  init_minimal_symbol_collection ();
 > +  back_to = make_cleanup_discard_minimal_symbols ();
 >  
 >    info = ((struct ecoff_debug_info *)
 >  	  obstack_alloc (&objfile->psymbol_obstack,
 > @@ -4818,6 +4826,9 @@ elfmdebug_build_psymtabs (struct objfile
 >  	   bfd_errmsg (bfd_get_error ()));
 >  
 >    mdebug_build_psymtabs (objfile, swap, info);
 > +
 > +  install_minimal_symbols (objfile);
 > +  do_cleanups (back_to);
 >  }
 >  \f
 >  
 > Index: nlmread.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/nlmread.c,v
 > retrieving revision 1.9
 > diff -u -p -r1.9 nlmread.c
 > --- nlmread.c	2 Dec 2001 22:38:23 -0000	1.9
 > +++ nlmread.c	5 Feb 2003 22:22:15 -0000
 > @@ -190,6 +190,12 @@ nlm_symfile_read (struct objfile *objfil
 >  
 >    nlm_symtab_read (abfd, offset, objfile);
 >  
 > +  /* Install any minimal symbols that have been collected as the current
 > +     minimal symbols for this objfile. */
 > +
 > +  install_minimal_symbols (objfile);
 > +  do_cleanups (back_to);
 > +
 >    stabsect_build_psymtabs (objfile, mainline, ".stab",
 >  			   ".stabstr", ".text");
 >  
 > @@ -204,13 +210,6 @@ nlm_symfile_read (struct objfile *objfil
 >  
 >    /* FIXME:  We could locate and read the optional native debugging format
 >       here and add the symbols to the minimal symbol table. */
 > -
 > -  /* Install any minimal symbols that have been collected as the current
 > -     minimal symbols for this objfile. */
 > -
 > -  install_minimal_symbols (objfile);
 > -
 > -  do_cleanups (back_to);
 >  }
 >  
 >  
 > Index: somread.c
 > ===================================================================
 > RCS file: /cvs/src/src/gdb/somread.c,v
 > retrieving revision 1.16
 > diff -u -p -r1.16 somread.c
 > --- somread.c	19 Jan 2003 04:06:46 -0000	1.16
 > +++ somread.c	5 Feb 2003 22:22:15 -0000
 > @@ -353,6 +353,14 @@ som_symfile_read (struct objfile *objfil
 >  
 >    som_symtab_read (abfd, objfile, objfile->section_offsets);
 >  
 > +  /* Install any minimal symbols that have been collected as the current
 > +     minimal symbols for this objfile. 
 > +     Further symbol-reading is done incrementally, file-by-file,
 > +     in a step known as "psymtab-to-symtab" expansion. hp-symtab-read.c
 > +     contains the code to do the actual DNTT scanning and symtab building. */
 > +  install_minimal_symbols (objfile);
 > +  do_cleanups (back_to);
 > +
 >    /* Now read information from the stabs debug sections.
 >       This is a no-op for SOM.
 >       Perhaps it is intended for some kind of mixed STABS/SOM
 > @@ -366,16 +374,8 @@ som_symfile_read (struct objfile *objfil
 >       together with a scan of the GNTT. See hp-psymtab-read.c. */
 >    hpread_build_psymtabs (objfile, mainline);
 >  
 > -  /* Install any minimal symbols that have been collected as the current
 > -     minimal symbols for this objfile. 
 > -     Further symbol-reading is done incrementally, file-by-file,
 > -     in a step known as "psymtab-to-symtab" expansion. hp-symtab-read.c
 > -     contains the code to do the actual DNTT scanning and symtab building. */
 > -  install_minimal_symbols (objfile);
 > -
 >    /* Force hppa-tdep.c to re-read the unwind descriptors.  */
 >    objfile->obj_private = NULL;
 > -  do_cleanups (back_to);
 >  }
 >  
 >  /* Initialize anything that needs initializing when a completely new symbol


^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: RFA: Fix a big memory leak reading minimal symbols
  2003-02-19 21:20     ` Elena Zannoni
@ 2003-02-20 19:32       ` Daniel Jacobowitz
  0 siblings, 0 replies; 5+ messages in thread
From: Daniel Jacobowitz @ 2003-02-20 19:32 UTC (permalink / raw)
  To: gdb-patches

On Wed, Feb 19, 2003 at 04:24:39PM -0500, Elena Zannoni wrote:
> Daniel Jacobowitz writes:
>  > On Wed, Feb 05, 2003 at 02:35:27PM -0500, Elena Zannoni wrote:
>  > > Daniel Jacobowitz writes:
>  > >  > This patch is good for a whopping 13% (7MB) of memory usage when reading in
>  > >  > all of mozilla's minimal symbols (stabs).  The control flow looks like this
>  > >  > right now:
>  > >  >   - init_minimal_symbol_collection in elf_symfile_read
>  > >  >   - install_minimal_symbols in elfstab_build_psymtabs.  Presumably added so
>  > >  >     that we don't lose the minimal symbols above.
>  > > 
>  > > right, elfstab_build_psymtab is called by elf_symfile_read, after
>  > > init_minimal_symbol_collection.
>  > > 
>  > >  >   - dbx_symfile_read contains a complete init_minimal_symbol_collection /
>  > >  >     install_minimal_symbols pair, which generally finds no minimal symbols
>  > >  >     in ELF.
>  > > 
>  > > elfstab_build_psymtab calls dbx_symfile_read.
>  > > 
>  > >  >   - install_minimal_symbols and matching cleanup in elf_symfile_read.
>  > >  > 
>  > > 
>  > > at the end.
>  > > 
>  > >  > Only problem is, that second init_minimal_symbol_collection call zeroed out
>  > >  > the bunch pointer.  We've installed them but we never free them, so they
>  > >  > just sit around wasting memory.
>  > > 
>  > > OK, I see the problem in this sequence.  There is another 'stray' call
>  > > to install_minimal_symbols, in stabsect_build_psymtab, and this
>  > > function also calls dbx_symfile_read. The sequence is the same. So the
>  > > problem should occur there as well.
>  > > stabsect_build_psymtab is called by som_symfile_read.
>  > 
>  > And by nlm_symfile_read too.
>  > 
>  > >  > This patch arranges for all calls to init_minimal_symbol_collection in ELF
>  > >  > targets to be paired with matching cleanups and install_minimal_symbols
>  > >  > calls.  This means that elfmdebug_build_psymtabs gets its own pair instead
>  > >  > of relying on elf_symfile_read, and that elf_symfile_read installs its own
>  > >  > minimal symbols much earlier.
>  > > 
>  > > How does elfstab_build_psymtabs get invoked from mdebug? Oh, it
>  > > doesn't.  It gets invoked after the mdebug stuff is over.
>  > > 
>  > > I see, you are adding pairs of install+cleanup to the mdebug psymtab
>  > > builder, i.e. each piece is self-sufficient. For the stabs psymtab
>  > > builder the appropriate steps are done in dbx_symfile_read already.
>  > 
>  > Right.  Each reader that wants to do this, should do it itself, since
>  > they don't nest.
>  > 
>  > > let's see all the symtabs builders:
>  > > 
>  > > coffstab_build_psymtabs -> calls dbx_symfile_read ok
>  > 
>  > Ugh.  This is OK but its caller isn't; coff_symtab_read has some
>  > minimal symbols outstanding when it calls coffstab_build_psymtabs. 
>  > Fixed, but I don't have any tests for COFF set up.
>  > 
>  > > elfstab_build_psymtabs -> you fixed ok
>  > > stabsect_build_psymtabs -> dubious
>  > 
>  > Fixed, in both callers.
>  > 
>  > > dwarf2_build_psymtabs -> no need
>  > > dwarf_build_psymtabs -> don't care
>  > > hpread_build_psymtabs -> no clue, messy. I think it does it directly.
>  > > mdebug_build_psymtabs -> you fixed ok
>  > > 
>  > > if the table above makes sense, then can you verify/fix the dubious case?
>  > 
>  > How's this look?  New changes in coff_symfile_read, nlm_symfile_read,
>  > som_symfile_read, and stabsect_build_psymtabs.
>  > 
> 
> Okey

Thanks, I've checked it in!  One more off the list.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer


^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2003-02-20 19:32 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2003-01-26 19:13 RFA: Fix a big memory leak reading minimal symbols Daniel Jacobowitz
2003-02-05 19:31 ` Elena Zannoni
2003-02-05 22:26   ` Daniel Jacobowitz
2003-02-19 21:20     ` Elena Zannoni
2003-02-20 19:32       ` Daniel Jacobowitz

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox