Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
* [rfa] eliminate some annoying mdebug-related symtab crashes
@ 2001-07-09 15:11 Daniel Jacobowitz
       [not found] ` <15192.48720.958756.789421@krustylu.cygnus.com>
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2001-07-09 15:11 UTC (permalink / raw)
  To: gdb-patches

I'm really looking forward to getting away from mdebug and back to straight
ELF stabs, but I need mdebug for one last project.  This patch addresses two
of the crashes I've been having - properly, this time.

The init_header_files fix is almost trivial, although it might be preferable
to rename the functions now that I've had to make them non-static.  The list
was NULL, mdebugread's psymtab_to_symtab_1 was calling dbxread's
process_one_symbol which called add_new_header_file, and we crashed.  I'm
not sure if the extra:

+  stabsread_new_init ();
+  buildsym_new_init ();

is really necessary, since elfread_new_init() calls them, but analogy with
every other existing symbol reader suggests that it is correct, or at least
customary.


The init_psymbol_list is a little trickier.  Normally, both the global and
static symbol lists for an objfile are pre-allocated based on the expected
number of symbols.  mdebugread does not do that, which is, I think, fine. 
If global symbols are read but no static symbols are read, which has
happened to me in the startfiles several times, we should not be
re-initializing the list of symbols - there are psymtabs pointing in to what
we're freeing.  We only want to do that if neither global nor static symbols
have been read.


Are these OK to commit?

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer
From fnasser@cygnus.com Mon Jul 09 15:13:00 2001
From: Fernando Nasser <fnasser@cygnus.com>
To: Daniel Jacobowitz <dmj+@andrew.cmu.edu>
Cc: gdb-patches@sourceware.cygnus.com
Subject: Re: [RFA] Testsuite addition for x86 linux GDB and SIGALRM fix
Date: Mon, 09 Jul 2001 15:13:00 -0000
Message-id: <3B4A2C7C.85C688C4@cygnus.com>
References: <200005192321.e4JNLEv13368@delius.kettenis.local> <3B3ABD6E.1040304@cygnus.com> <3B4A2056.4D58E307@cygnus.com> <20010709143406.A17003@nevyn.them.org>
X-SW-Source: 2001-07/msg00222.html
Content-length: 1657

Daniel Jacobowitz wrote:
> 
> On Mon, Jul 09, 2001 at 05:21:26PM -0400, Fernando Nasser wrote:
> > W.r.t. the tests for HP and IA64 I sincerely regret that we do not
> > have two commands: "finishi" and "finish".  The current behavior of
> > "finish" (stop at the assembler instruction after the call) is very
> > unsettling for someone who is doing source level debugging -- in this
> > case it should, after returning, single step until the end of the
> > sourceline where the call is ("if it is not at the beginning of a
> > source line after the return, single step to the end of it" would
> > do).
> 
> I think that the current behavior of finish, while awkward, is better
> than what you're suggesting here.  Suppose we have:
>   foo (bar (x));
> and we want to step in to foo.  There's two ways to do it; a breakpoint
> on foo, or step - finish - step. 

The breakpoint is the correct way.  The latter is an artifact.

> Stepping in to bar, typing finish,
> and ending up after the call to foo would be exceedingly non-intuitive.
> 

This is true. But a finish would not stop after the call to foo() in this case.  The stepping would be aborted as we entered foo() itself (note that I said "step", not "next").  The result is quite intuitive in this case and you just provided one good example of how we could use it -- one could go "finish"-ing until the desired function was entered (without the need to step again and without the weird thing of appearing to stop at the same line you were before).



-- 
Fernando Nasser
Red Hat - Toronto                       E-Mail:  fnasser@redhat.com
2323 Yonge Street, Suite #300
Toronto, Ontario   M4P 2C9


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

* Re: [rfa] eliminate some annoying mdebug-related symtab crashes
       [not found] ` <15192.48720.958756.789421@krustylu.cygnus.com>
@ 2001-07-20 15:47   ` Daniel Jacobowitz
  2001-07-20 18:25     ` Elena Zannoni
  0 siblings, 1 reply; 5+ messages in thread
From: Daniel Jacobowitz @ 2001-07-20 15:47 UTC (permalink / raw)
  To: Elena Zannoni; +Cc: gdb-patches

On Fri, Jul 20, 2001 at 07:27:12PM -0400, Elena Zannoni wrote:
> 
> Daniel Jacobowitz writes:
>  > I'm really looking forward to getting away from mdebug and back to straight
>  > ELF stabs, but I need mdebug for one last project.  This patch addresses two
>  > of the crashes I've been having - properly, this time.
>  > 
>  > The init_header_files fix is almost trivial, although it might be preferable
>  > to rename the functions now that I've had to make them non-static.  The list
>  > was NULL, mdebugread's psymtab_to_symtab_1 was calling dbxread's
>  > process_one_symbol which called add_new_header_file, and we crashed.  I'm
>  > not sure if the extra:
>  > 
>  > +  stabsread_new_init ();
>  > +  buildsym_new_init ();
>  > 
>  > is really necessary, since elfread_new_init() calls them, but analogy with
>  > every other existing symbol reader suggests that it is correct, or at least
>  > customary.
>  > 
> 
> Is the above another fix for the same problem you submitted in the
> previous patch?  If you rewrite a patch could you please withdraw the
> first one, so that no time goes into reviewing it?  Anyway, I consider
> this addressed. It occurred to me to do it this way, but I would be
> curious to see if the other way I suggested works as well.

The include files fix here is indeed for the same problem as in the
other patch.  I didn't withdraw the first patch because it seemed best
to me to fix it in both places - initialize properly, and don't die if
we didn't.  Defensive programming; I'm sick of GDB crashing on the
(admittedly somewhat bizarre) binaries I've been giving it.

> The below is for another problem. They should really be two separate
> patches... Anyway.  For this I would be really hesitant to commit

Yes, you're right.  Sorry.

> changes to the other readers.  Unless you can show that there are no
> regressions. I think overall is better to leave those alone.  Even
> though the change seems to make sense, and the comments seem to imply
> that both list should be empty. But the code has been like that for ages, I
> just looked at the cvs repository, and it was like that already in
> 1995. I know this is not a real argument, but....
> 
> Can you elaborate some more on what's happening here?  Do you have 2
> different debug info sections, mdebug + stabs in the same object file?
> Do you end up with two psymtabs chains (one created by
> elfmdebug_build_psymtabs, the other by elfstabs_build_psymtabs)
> pointing to the same object file, therefore sharing the
> static_psymbols and global_psymbol lists? And this is why at the point
> of the call to init_psymbol_list from dbx_symfile_read (ultimately
> deriving from the call to elfstab_build_psymtabs) there is information
> in the psymbol lists already?  
> 
> According to elf_symfile_read there can be even more than two
> different debugging sections per object file. I wonder why this hasn't
> created problems for others before. What incorrect behavior do you
> see, i.e. what's the symptom, where do you get the crash? Can I see a
> stack trace?
> 
> Is there any way for me to reproduce this?  What are the platform and
> the target? Do you have an example program that exhibits these
> problems?

Reproducing it would be somewhat difficult.  It happened when the user
program was built with GCC 3.0 and had stabs debug info in normal
.stabs sections, and the C library (and specifically crt*.o) were built
by GCC 2.95 and an early binutils, and so had .mdedug sections.  I can
easily reproduce the other two crashes that I've submitted patches for,
but not this one.  There's also no useful backtrace; global_psymbol
gets corrupted when init_psymbol_list is called, and then a later
attempt to access a global symbol from crtbegin.o causes the crash.

The reason it doesn't seem to have caused problems before is that most
other symbol readers have a rough idea of how many symbols there will
be, and call init_psymbol_list with some non-zero value.  This
initializes both global and static sizes, and so the old check prevents
us from re-calling init_psymbol_lists, at a cost of some waste of space
(there seem to be substantially fewer static than global psymbols in
most of the tests I tried).

mdebugread fills in only a few (11, I believe) global symbols from
crtbegin.o and no static symbols.  Then when we go into
dbx_symfile_read, we lose.

Does that make sense?

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer


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

* Re: [rfa] eliminate some annoying mdebug-related symtab crashes
  2001-07-20 15:47   ` Daniel Jacobowitz
@ 2001-07-20 18:25     ` Elena Zannoni
  2001-07-20 18:31       ` Daniel Jacobowitz
  2001-07-23 23:54       ` Daniel Jacobowitz
  0 siblings, 2 replies; 5+ messages in thread
From: Elena Zannoni @ 2001-07-20 18:25 UTC (permalink / raw)
  To: Daniel Jacobowitz; +Cc: gdb-patches

Daniel Jacobowitz writes:
 > On Fri, Jul 20, 2001 at 07:27:12PM -0400, Elena Zannoni wrote:
 > > 
 > > Daniel Jacobowitz writes:
 > >  > I'm really looking forward to getting away from mdebug and back to straight
 > >  > ELF stabs, but I need mdebug for one last project.  This patch addresses two
 > >  > of the crashes I've been having - properly, this time.
 > >  > 
 > >  > The init_header_files fix is almost trivial, although it might be preferable
 > >  > to rename the functions now that I've had to make them non-static.  The list
 > >  > was NULL, mdebugread's psymtab_to_symtab_1 was calling dbxread's
 > >  > process_one_symbol which called add_new_header_file, and we crashed.  I'm
 > >  > not sure if the extra:
 > >  > 
 > >  > +  stabsread_new_init ();
 > >  > +  buildsym_new_init ();
 > >  > 
 > >  > is really necessary, since elfread_new_init() calls them, but analogy with
 > >  > every other existing symbol reader suggests that it is correct, or at least
 > >  > customary.
 > >  > 
 > > 
 > > Is the above another fix for the same problem you submitted in the
 > > previous patch?  If you rewrite a patch could you please withdraw the
 > > first one, so that no time goes into reviewing it?  Anyway, I consider
 > > this addressed. It occurred to me to do it this way, but I would be
 > > curious to see if the other way I suggested works as well.
 > 
 > The include files fix here is indeed for the same problem as in the
 > other patch.  I didn't withdraw the first patch because it seemed best
 > to me to fix it in both places - initialize properly, and don't die if
 > we didn't.  Defensive programming; I'm sick of GDB crashing on the
 > (admittedly somewhat bizarre) binaries I've been giving it.
 > 


Ah, that wasn't clear from the two messages.  I was more propense
towards finding a proper place for initialization. That's why I
suggested the other patch instead.


 > > The below is for another problem. They should really be two separate
 > > patches... Anyway.  For this I would be really hesitant to commit
 > 
 > Yes, you're right.  Sorry.
 > 
 > > changes to the other readers.  Unless you can show that there are no
 > > regressions. I think overall is better to leave those alone.  Even
 > > though the change seems to make sense, and the comments seem to imply
 > > that both list should be empty. But the code has been like that for ages, I
 > > just looked at the cvs repository, and it was like that already in
 > > 1995. I know this is not a real argument, but....
 > > 
 > > Can you elaborate some more on what's happening here?  Do you have 2
 > > different debug info sections, mdebug + stabs in the same object file?
 > > Do you end up with two psymtabs chains (one created by
 > > elfmdebug_build_psymtabs, the other by elfstabs_build_psymtabs)
 > > pointing to the same object file, therefore sharing the
 > > static_psymbols and global_psymbol lists? And this is why at the point
 > > of the call to init_psymbol_list from dbx_symfile_read (ultimately
 > > deriving from the call to elfstab_build_psymtabs) there is information
 > > in the psymbol lists already?  
 > > 
 > > According to elf_symfile_read there can be even more than two
 > > different debugging sections per object file. I wonder why this hasn't
 > > created problems for others before. What incorrect behavior do you
 > > see, i.e. what's the symptom, where do you get the crash? Can I see a
 > > stack trace?
 > > 
 > > Is there any way for me to reproduce this?  What are the platform and
 > > the target? Do you have an example program that exhibits these
 > > problems?
 > 
 > Reproducing it would be somewhat difficult.  It happened when the user
 > program was built with GCC 3.0 and had stabs debug info in normal
 > .stabs sections, and the C library (and specifically crt*.o) were built
 > by GCC 2.95 and an early binutils, and so had .mdedug sections.  I can
 > easily reproduce the other two crashes that I've submitted patches for,
 > but not this one.  There's also no useful backtrace; global_psymbol
 > gets corrupted when init_psymbol_list is called, and then a later
 > attempt to access a global symbol from crtbegin.o causes the crash.

I can see why, yes, there are only one static_psymbol list and one
global_psymbol list and they are all shared and manipulated by the psymtabs
builders that get called for each different debug format.
Whenever you call a psymtab builder you wipe those lists out.

 > 
 > The reason it doesn't seem to have caused problems before is that most
 > other symbol readers have a rough idea of how many symbols there will
 > be, and call init_psymbol_list with some non-zero value.  This
 > initializes both global and static sizes, and so the old check prevents
 > us from re-calling init_psymbol_lists, at a cost of some waste of space
 > (there seem to be substantially fewer static than global psymbols in
 > most of the tests I tried).
 > 

Oh dear, I feel ill. Where is the paper bag, quick!  So, the || check
before calling init_psymbol_list works if the two lists are kind of in
synch. They are grown/allocated together.  They are both zero at
start, and they get initialized both to the same size in
init_psymbol_lists.

So, in theory they are both of zero length at the same time.  Except
that in our call path to building the mdebug psymtabs, we never call
init_psymbol_lists with a real, non zero, size.  Then the two lists
get out of synch, because there is another way to grow the lists by
calling extend_psymbol_list, that just changes one list (this function
is called by add_psymbol_to_list).


 > mdebugread fills in only a few (11, I believe) global symbols from
 > crtbegin.o and no static symbols.  Then when we go into
 > dbx_symfile_read, we lose.
 > 
 > Does that make sense?

Yes, it is this line in elfread.c that sets the lists to null and their
sizes to 0.

elfread.c:599:      init_psymbol_list (objfile, 0);


Dig  dig  dig,  in  our  internal repository,  I  found  the  original
changelog entry (just missed the 10 years annyversary):

Mon Apr  8 23:57:43 1991  John Gilmore  (gnu at cygint.cygnus.com)

        * dbxread.c (dbx_symfile_read):  Initialize psymbol list if this
        is the first symbol read, even if not mainline.

I would think that extend_psymbol_list was introduced afterwards, and
this broke the logic of Gilmore's change.

So what to do?  I am kind of convinced that your patch is
correct. But..., is there any chance you can run the gdb testsuite
before and after your changes on a couple of platforms that have at
least dwarf2 and stabs debug info (I mean separately, not in the same
objfile)?

Another alternative would be to insert a call to
init_psymbol_lists(objfile, NUM_OF_SYMBOLS) somewhere in mdebugread.c.

Elena

 > -- 
 > Daniel Jacobowitz                           Carnegie Mellon University
 > MontaVista Software                         Debian GNU/Linux Developer


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

* Re: [rfa] eliminate some annoying mdebug-related symtab crashes
  2001-07-20 18:25     ` Elena Zannoni
@ 2001-07-20 18:31       ` Daniel Jacobowitz
  2001-07-23 23:54       ` Daniel Jacobowitz
  1 sibling, 0 replies; 5+ messages in thread
From: Daniel Jacobowitz @ 2001-07-20 18:31 UTC (permalink / raw)
  To: Elena Zannoni; +Cc: gdb-patches

On Fri, Jul 20, 2001 at 10:24:25PM -0400, Elena Zannoni wrote:
> Oh dear, I feel ill. Where is the paper bag, quick!  So, the || check
> before calling init_psymbol_list works if the two lists are kind of in
> synch. They are grown/allocated together.  They are both zero at
> start, and they get initialized both to the same size in
> init_psymbol_lists.

Exactly.

> Mon Apr  8 23:57:43 1991  John Gilmore  (gnu at cygint.cygnus.com)
> 
>         * dbxread.c (dbx_symfile_read):  Initialize psymbol list if this
>         is the first symbol read, even if not mainline.
> 
> I would think that extend_psymbol_list was introduced afterwards, and
> this broke the logic of Gilmore's change.
> 
> So what to do?  I am kind of convinced that your patch is
> correct. But..., is there any chance you can run the gdb testsuite
> before and after your changes on a couple of platforms that have at
> least dwarf2 and stabs debug info (I mean separately, not in the same
> objfile)?

I'll try to do this and get back to you about it next week.

> Another alternative would be to insert a call to
> init_psymbol_lists(objfile, NUM_OF_SYMBOLS) somewhere in mdebugread.c.

I didn't do that because I couldn't find a reasonable NUM_OF_SYMBOLS,
but I could just use a hardcoded guess like some of the other symbol
readers do, I suppose.  I'd rather fix it as I proposed; I'll run those
testsuites and see what I can turn up.

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer


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

* Re: [rfa] eliminate some annoying mdebug-related symtab crashes
  2001-07-20 18:25     ` Elena Zannoni
  2001-07-20 18:31       ` Daniel Jacobowitz
@ 2001-07-23 23:54       ` Daniel Jacobowitz
  1 sibling, 0 replies; 5+ messages in thread
From: Daniel Jacobowitz @ 2001-07-23 23:54 UTC (permalink / raw)
  To: Elena Zannoni; +Cc: gdb-patches

On Fri, Jul 20, 2001 at 10:24:25PM -0400, Elena Zannoni wrote:
> So what to do?  I am kind of convinced that your patch is
> correct. But..., is there any chance you can run the gdb testsuite
> before and after your changes on a couple of platforms that have at
> least dwarf2 and stabs debug info (I mean separately, not in the same
> objfile)?

I ran mipsel-linux stabs with and without, and i386-linux stabs/dwarf2
with and without.  The numbers all look in line, and no unexpected
crashes.

-- 
Daniel Jacobowitz                           Carnegie Mellon University
MontaVista Software                         Debian GNU/Linux Developer


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

end of thread, other threads:[~2001-07-23 23:54 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-07-09 15:11 [rfa] eliminate some annoying mdebug-related symtab crashes Daniel Jacobowitz
     [not found] ` <15192.48720.958756.789421@krustylu.cygnus.com>
2001-07-20 15:47   ` Daniel Jacobowitz
2001-07-20 18:25     ` Elena Zannoni
2001-07-20 18:31       ` Daniel Jacobowitz
2001-07-23 23:54       ` Daniel Jacobowitz

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