~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to bzrlib/strace.py

  • Committer: Robert Collins
  • Date: 2010-04-08 04:34:03 UTC
  • mfrom: (5138 +trunk)
  • mto: This revision was merged to the branch mainline in revision 5139.
  • Revision ID: robertc@robertcollins.net-20100408043403-56z0d07vdqrx7f3t
Update bugfix for 528114 to trunk.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007, 2009, 2010 Canonical Ltd
 
1
# Copyright (C) 2007 Canonical Ltd
2
2
#   Authors: Robert Collins <robert.collins@canonical.com>
3
3
#
4
4
# This program is free software; you can redistribute it and/or modify
23
23
import subprocess
24
24
import tempfile
25
25
 
26
 
from bzrlib import errors
27
 
 
28
 
 
29
26
# this is currently test-focused, so importing bzrlib.tests is ok. We might
30
27
# want to move feature to its own module though.
31
28
from bzrlib.tests import Feature
49
46
    # capture strace output to a file
50
47
    log_file = tempfile.NamedTemporaryFile()
51
48
    log_file_fd = log_file.fileno()
52
 
    err_file = tempfile.NamedTemporaryFile()
53
49
    pid = os.getpid()
54
50
    # start strace
55
51
    strace_cmd = ['strace', '-r', '-tt', '-p', str(pid), '-o', log_file.name]
56
52
    if follow_children:
57
53
        strace_args.append('-f')
58
 
    # need to catch both stdout and stderr to work around
59
 
    # bug 627208
60
54
    proc = subprocess.Popen(strace_cmd,
61
55
                            stdout=subprocess.PIPE,
62
 
                            stderr=err_file.fileno())
 
56
                            stderr=subprocess.STDOUT)
63
57
    # Wait for strace to attach
64
58
    attached_notice = proc.stdout.readline()
65
59
    # Run the function to strace
71
65
    log_file.seek(0)
72
66
    log = log_file.read()
73
67
    log_file.close()
74
 
    # and stderr
75
 
    err_file.seek(0)
76
 
    err_messages = err_file.read()
77
 
    err_file.close()
78
 
    # and read any errors
79
 
    if err_messages.startswith("attach: ptrace(PTRACE_ATTACH,"):
80
 
        raise StraceError(err_messages=err_messages)
81
 
    return result, StraceResult(log, err_messages)
82
 
 
83
 
 
84
 
class StraceError(errors.BzrError):
85
 
    
86
 
    _fmt = "strace failed: %(err_messages)s"
 
68
    return result, StraceResult(log)
87
69
 
88
70
 
89
71
class StraceResult(object):
90
72
    """The result of stracing a function."""
91
73
 
92
 
    def __init__(self, raw_log, err_messages):
 
74
    def __init__(self, raw_log):
93
75
        """Create a StraceResult.
94
76
 
95
77
        :param raw_log: The output that strace created.
96
78
        """
97
79
        self.raw_log = raw_log
98
 
        self.err_messages = err_messages
99
80
 
100
81
 
101
82
class _StraceFeature(Feature):