| 431 | 1 #!/usr/bin/env python | 
|  | 2 | 
|  | 3 """ | 
|  | 4 attach strace to a process: | 
|  | 5 | 
|  | 6 624  sudo strace -p $(pidof firefox) | 
|  | 7 625  kill 6976 | 
|  | 8 626  isrunning firefox | 
|  | 9 | 
|  | 10 Optionally kill the process when detached | 
|  | 11 """ | 
|  | 12 | 
|  | 13 | 
|  | 14 import optparse | 
|  | 15 import os | 
|  | 16 import subprocess | 
|  | 17 import sys | 
|  | 18 | 
|  | 19 from subprocess import check_output | 
|  | 20 | 
|  | 21 def main(args=sys.argv[1:]): | 
|  | 22 | 
|  | 23     usage = '%prog [options] ProgramName_or_PID' | 
|  | 24     parser = optparse.OptionParser(usage=usage, description=__doc__) | 
|  | 25     parser.add_option('-k', '--kill', | 
|  | 26                       action='store_true', default=False, | 
|  | 27                       help="kill process after strace is done") | 
|  | 28     options, args = parser.parse_args(args) | 
|  | 29     if len(args) != 1: | 
|  | 30         parser.print_usage() | 
|  | 31         parser.error("Please specify program or PID to attach to") | 
|  | 32 | 
|  | 33     # get the PID | 
|  | 34     try: | 
|  | 35         pid = int(args[0]) | 
|  | 36     except ValueError: | 
|  | 37         pid = check_output(["pidof", args[0]]).strip().split() | 
|  | 38         if len(pid) > 1: | 
|  | 39             parser.error("Multiple PIDs found for %s:\n%s" % (args[0], | 
|  | 40                                                               '\n'.join(pid))) | 
|  | 41         # TODO: handle not matching case | 
|  | 42         pid = int(pid[0]) | 
|  | 43 | 
|  | 44     # invoke strace | 
|  | 45     subprocess.call(['sudo', 'strace', '-p', str(pid)]) | 
|  | 46 | 
|  | 47     # kill if specified | 
|  | 48     os.kill(pid, 9) # TODO: better than SIGKILL | 
|  | 49 | 
|  | 50 if __name__ == '__main__': | 
|  | 51     main() |