This is the mail archive of the gdb-patches@sources.redhat.com 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]

Re: Simple but crucial bug fix to gdb


Thank you Jim.

Fernando


Jim Blandy wrote:
> 
> Charlie Mills <cmills@synopsys.com> writes:
> > Bug description:  gdb 4.xx and 5.0 crashes while reading our executable.
> > Our executable is the result of linking objects compiled by gcc with
> > other objects compiled using SPARCworks CC.  The stack trace is
> > appended at the end of this message.
> 
> I managed to construct an executable that would crash GDB in the same
> way yours did (by editing a binary to get stabs of the sort Sun's
> compiler produces).  I'm committing the patch below, which prevents
> the crashes.  It's essentially the same fix as yours, except that
> there are two cases (static and global functions) that need attention,
> not one.
> 
> I'm concerned that your builds are producing debugging entries for
> functions that appear to be outside of any compilation unit.  GDB
> doesn't really know what to do with this; at the moment, it mostly
> ignores the function's entry.  I wish I could play around with the
> situation and figure out what really needs to be done; with the
> current fix, I strongly suspect that GDB will be unable to find
> debugging information for some functions in some circumstances.  So
> that the problem doesn't disappear from view entirely, my patch makes
> GDB complain (that's a technical term) when it sees debugging info
> like that present in your executable.  Perhaps we'll find another
> case, and we'll be able to really fix the bug.
> 
> In any case, thanks for the bug report.
> 
> 2001-06-01  Jim Blandy  <jimb@redhat.com>
> 
>         * partial-stab.h: New complaint: function_outside_compilation_unit.
>         (case N_FUN: case 'f':, case N_FUN: case 'F':): If pst is zero,
>         complain, and don't try to set pst's start address.
> 
> Index: gdb/partial-stab.h
> ===================================================================
> RCS file: /cvs/src/src/gdb/partial-stab.h,v
> retrieving revision 1.9
> diff -c -r1.9 partial-stab.h
> *** gdb/partial-stab.h  2001/05/31 03:41:31     1.9
> --- gdb/partial-stab.h  2001/06/01 20:24:26
> ***************
> *** 40,45 ****
> --- 40,48 ----
> 
>   switch (CUR_SYMBOL_TYPE)
>     {
> +     static struct complaint function_outside_compilation_unit = {
> +       "function `%s' appears to be defined outside of all compilation units", 0, 0
> +     };
>       char *p;
>       /*
>        * Standard, external, non-debugger, symbols
> ***************
> *** 576,581 ****
> --- 579,592 ----
>         continue;
> 
>         case 'f':
> +         if (! pst)
> +           {
> +             int name_len = p - namestring;
> +             char *name = xmalloc (name_len + 1);
> +             memcpy (name, namestring, name_len);
> +             name[name_len] = '\0';
> +             complain (&function_outside_compilation_unit, name);
> +           }
>         CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
>   #ifdef DBXREAD_ONLY
>         /* Kludges for ELF/STABS with Sun ACC */
> ***************
> *** 600,609 ****
>            the bounds created by N_SO symbols.  If that's the case
>            use the address of this function as the low bound for
>            the partial symbol table.  */
> !       if (textlow_not_set
> !           || (pst && CUR_SYMBOL_VALUE < pst->textlow
> !               && CUR_SYMBOL_VALUE
> !               != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))))
>           {
>             pst->textlow = CUR_SYMBOL_VALUE;
>             textlow_not_set = 0;
> --- 611,622 ----
>            the bounds created by N_SO symbols.  If that's the case
>            use the address of this function as the low bound for
>            the partial symbol table.  */
> !       if (pst
> !             && (textlow_not_set
> !                 || (CUR_SYMBOL_VALUE < pst->textlow
> !                     && (CUR_SYMBOL_VALUE
> !                         != ANOFFSET (objfile->section_offsets,
> !                                      SECT_OFF_TEXT (objfile))))))
>           {
>             pst->textlow = CUR_SYMBOL_VALUE;
>             textlow_not_set = 0;
> ***************
> *** 620,625 ****
> --- 633,646 ----
>            are put into the global psymtab like one would expect.
>            They're also in the minimal symbol table.  */
>         case 'F':
> +         if (! pst)
> +           {
> +             int name_len = p - namestring;
> +             char *name = xmalloc (name_len + 1);
> +             memcpy (name, namestring, name_len);
> +             name[name_len] = '\0';
> +             complain (&function_outside_compilation_unit, name);
> +           }
>         CUR_SYMBOL_VALUE += ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile));
>   #ifdef DBXREAD_ONLY
>         /* Kludges for ELF/STABS with Sun ACC */
> ***************
> *** 647,656 ****
>            the bounds created by N_SO symbols.  If that's the case
>            use the address of this function as the low bound for
>            the partial symbol table.  */
> !       if (textlow_not_set
> !           || (pst && CUR_SYMBOL_VALUE < pst->textlow
> !               && CUR_SYMBOL_VALUE
> !               != ANOFFSET (objfile->section_offsets, SECT_OFF_TEXT (objfile))))
>           {
>             pst->textlow = CUR_SYMBOL_VALUE;
>             textlow_not_set = 0;
> --- 668,679 ----
>            the bounds created by N_SO symbols.  If that's the case
>            use the address of this function as the low bound for
>            the partial symbol table.  */
> !       if (pst
> !             && (textlow_not_set
> !                 || (CUR_SYMBOL_VALUE < pst->textlow
> !                     && (CUR_SYMBOL_VALUE
> !                         != ANOFFSET (objfile->section_offsets,
> !                                      SECT_OFF_TEXT (objfile))))))
>           {
>             pst->textlow = CUR_SYMBOL_VALUE;
>             textlow_not_set = 0;

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


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