Home | History | Annotate | Download | only in oprofile
      1 #!/usr/bin/python2.4 -E
      2 
      3 import os
      4 import re
      5 import sys
      6 
      7 def 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 
     13 if (len(sys.argv) > 5):
     14     PrintUsage()
     15     sys.exit(1)
     16 
     17 # identify 32-bit vs 64-bit platform
     18 stream = os.popen("uname -m")
     19 arch_name = stream.readline().rstrip("\n");
     20 stream.close()
     21 
     22 # default path is prebuilt/linux-x86/oprofile
     23 # for 64-bit OS, use prebuilt/linux-x86_64/oprofile instead
     24 if arch_name == "x86_64":
     25     arch_path = "/../../linux-x86_64/oprofile"
     26 else:
     27     arch_path = ""
     28 
     29 try:
     30     oprofile_event_dir = os.environ['OPROFILE_EVENTS_DIR']
     31 except:
     32     print "OPROFILE_EVENTS_DIR not set. Run \". envsetup.sh\" first"
     33     sys.exit(1)
     34 
     35 argv_next = 1
     36 if 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
     42 else:
     43   device = ""
     44 
     45 if sys.argv[argv_next] == "-r" :
     46     replace_dir = 1
     47     output_dir = sys.argv[argv_next+1]
     48 else:
     49     replace_dir = 0
     50     output_dir = sys.argv[argv_next]
     51 
     52 if (os.path.exists(output_dir) and (replace_dir == 1)):
     53     os.system("rm -fr " + output_dir)
     54 
     55 try:
     56     os.makedirs(output_dir)
     57 except:
     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
     66 result = os.system("adb%s pull /data/oprofile/samples %s/raw_samples "
     67                    "> /dev/null 2>&1" % (device, output_dir))
     68 if result != 0:
     69     print "adb%s pull failure, exiting" % device
     70     sys.exit(1)
     71 
     72 # enter the destination directory
     73 os.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
     85 deleted_pattern = re.compile(" \(deleted\)$");
     86 stream = os.popen("find raw_samples -type d -name \*\ \(deleted\)\* | sort -r")
     87 for 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"
    100 pattern = re.compile("(^raw_samples)(.*)/(.*)$")
    101 
    102 stream = os.popen("find raw_samples -type f -name \*all")
    103 for 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 
    120 stream.close()
    121 
    122 # short summary of profiling results
    123 os.system(oprofile_event_dir + arch_path + "/bin/opreport --session-dir=.")
    124