From: John Fodor <john_fodor@mac.com>
To: gdb@sourceware.org
Subject: gdb and multi-threaded (NPTL) programs
Date: Fri, 24 Mar 2006 20:24:00 -0000 [thread overview]
Message-ID: <44244F1F.6030108@mac.com> (raw)
Hi Folks,
A colleague had trouble debugging a multi-threaded (NPTL) program using
GDB. To see what was going on, I created a purely artificial program
where 2 POSIX threads synchronize their execution using semaphores.
While single-stepping one thread, the other thread gets an EINTR error
from sem_wait. After looking at info gdb (related to threads) I got my
answer:
"There is an unfortunate side effect. If one thread stops for a
breakpoint, or for some other reason, and another thread is blocked in a
system call, then the system call may return prematurely. This is a
consequence of the interaction between multiple threads and the signals
that GDB uses to implement breakpoints and other events that stop
execution.
To handle this problem, your program should check the return value of
each system call and react appropriately. This is good programming
style anyways. For example, do not write code like this:
sleep (10);
The call to `sleep' will return early if a different thread stops at
a breakpoint or for some other reason. Instead, write this:
int unslept = 10;
while (unslept > 0)
unslept = sleep (unslept);
A system call is allowed to return early, so the system is still
conforming to its specification. But GDB does cause your
multi-threaded program to behave differently than it would without GDB."
Hmmm... so people who use POSIX threads have to put every syscall into a
loop, ignoring EINTR? What if it's a real timeout? Sorry this does not
seem reasonable to me.
Will there be a fix in the future to this unfortunate side-effect? How
do NPTL programmers single-step their programs today? Using syscalls in
loops? Using a different debugger?
Thanks for you help.
John
next reply other threads:[~2006-03-24 19:58 UTC|newest]
Thread overview: 11+ messages / expand[flat|nested] mbox.gz Atom feed top
2006-03-24 20:24 John Fodor [this message]
2006-03-24 20:27 ` Daniel Jacobowitz
2006-03-24 20:52 ` John Fodor
2006-03-24 21:07 ` Daniel Jacobowitz
2006-03-24 20:40 ` Andreas Schwab
2006-03-24 20:45 ` Eric Desjardins
2006-03-24 20:47 ` Andreas Schwab
2006-03-24 21:15 ` John Fodor
2006-03-24 21:21 ` Andreas Schwab
2006-03-28 9:33 ` Jim Blandy
2006-03-28 10:43 ` Daniel Jacobowitz
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=44244F1F.6030108@mac.com \
--to=john_fodor@mac.com \
--cc=gdb@sourceware.org \
/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