This is the mail archive of the gcc-help@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: STRANGE GLibC Problems


If you don't want to learn a new utility, something I like to do in
situations like this, is rather than using malloc/realloc straight I
use the macros below. Actually, I just used this on monday to find why
I was getting the error you got. Turns out it was the pointer had been
moved away from the initial allocated space and into the middle of the
array that I had allocated, and I didn't take that into account before
I called free().

#ifdef DEBUG_MEMORY
#include <stdio.h>

#define malloc_info( Y, X ) \
  (Y) = malloc(X);
  fprintf(stderr, "Memory allocated at position 0x%08X @ %s :: %d\n",
(Y), __FILE__, __LINE__);
#endif

#define realloc_info( X, Y, X ) \
  (X) = realloc(Y, X);
  fprintf(stderr, "Memory reallocation at position 0x%08X (now at
position 0x%08X) @ %s :: %d\n", (Y), (X), __FILE__, __LINE__);
#endif

#define free_info( X ) \
  fprintf(stderr, "Memory freed at position 0x%08X @ %s :: %d\n", (X),
__FILE__, __LINE__);
  free(X);
#endif

#else

#define malloc_info( Y, X ) \
  (Y) = malloc(X);
#endif

#define realloc_info( X, Y, X ) \
  (X) = realloc(Y, X);
#endif

#define free_info( X ) \
  free(X);
#endif

#endif



However, in larger programs, this could be quite a nightmare with lots
of output, or if you cannot use console IO on your program. A friend
of mine strongly recommends that valgrind environment, so I suspect it
is strongly worth looking into.

-Jim

On 3/8/06, Digvijoy Chatterjee <digvijoy_chatterjee@infosys.com> wrote:
>
> I had a similar problem once ,and valgrind is worth a try , if Mike
> hasn't done it already.
>
> --
> Thanks and Regards
> Digvijoy Chatterjee
>
>
> On Tue, 2006-03-07 at 08:55 -0800, Brian Budge wrote:
> > Hi Mike -
> >
> > Memory problems can definitely be strange.  This is because it can be
> > the case that your mistake and the error can seem to have very little
> > in common either spatially and/or temporally.
> >
> > I suggest you look for any cases where you might possibly be
> > overrunning an array or accessing memory outide of a structure, etc...
> >  What happens is that malloc returns a chunk of memory with special
> > data at the front of it, so that when free is called, free can delete
> > the appropriate memory.
> >
> > It seems like what may have happened is that this special chunk has
> > been trampled, so it doesn't agree with what glibc thinks it should
> > be.
> >
> > Good luck!  Memory is hard to debug :(
> >
> >   Brian
> >
> > On 3/7/06, Mike McWilliam <pilot.mm@gmail.com> wrote:
> > > Hello There
> > >
> > >          I have some problems with some C++ code and the g++ compiler.
> > > I have two Suse Linux machines running on two different computers let
> > > me give you the info for each one
> > >
> > > Machine One
> > > --------------------------
> > > OS:               SuSE 10.0
> > > Arcitecture:     AMD Athlon 64 2200
> > > RAM:             512 MB
> > > Motherboard:  Asus K8E SE
> > > G++ Version: 4.0.2
> > > GNU GLibC:   2.3.5-40
> > >
> > > Machine Two
> > > --------------------------
> > > OS:               SuSE 10.0
> > > Arcitecture:     Intel Pentium IV 2.4 GHz
> > > RAM:             512 MB
> > > Motherboard:  ???
> > > G++ Version:  4.0.2
> > > GNU GLibC:   2.3.5-40
> > >
> > >          Identical SW platform, however one uses the 64 bt
> > > architecture. So some HW differences. Now the problem was that the
> > > Code was developed on Machine one and ran with no problems. However
> > > when it is ran on machine Two I get the following error very early in
> > > the code:
> > >
> > > *** glibc detected *** free(): invalid next size (normal): 0x080da638 ***
> > > Aborted
> > >
> > >          I can't seem to find the offending pointer 0x080da638. Memory
> > > leaks and array out of bound errors should not be there since it
> > > worked on Machine One. I've combed through my code several times to
> > > find something. Yet I get nothing. Could you help me out on where I
> > > can go to solve this problem. I would like code from machine one to
> > > work on machine two for obvious reasons. Thanks for any help you have
> > > to offer.
> > >
> > > Mike
> > >
>
>
>
> **************** CAUTION - Disclaimer *****************
> This e-mail contains PRIVILEGED AND CONFIDENTIAL INFORMATION intended solely for the use of the addressee(s). If you are not the intended recipient, please notify the sender by e-mail and delete the original message. Further, you are not to copy, disclose, or distribute this e-mail or its contents to any other person and any such actions are unlawful. This e-mail may contain viruses. Infosys has taken every reasonable precaution to minimize this risk, but is not liable for any damage you may sustain as a result of any virus in this e-mail. You should carry out your own virus checks before opening the e-mail or attachment. Infosys reserves the right to monitor and review the content of all messages sent to or from this e-mail address. Messages sent to or from this e-mail address may be stored on the Infosys e-mail system.
> ***INFOSYS******** End of Disclaimer ********INFOSYS***
>


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