This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Clear current source symtab if belongs to objfile being freed


I stumbled over this problem while chasing something else.  If the
current source symtab belongs to a loaded shared library, and the
objfile for that library is freed in the process or rerunning the
executable, the current source symtab can be left pointing to garbage.

An alternative solution, though a little more heavy handed, would be
to replace the previous clear_pc_function_cache() call with a call to
clear_symtab_users().

Comments?

-Fred


2006-01-03  Fred Fish  <fnf@specifix.com>

	* objfiles.c (source.h): Include.
	(free_objfile): Update comment about clear_symtab_users().
	(free_objfile): Check all symtabs of objfile being freed and if
	one of them is the current source symtab, call
 	clear_current_source_symtab_and_line().

Index: objfiles.c
===================================================================
RCS file: /cvsroots/latest/src/gdb/gdb/objfiles.c,v
retrieving revision 1.1.1.2
diff -c -p -r1.1.1.2 objfiles.c
*** objfiles.c	30 Dec 2005 18:53:15 -0000	1.1.1.2
--- objfiles.c	3 Jan 2006 15:57:05 -0000
***************
*** 45,50 ****
--- 45,51 ----
  #include "breakpoint.h"
  #include "block.h"
  #include "dictionary.h"
+ #include "source.h"
  
  /* Prototypes for local functions */
  
*************** free_objfile (struct objfile *objfile)
*** 432,441 ****
       is unknown, but we play it safe for now and keep each action until
       it is shown to be no longer needed. */
  
!   /* I *think* all our callers call clear_symtab_users.  If so, no need
!      to call this here.  */
    clear_pc_function_cache ();
  
    /* The last thing we do is free the objfile struct itself. */
  
    objfile_free_data (objfile);
--- 433,457 ----
       is unknown, but we play it safe for now and keep each action until
       it is shown to be no longer needed. */
  
!   /* I *think* all our callers call clear_symtab_users.  If so, no
!      need to call this here.  Update: We are called via
!      objfile_purge_solibs which doesn't call clear_symtab_users. */
    clear_pc_function_cache ();
  
+   /* Check to see if the current_source_symtab belongs to this objfile,
+      and if so, call clear_current_source_symtab_and_line. */
+ 
+   {
+     struct symtab_and_line cursal = get_current_source_symtab_and_line ();
+     struct symtab *s;
+ 
+     ALL_OBJFILE_SYMTABS (objfile, s)
+       {
+ 	if (s == cursal.symtab)
+ 	  clear_current_source_symtab_and_line ();
+       }
+   }
+ 
    /* The last thing we do is free the objfile struct itself. */
  
    objfile_free_data (objfile);

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]