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


At 03:36 PM 6/1/01 -0500, 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;
>
>

Excellent!  Exactly right -- gdb can't find line numbers for *some*
functions.  I still need to figure out how to create a gdb-friendly
executable.  You guys are awesome.  Thank you!!

-- Charlie Mills
   cmills@synopsys.com   ..work
   mills@q7.com          ..personal
   (503)748-2665         ..at work today


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