From: Michael Elizabeth Chastain <mec@shout.net>
To: fredrik@dolda2000.cjb.net, gdb@sources.redhat.com
Subject: Re: Checking function calls
Date: Wed, 04 Dec 2002 20:51:00 -0000 [thread overview]
Message-ID: <200212050451.gB54ppB31800@duracef.shout.net> (raw)
Hi Fredrik,
I'm throwing out a bunch of ideas here, take whatever looks useful
and discard the rest.
> Therefore, the failure has to be that a called
> function doesn't restore EBX correctly, on rare occasions, right?
I have seen this happen in a mixed programming environment,
with a Cygwin program that used a Windows DLL. The Windows DLL
had subtly different calling conventions where it did not preserve
%ebx, %esi, and %edi across function calls. Perhaps you have some
kind of third party library in your program which has a similar
compatibilty issue?
> My question is thus: Is there any way of debugging this with GDB? Can I
> make GDB check that EBX is the same before and after every function call
> from that frame in this thread to isolate the failing function? The
> frame never exits (until the program exits, that is), if that helps.
You could set a bunch of conditional breakpoints with "break if %ebx !=
saved_ebx", where you add code to your program to initialize saved_ebx.
Or you could say "break if %ebx < 0x1000" or some convenient constant.
You could also try forcing your variable to be on the stack instead of a
register. Remove the "register" attribute from the declaration of "next"
if you have one. Then add a "do_nothing(&next)" call to your function,
to force "next" to be on the stack instead of in a register. If the
symptoms go away then it's more likely to really be a register clobber.
If the symptoms remain then it's more likely to be a memory clobber
(or you have a really sick low-level function that clobbers random words
on the stack but this does not feel like it).
> At first I was expecting that another thread somehow gets there and
> modifies the storage memory of next.
I still suspect this. It's more likely that memory gets clobbered rather
than a register value.
Perhaps you need a function that locks the whole list and walks it for
a sanity check, without deleting anything?
Here is another wild lead: if, somehow, a block gets freed and then
you read it, many implementations of malloc keep housekeeping information
in the first word or two of a freed block. That would explain why the
value is always 0x10 to 0x30 (that could be block size, especially if it is
rounded up to a multiple of 4 or 8) and why only 1-2 words are clobbered.
If you manage your blocks with malloc/free, you could try turning on any
malloc debugging facilities that you have.
Hope this helps,
Michael C
next reply other threads:[~2002-12-05 4:51 UTC|newest]
Thread overview: 6+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-12-04 20:51 Michael Elizabeth Chastain [this message]
2002-12-05 15:14 ` Fredrik Tolf
-- strict thread matches above, loose matches on Subject: below --
2002-12-06 9:08 Michael Elizabeth Chastain
2002-12-06 11:31 ` Fredrik Tolf
[not found] <200212052240.gB5Mefm16249@duracef.shout.net>
2002-12-06 8:24 ` Fredrik Tolf
2002-12-04 18:02 Fredrik Tolf
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=200212050451.gB54ppB31800@duracef.shout.net \
--to=mec@shout.net \
--cc=fredrik@dolda2000.cjb.net \
--cc=gdb@sources.redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox