833fb13cef
Since we no longer suspend waitpid'ing tracees, we have only one case when we suspend tracee: when we pick up a new tracee created by clone/fork/vfork. Background: on some other OSes, attach to child is done this way: get fork's result (pid), loop ptrace(PTRACE_ATTACH) until you hook up new process/thread. This is ugly and not safe, but what matters for us is that it doesn't require suspending. Suspending is required on Linux only, because on Linux attach to child is done differently. On Linux, we use two methods of catching new tracee: adding CLONE_THREAD bit to syscall (if needed, we change [v]fork into clone before that), or using ptrace options. In both cases, it may be so that new tracee appears before one which created it returns from syscall. In this case, current code suspends new tracee until its creator returns. Only then strace can determine who is its parent (it needs child's pid for this, which is visible in parent's [v]fork/clone result). This is inherently racy. For example, what if SIGKILL kills creator after it succeeded creating child, but before it returns? Looks like we will have child suspended forever. But after previous commit, we DO NOT NEED parent<->child link for anything. Therefore we do not need suspending too. Bingo! This patch removes suspending code. Now new tracees will be continued right away. Next patch will remove tcp->parent member. * defs.h: Remove TCB_SUSPENDED constant * process.c (handle_new_child): Delete this function. (internal_fork): Do not call handle_new_child on syscall exit. * strace.c (handle_ptrace_event): Delete this function. (trace): Do not suspend new child; remove all handling of now impossible TCB_SUSPENDED condition. Signed-off-by: Denys Vlasenko <dvlasenk@redhat.com> |
||
---|---|---|
debian | ||
freebsd | ||
linux | ||
m4 | ||
sunos4 | ||
svr4 | ||
test | ||
tests | ||
.gitignore | ||
.mailmap | ||
AUTHORS | ||
bjm.c | ||
block.c | ||
ChangeLog-CVS | ||
configure.ac | ||
COPYRIGHT | ||
count.c | ||
CREDITS.in | ||
defs.h | ||
desc.c | ||
errnoent.sh | ||
file.c | ||
git-set-file-times | ||
gitlog-to-changelog | ||
HACKING-scripts | ||
INSTALL | ||
io.c | ||
ioctl.c | ||
ioctlsort.c | ||
ipc.c | ||
make-dist | ||
Makefile.am | ||
mem.c | ||
net.c | ||
NEWS | ||
pathtrace.c | ||
PORTING | ||
proc.c | ||
process.c | ||
quota.c | ||
README | ||
README-freebsd | ||
README-hacking | ||
README-linux | ||
README-sunos4 | ||
README-svr4 | ||
resource.c | ||
scsi.c | ||
signal.c | ||
signalent.sh | ||
sock.c | ||
strace-graph | ||
strace.1 | ||
strace.c | ||
strace.spec | ||
stream.c | ||
syscall.c | ||
syscallent.sh | ||
system.c | ||
term.c | ||
time.c | ||
TODO | ||
util.c | ||
xlate.el |
This is strace 4.0, a system call tracer for SunOS 4.x, Linux, System V release 4, Solaris 2.x and Irix 5.x. strace is released under a Berkeley-style license at the request of Paul Kranenburg; see the file COPYRIGHT for details. Read the INSTALL file for generic instructions on how to install strace. If configure cannot guess your system configuration, you can specify it on the command line after the other options like this: ./configure --prefix=/usr i486-linux A single sunos4.1 binary should work on all the sun4, sun4c and sun4m kernel architectures. Let me know if sun4d doesn't work. Other i486-*-sysv4 systems may work with little or no tweaking. See the file NEWS for information on what has changed in recent versions. See the file PORTING if you like strace but it doesn't work on an operating system you use frequently. See the file CREDITS to see who has contributed to strace. See the file TODO if you feel like helping out. You can get the latest version of strace from its homepage at http://sourceforge.net/projects/strace/ . Please send bug reports and enhancements to the strace mailinglist at strace-devel@lists.sourceforge.net, or directly to Wichert Akkerman <wakkerma@debian.org>