Date: Fri, 6 Feb 1998 21:27:45 -0800 (PST) Message-Id: <199802070527.VAA19144@adit.ap.net> Mime-Version: 1.0 Content-Type: text/plain; charset="us-ascii" To: cterry AT plinet DOT com, djgpp AT delorie DOT com From: Nate Eldredge Subject: Re: Seg fault Precedence: bulk At 08:16 2/5/1998 -0800, Charles Terry wrote: >David Mikesell wrote: >> >> ...I'm also using Allegro 3.0 >> >> > >> > I'm using djgpp 2.01 on dos 6.22 and am trying to work through >> > a particularly nasty seg fault bug. I will purposely keep >> > the problem statement general here, but will be happy to >> > drill down to the source if nobody can point me in the right >> > direction to begin looking. >> > >> > I get the seg fault immediately after returning from a function >> > that allocates memory...I can't seem to narrow the bug down to >> > an offending pointer reference or a free() of a NULL pointer, etc. >> > None of the malloc()'s returns a NULL pointer. Any ideas >> > on where to start looking? >> > >> > -- >If you crash on a return from malloc chances are that malloc is >overwriting the stack. This situation can occcur when another part of >your own code overwrits part of mallocs internal tables. Its a tough >bug because the overwrite could have happend somewhere that seems >totally unrelated. >My own solution to this was to get the malloc source and compile it with >debugging on. Then step through it at the point of the error and check >the "bucket" it uses for not pointer type values. Then get the address >of the corupted value and put a watch on it and restart and step thru >the program again watching fo when the pointer is overwritten. >Sorry for such a complex answer but hope it helps. Incidentally, if you do this, you can also compile `malloc' with `RCHECK' defined. This includes some sanity checking in `malloc'/`free', like magic number that verify the pointer you `free' was `malloc'ed, and that you haven't overwritten its bounds. There are various packages which replace/wrap `malloc' and check for such errors, as well as others. One is called Fortify. Nate Eldredge eldredge AT ap DOT net