C compiler issue perhaps?

Doug Hardie bc979 at lafn.org
Mon Mar 17 05:29:41 UTC 2008


On Mar 15, 2008, at 05:59, Derek Ragona wrote:

> At 09:49 PM 3/14/2008, Doug Hardie wrote:
>
>> On Mar 14, 2008, at 18:31, Derek Ragona wrote:
>>
>>> At 06:56 PM 3/14/2008, Doug Hardie wrote:
>>>> There is no code running at that point.  Its just sitting there
>>>> waiting for me to enter a gdb command.
>>>>
>>>>
>>>> On Mar 14, 2008, at 15:16, Derek Ragona wrote:
>>>>
>>>>> At 05:10 PM 3/14/2008, Doug Hardie wrote:
>>>>>> I have a program I was testing with gdb.  I was trying to figure
>>>>>> out
>>>>>> why c.rmonths was always zero when it should have been 6.   
>>>>>> Stepped
>>>>>> through using the gdb n command.  Here is the output:
>>>>>>
>>>>>> (gdb)
>>>>>> 215                             c.rmonths = (edate - tdate) /
>>>>>> toMONTHS;
>>>>>> (gdb)
>>>>>> 223                     c.dial_in = u.dial_in[0];
>>>>>> (gdb)
>>>>>> 224                     c.dsl = u.dsl[0];
>>>>>> (gdb) p c.rmonths
>>>>>> $1 = 0
>>>>>> (gdb) p c
>>>>>> $2 = {fa = 0, pwp = 0, disp_email = 0, imonths = 0, rmonths = 6,
>>>>>>   type = 73 'I', cd = 0 '\0', dial_in = 82 'R', dsl = 0 '\0',
>>>>>>   dsl_kit = 0 '\0', ip = 0 '\0', domain = 0 '\0', n_domain = 0
>>>>>> '\0',
>>>>>>   renewal = 89 'Y', program = "I\000\000"}
>>>>>> (gdb) p c->rmonths
>>>>>> $3 = 6
>>>>>> (gdb) p c.rmonths
>>>>>> $4 = 6
>>>>>>
>>>>>>
>>>>>> Notice, the first time i print it its zero.  The second time  
>>>>>> its 6.
>>>>>> What gives here?  I have seen this before but couldn't pin it  
>>>>>> down.
>>>>>> The program is not compiled with any optimization.  It is in a
>>>>>> shared
>>>>>> library though.
>>>>>
>>>>> It is hard to tell without the code you used.  I would put some
>>>>> printf's in the code and see what and when that variable gets  
>>>>> set to
>>>>> in actual running code.
>>>>>
>>>>>         -Derek
>>>
>>> I understand it is waiting at a breakpoint in gdb.  What I meant was
>>> put printf's in your code and run the program and look at the
>>> output.  You can use fprintf's to stderr if your prefer and just
>>> look at the stderr output.
>>>
>>> It is hard to diagnose what could be a compiler error, or a coding
>>> error.  Remember in C you can do many things you really shouldn't.
>>> It is also advisable to run lint over your source code too.
>>
>> All that lint shows is it doesn't like comments using // and lots of
>> errors in /usr/include files.
>
> This sounds more like a c++ program. c++ does a lot of variable  
> initiation in code you usually won't see.
>
> If this is a c++ program, put conditional printf's or cout's in to  
> check the code at actual runtime rather than in the debugger.
>
> You may want to use asserts.

Nope.  Very simple c code.  I believe as was pointed out earlier that  
this is a gdb issue.  Once gdb found the right value, both it and all  
the printfs show the correct value.  I changed nothing.  I am a bit  
concerned since this is now in a production system that it may  
eventually start fail again which would have some serious consequences.




More information about the freebsd-questions mailing list