[MERGE] Wait for strace to attach before running the function we want to trace

Andrew Bennetts andrew at canonical.com
Wed Apr 4 02:49:01 BST 2007

Martin Pool wrote:
> This doesn't actually wait, it's just equivalent to a brief sleep.

You're quite right, I was thinking it was a pipe rather than a file.

Here's a corrected version.  I pass "-o" to strace so that it writes the trace
to a file, which means that the only traffic on stderr should be the "Process
XXXX attached" message, which is small enough we can safely call use readline to
read off the pipe in a blocking fashion.

This also has the side-effect that the temporary file being used will be visible
in "ps" output for the strace process, which is perhaps useful.

I've never actually been able to reproduce the reported race on my system, but
this change *looks* correct.  But then I thought that last time, too :)


-------------- next part --------------
# Bazaar revision bundle v0.9
# message:
#   Wait for strace to attach before running the function we want to trace.
# committer: Andrew Bennetts <andrew.bennetts at canonical.com>
# date: Wed 2007-04-04 11:42:41.947000027 +1000

=== modified file bzrlib/strace.py
--- bzrlib/strace.py
+++ bzrlib/strace.py
@@ -33,17 +33,18 @@
     :return: a tuple: function-result, a StraceResult.
     # capture strace output to a file
-    log_file = tempfile.TemporaryFile()
+    log_file = tempfile.NamedTemporaryFile()
     log_file_fd = log_file.fileno()
     pid = os.getpid()
     # start strace
     proc = subprocess.Popen(['strace',
-        '-f', '-r', '-tt', '-p', str(pid),
+        '-f', '-r', '-tt', '-p', str(pid), '-o', log_file.name
-        stderr=log_file_fd,
-        stdout=log_file_fd)
-    # TODO? confirm its started (test suite should be sufficient)
-    # (can loop on proc.pid, but that may not indicate started and attached.)
+        stdout=subprocess.PIPE,
+        stderr=subprocess.STDOUT)
+    # Wait for strace to attach
+    attached_notice = proc.stdout.readline()
+    # Run the function to strace
     result = function(*args, **kwargs)
     # stop strace
     os.kill(proc.pid, signal.SIGQUIT)

=== modified directory  // last-changed:andrew.bennetts at canonical.com-200704040
... 14241-swk0f9ec602dnezm
# revision id: andrew.bennetts at canonical.com-20070404014241-swk0f9ec602dnezm
# sha1: 2b66f47c27da96290077c194322d58be43a82e3c
# inventory sha1: 09bd382914ae9ee3c6ef6b85eef1a1a463f79440
# parent ids:
#   pqm at pqm.ubuntu.com-20070404005411-46c388fbf2acf940
# base id: pqm at pqm.ubuntu.com-20070404005411-46c388fbf2acf940
# properties:
#   branch-nick: strace-attach

More information about the bazaar mailing list