This is the mail archive of the gcc-bugs@gcc.gnu.org mailing list for the GCC 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]

Re: c++/1141: cannot print local variables in (some) constructor functions


On Thu, Mar 13, 2003 at 04:42:00PM -0000, germain at cs dot utah dot edu wrote:
> 
> >Number:         1141
> >Category:       c++
> >Synopsis:       cannot print local variables in (some) constructor functions
> >Confidential:   no
> >Severity:       serious
> >Priority:       high
> >Responsible:    unassigned
> >State:          open
> >Class:          change-request
> >Submitter-Id:   net
> >Arrival-Date:   Thu Mar 13 16:48:00 UTC 2003
> >Closed-Date:
> >Last-Modified:
> >Originator:     germain at cs dot utah dot edu
> >Release:        gdb 5.3 (gcc 3.2.(1 or 2))
> >Organization:
> >Environment:
> Linux juggler 2.4.18-17.7.xsmp #1 SMP Tue Oct 8 12:37:04 EDT 2002 i686 unknown
> >Description:
> I'm having a problem with the gdb (5.3) debugger being able to
> tell me the value of local variables in a class function.
> I'm compiling with g++ 3.2.1.
> 
> Here is the code:
> 
>  class ABC 
>  {
>    public:
>      ABC(double x);
>      ABC(int x)
>        {
>   int temp = x;
>   x_ = temp;
>        }
>      int x_;
>  };
>  
>  ABC::ABC(double x)
>    {
>      double temp = x;
>      x_ = temp;
>    }
>  
>  int main(int argc, char* argv[])
>  {
>    ABC abc(1.0);
>    ABC def(1);
>  }
> 
> 
> 
>         % g++ -g test.cpp -o test
> 
>  
> the problem is that when i step into the constructor taking a double,
> I cannot print the temp variable ("No symbol "temp" in current
> context."  When i step into the int (inlined) constructor, I can print
> the temp variable. 
> 
>  
>  (gdb) break main
>  (gdb) run
>  Starting program: /home/germain/PETE/jim 
>  Breakpoint 1, main (argc=1, argv=0xbffff514) at test.cpp:24
>  (gdb) s
>  ABC (this=0xbffff4a4, x=1) at test.cpp:18
>  (gdb) p temp
>  No symbol "temp" in current context.
>  (gdb) fin
>  Run till exit from #0  ABC (this=0xbffff4a4, x=1) at test.cpp:18
>  main (argc=1, argv=0xbffff514) at test.cpp:25
>  (gdb) s
>  ABC (this=0xbffff4a0, x=1) at test.cpp:10
>  (gdb) p temp
>  $1 = 1072693248
>  (gdb) 
> 
> I do not think this is a case of the compiler optimizing the
> variable away, (no optimization flags are used...) and if it
> is, then it shouldn't be (IMO).
> 
> any help would be appreciated

Thanks for the great bug report.  Unfortunately, this is a GCC bug
rather than a GDB bug.  Here's the affected debug info.  First, for one
copy of the constructor:
 <1><f3>: Abbrev Number: 20 (DW_TAG_subprogram)
     DW_AT_sibling     : <129>  
     DW_AT_abstract_origin: <c2>        
     DW_AT_low_pc      : 0x80483d0 134513616    
     DW_AT_high_pc     : 0x8048401 134513665
     DW_AT_frame_base  : 1 byte block: 55       (DW_OP_reg5; )
 <2><106>: Abbrev Number: 21 (DW_TAG_formal_parameter)
     DW_AT_abstract_origin: <cd>
     DW_AT_location    : 2 byte block: 91 8     (DW_OP_fbreg: 8; )
 <2><10e>: Abbrev Number: 21 (DW_TAG_formal_parameter)
     DW_AT_abstract_origin: <d7>
     DW_AT_location    : 2 byte block: 91 78    (DW_OP_fbreg: -8; )
 <2><116>: Abbrev Number: 22 (DW_TAG_lexical_block)
     DW_AT_low_pc      : 0x80483dc 134513628
     DW_AT_high_pc     : 0x8048401 134513665
 <3><11f>: Abbrev Number: 23 (DW_TAG_variable)
     DW_AT_abstract_origin: <e1>
     DW_AT_location    : 2 byte block: 91 70    (DW_OP_fbreg: -16; )

Then for the other, the one you're actually using:
 <1><129>: Abbrev Number: 20 (DW_TAG_subprogram)
     DW_AT_sibling     : <15c>
     DW_AT_abstract_origin: <c2>
     DW_AT_low_pc      : 0x8048402 134513666
     DW_AT_high_pc     : 0x8048433 134513715
     DW_AT_frame_base  : 1 byte block: 55       (DW_OP_reg5; )
 <2><13c>: Abbrev Number: 21 (DW_TAG_formal_parameter)
     DW_AT_abstract_origin: <cd>
     DW_AT_location    : 2 byte block: 91 8     (DW_OP_fbreg: 8; )
 <2><144>: Abbrev Number: 21 (DW_TAG_formal_parameter)
     DW_AT_abstract_origin: <d7>
     DW_AT_location    : 2 byte block: 91 78    (DW_OP_fbreg: -8; )
 <2><14c>: Abbrev Number: 22 (DW_TAG_lexical_block)
     DW_AT_low_pc      : 0x804840e 134513678
     DW_AT_high_pc     : 0x8048433 134513715
 <3><155>: Abbrev Number: 24 (DW_TAG_variable)
     DW_AT_abstract_origin: <e1>


Note that the last DW_TAG_variable is missing a DW_AT_location. 
Without that GDB can't find the variable.  I've reproduced this in both
GCC 3.2 and GCC 3.4; someone on the GCC side will have to look at it.

-- 
Daniel Jacobowitz
MontaVista Software                         Debian GNU/Linux Developer


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