Aargh - I was working on it just now because I wasn't sure if anyone felt they "had the ball on their court". > Like so? > > 2015-01-28 Doug Evans > > PR symtab/17855 > * symfile.c (clear_symtab_users): Move call to breakpoint_re_set > closer to end. What I've tested is moving the call last, as shown in the attached diff. Not technically necessarily better, but as the comment explains, I move it last so that it's after we've purged all relevant caches. That way, the function is organized in two rough sections: - do purges first; - do updates next. Your comment is a lot more detailed, I like it. > diff --git a/gdb/symfile.c b/gdb/symfile.c > index d55e361..bad244c 100644 > --- a/gdb/symfile.c > +++ b/gdb/symfile.c > @@ -3023,13 +3023,8 @@ clear_symtab_users (int add_flags) > /* Someday, we should do better than this, by only blowing away > the things that really need to be blown. */ > > - /* Clear the "current" symtab first, because it is no longer valid. > - breakpoint_re_set may try to access the current symtab. */ > clear_current_source_symtab_and_line (); > - > clear_displays (); > - if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0) > - breakpoint_re_set (); > clear_last_displayed_sal (); > clear_pc_function_cache (); > observer_notify_new_objfile (NULL); > @@ -3040,9 +3035,19 @@ clear_symtab_users (int add_flags) > expression_context_block = NULL; > innermost_block = NULL; > > + /* Now that most everything has been reset, reset any existing breakpoints. > + Reasons for doing this after the above are that breakpoint resetting may > + involve: > + - reading the current source symtab and line, > + - reading the last displayed sal, > + - reading the pc function cache, > + - symbol lookup which requires, for example, invalidating any caches > + first. */ > + if ((add_flags & SYMFILE_DEFER_BP_RESET) == 0) > + breakpoint_re_set (); > + > /* Varobj may refer to old symbols, perform a cleanup. */ > varobj_invalidate (); > - > } > > static void > > > -- Joel