| Index: tools/profile_chrome/third_party/perf_to_tracing.py
|
| diff --git a/tools/profile_chrome/third_party/perf_to_tracing.py b/tools/profile_chrome/third_party/perf_to_tracing.py
|
| deleted file mode 100644
|
| index 280937a8f49b85322138931ad035bb7aebf44fea..0000000000000000000000000000000000000000
|
| --- a/tools/profile_chrome/third_party/perf_to_tracing.py
|
| +++ /dev/null
|
| @@ -1,248 +0,0 @@
|
| -# Script for converting perf script events into tracing JSON.
|
| -#
|
| -# Generated by perf script -g python
|
| -# Licensed under the terms of the GNU GPL License version 2
|
| -
|
| -import json
|
| -import os
|
| -import sys
|
| -
|
| -from collections import deque
|
| -
|
| -
|
| -# Categorize DSOs by component.
|
| -dso_to_comp = {
|
| - 'libdvm.so': 'Java',
|
| - 'libart.so': 'Java',
|
| - 'libjavacore.so': 'Java',
|
| - 'libandroid_runtime.so': 'Android',
|
| - 'libgui.so': 'Android',
|
| - 'libui.so': 'Android',
|
| - 'libbinder.so': 'Android',
|
| - 'libmemalloc.so': 'Android',
|
| - 'libcrypto.so': 'Android',
|
| - 'libcutils.so':'Android',
|
| - 'libutils.so': 'Android',
|
| - '[kernel.kallsyms]': 'Kernel',
|
| - 'libc.so': 'Standard Lib',
|
| - 'libstdc++.so': 'Standard Lib',
|
| - 'libm.so':'Standard Lib',
|
| - 'libGLESv2_adreno.so': 'GPU Driver',
|
| - 'libGLESv2_adreno200.so': 'GPU Driver',
|
| - 'libq3dtools_adreno200.so': 'GPU Driver',
|
| - 'libEGL_adreno.so': 'GPU Driver',
|
| - 'libEGL_adreno200.so': 'GPU Driver',
|
| - 'libEGL.so': 'GPU Driver',
|
| - 'libgsl.so': 'GPU Driver',
|
| - 'libGLESv2.so': 'GPU Driver',
|
| - 'libsc-a3xx.so': 'GPU Driver',
|
| - 'libadreno_utils.so': 'GPU Driver',
|
| - 'eglsubAndroid.so': 'GPU Driver',
|
| - 'gralloc.msm8960.so': 'GPU Driver',
|
| - 'libadreno_utils': 'GPU Driver',
|
| - 'libGLES_mali.so': 'GPU Driver',
|
| - 'libchromeview.so': 'Chrome',
|
| - '[unknown]': '<unknown>',
|
| - '[UNKNOWN]': '<unknown>',
|
| -}
|
| -
|
| -
|
| -def FilterSymbolModule(module):
|
| - m = dso_to_comp.get(module, None)
|
| - if m:
|
| - return m
|
| - if module.find('libchrome.') == 0:
|
| - return 'Chrome'
|
| - if module.find('dalvik') >= 0 or module.find('@') >= 0:
|
| - return 'Java'
|
| - return module
|
| -
|
| -
|
| -def FilterSymbolName(module, orign_module, name):
|
| - if module == 'Java':
|
| - return name
|
| - elif module == 'GPU Driver':
|
| - return name
|
| - if name == '':
|
| - return orign_module + ':unknown'
|
| - if name[0].isdigit() or name == '(nil)':
|
| - return orign_module + ':unknown'
|
| - return name
|
| -
|
| -
|
| -class StackFrameNode:
|
| - def __init__(self, stack_id, name, category):
|
| - self.stack_id = stack_id
|
| - self.parent_id = 0
|
| - self.children = {}
|
| - self.category = category
|
| - self.name = name
|
| - self.samples = []
|
| - self.total_weight = 0.0
|
| - self.have_total_weight = False
|
| - self.parent = None
|
| -
|
| - def ToDict(self, out_dict):
|
| - if self.stack_id:
|
| - node_dict = {}
|
| - node_dict['name'] = self.name
|
| - node_dict['category'] = self.category
|
| - if self.parent_id:
|
| - node_dict['parent'] = self.parent_id
|
| -
|
| - out_dict[self.stack_id] = node_dict
|
| -
|
| - for child in self.children.values():
|
| - child.ToDict(out_dict)
|
| - return out_dict
|
| -
|
| - def GetTotalWeight(self):
|
| - if self.have_total_weight:
|
| - return self.total_weight
|
| - else:
|
| - # Sum up self samples weight, and children's total weights.
|
| - for s in self.samples:
|
| - self.total_weight += s.weight
|
| - for c in self.children.values():
|
| - self.total_weight += c.GetTotalWeight()
|
| - self.have_total_weight = True
|
| - return self.total_weight
|
| -
|
| -
|
| -class PerfSample:
|
| - def __init__(self, stack_id, ts, cpu, tid, weight, samp_type, comm):
|
| - self.stack_id = stack_id
|
| - self.ts = ts
|
| - self.cpu = cpu
|
| - self.tid = tid
|
| - self.weight = weight
|
| - self.type = samp_type
|
| - self.comm = comm
|
| -
|
| - def ToDict(self):
|
| - ret = {}
|
| - ret['ts'] = self.ts / 1000.0 # Timestamp in microseconds
|
| - ret['tid'] = self.tid # Thread id
|
| - ret['cpu'] = self.cpu # Sampled CPU
|
| - ret['weight'] = self.weight # Sample weight
|
| - ret['name'] = self.type # Sample type
|
| - ret['comm'] = self.comm # Sample type
|
| - assert self.stack_id != 0
|
| - if self.stack_id:
|
| - ret['sf'] = self.stack_id # Stack frame id
|
| - return ret
|
| -
|
| -
|
| -samples = []
|
| -root_chain = StackFrameNode(0, 'root', '[unknown]')
|
| -next_stack_id = 1
|
| -tot_period = 0
|
| -saved_period = 0
|
| -
|
| -
|
| -def process_event(param_dict):
|
| - global next_stack_id
|
| - global saved_period
|
| - global tot_period
|
| -
|
| - samp_comm = param_dict['comm']
|
| - samp_tid = param_dict['tid']
|
| - samp_cpu = param_dict['cpu']
|
| - samp_ts = param_dict['time']
|
| - samp_period = param_dict['period']
|
| - samp_type = param_dict['ev_name']
|
| - tot_period += samp_period
|
| -
|
| - # Parse call chain.
|
| - seen_syms = set()
|
| - chain = deque()
|
| - for cs in param_dict['cs']:
|
| - cs_name = cs[0]
|
| - cs_dso = os.path.basename(cs[1])
|
| - cs_category = FilterSymbolModule(cs_dso)
|
| - cs_name = FilterSymbolName(cs_category, cs_dso, cs_name)
|
| -
|
| - if cs_category != '<unknown>' or len(chain) == 0:
|
| - sym = (cs_name, cs_category)
|
| - if sym in seen_syms:
|
| - while chain[0] != sym:
|
| - seen_syms.remove(chain[0])
|
| - chain.popleft()
|
| - else:
|
| - seen_syms.add(sym)
|
| - chain.appendleft(sym)
|
| -
|
| - # Discard garbage stacktrace before __pthread_start()
|
| - if cs_name == '__pthread_start(void*)':
|
| - break
|
| -
|
| - # Done reading call chain. Add to stack frame tree.
|
| - stack_frame = root_chain
|
| - for call in chain:
|
| - if call in stack_frame.children:
|
| - stack_frame = stack_frame.children[call]
|
| - else:
|
| - new_node = StackFrameNode(next_stack_id, call[0], call[1])
|
| - next_stack_id += 1
|
| - new_node.parent_id = stack_frame.stack_id
|
| - stack_frame.children[call] = new_node
|
| - stack_frame = new_node
|
| -
|
| - # Save sample.
|
| - sample = PerfSample(stack_frame.stack_id,
|
| - samp_ts,
|
| - samp_cpu,
|
| - samp_tid,
|
| - samp_period,
|
| - samp_type,
|
| - samp_comm)
|
| - samples.append(sample)
|
| - stack_frame.samples.append(sample)
|
| - saved_period += samp_period
|
| -
|
| -
|
| -def trace_begin():
|
| - pass
|
| -
|
| -
|
| -def trace_end():
|
| - # Return siblings of a call tree node.
|
| - def GetNodeSiblings(node):
|
| - if not node:
|
| - return []
|
| - if not node.parent:
|
| - return []
|
| - return node.parent.children.values()
|
| -
|
| - # Try to reduce misplaced stack leaves by moving them up into sibling nodes.
|
| - def FixCallTree(node, parent):
|
| - # Get siblings of node's parent.
|
| - node.parent = parent
|
| - parent_siblings = GetNodeSiblings(parent)
|
| -
|
| - # If parent's sibling has same node name, has no children and small weight,
|
| - # transplant sibling's samples into the current node.
|
| - for sibling in parent_siblings:
|
| - if sibling.name == node.name and \
|
| - len(sibling.children) == 0 and \
|
| - sibling.GetTotalWeight() <= node.GetTotalWeight() * 0.15:
|
| -
|
| - # Transplant samples from sibling to current node.
|
| - for samp in sibling.samples:
|
| - samp.stack_id = node.stack_id
|
| - node.samples.append(samp)
|
| - sibling.samples = []
|
| - break
|
| -
|
| - # Recurse child nodes.
|
| - for c in node.children.values():
|
| - FixCallTree(c, node)
|
| -
|
| - FixCallTree(root_chain, None)
|
| -
|
| - trace_dict = {}
|
| - trace_dict['samples'] = [s.ToDict() for s in samples]
|
| - trace_dict['stackFrames'] = root_chain.ToDict({})
|
| - trace_dict['traceEvents'] = []
|
| -
|
| - json.dump(trace_dict, sys.stdout, indent=1)
|
|
|