1#!/usr/bin/python2.4 -E 2 3import os 4import re 5import sys 6 7def PrintUsage(): 8 print "Usage:" + sys.argv[0] + " [-s serial_number] [-r] dir" 9 print " serial_number: the device being profiled" 10 print " -r : reuse the directory if it already exists" 11 print " dir: directory on the host to store profile results" 12 13if (len(sys.argv) > 5): 14 PrintUsage() 15 sys.exit(1) 16 17# identify 32-bit vs 64-bit platform 18stream = os.popen("uname -m") 19arch_name = stream.readline().rstrip("\n"); 20stream.close() 21 22# default path is prebuilt/linux-x86/oprofile 23# for 64-bit OS, use prebuilt/linux-x86_64/oprofile instead 24if arch_name == "x86_64": 25 arch_path = "/../../linux-x86_64/oprofile" 26else: 27 arch_path = "" 28 29try: 30 oprofile_event_dir = os.environ['OPROFILE_EVENTS_DIR'] 31except: 32 print "OPROFILE_EVENTS_DIR not set. Run \". envsetup.sh\" first" 33 sys.exit(1) 34 35argv_next = 1 36if sys.argv[1] == "-s": 37 if len(sys.argv) < 4: 38 PrintUsage() 39 sys.exit(1) 40 device = " -s %s" % sys.argv[2] 41 argv_next = argv_next + 2 42else: 43 device = "" 44 45if sys.argv[argv_next] == "-r" : 46 replace_dir = 1 47 output_dir = sys.argv[argv_next+1] 48else: 49 replace_dir = 0 50 output_dir = sys.argv[argv_next] 51 52if (os.path.exists(output_dir) and (replace_dir == 1)): 53 os.system("rm -fr " + output_dir) 54 55try: 56 os.makedirs(output_dir) 57except: 58 if os.path.exists(output_dir): 59 print "Directory already exists:", output_dir 60 print "Try \"" + sys.argv[0] + " -r " + output_dir + "\"" 61 else: 62 print "Cannot create", output_dir 63 sys.exit(1) 64 65# get the samples off the phone 66result = os.system("adb%s pull /data/oprofile/samples %s/raw_samples " 67 "> /dev/null 2>&1" % (device, output_dir)) 68if result != 0: 69 print "adb%s pull failure, exiting" % device 70 sys.exit(1) 71 72# enter the destination directory 73os.chdir(output_dir) 74 75# We need to replace the " (deleted)" part in the directory names if 76# the region is allocated through ashmem. The post-processing tool doesn't like 77# space and parentheses. 78# Rename each individual directory from the longest first 79# For example, first rename 80# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache (deleted) 81# to 82# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache (deleted)/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache 83# then to 84# raw_samples/current/{root}/dev/ashmem/dalvik-jit-code-cache/{dep}/{root}/dev/ashmem/dalvik-jit-code-cache 85deleted_pattern = re.compile(" \(deleted\)$"); 86stream = os.popen("find raw_samples -type d -name \*\ \(deleted\)\* | sort -r") 87for line in stream: 88 line = line.rstrip() 89 new_dir = deleted_pattern.sub("", line) 90 cmd = "mv " + "\"" + line + "\" \"" + new_dir + "\"" 91 os.system(cmd) 92 93# now all the sample files are on the host, we need to invoke opimport one at a 94# time to convert the content from the ARM abi to x86 ABI 95 96# break the full filename into: 97# 1: leading dir: "raw_samples" 98# 2: intermediate dirs: "/blah/blah/blah" 99# 3: filename: e.g. "CPU_CYCLES.150000.0.all.all.all" 100pattern = re.compile("(^raw_samples)(.*)/(.*)$") 101 102stream = os.popen("find raw_samples -type f -name \*all") 103for line in stream: 104 match = pattern.search(line) 105 leading_dir = match.group(1) 106 middle_part = match.group(2) 107 file_name = match.group(3) 108 109 dir = "samples" + middle_part 110 111 # if multiple events are collected the directory could have been setup 112 if not os.path.exists(dir): 113 os.makedirs(dir) 114 115 cmd = oprofile_event_dir + arch_path + "/bin/opimport -a " + \ 116 oprofile_event_dir + \ 117 "/abi/arm_abi -o samples" + middle_part + "/" + file_name + " " + line 118 os.system(cmd) 119 120stream.close() 121 122# short summary of profiling results 123os.system(oprofile_event_dir + arch_path + "/bin/opreport --session-dir=.") 124