Skip to content
This repository was archived by the owner on Jan 10, 2023. It is now read-only.
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion runtool/collectors/android.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@ def detect(cls):
version = parts[parts.index('version') + 1]
systraces.append((version, adb))
if systraces:
sorted_by_version = sorted(systraces, key=lambda(ver, _): [int(item) for item in ver.split('.')], reverse=True)
sorted_by_version = sorted(systraces, key=lambda ver__: [int(item) for item in ver__[0].split('.')], reverse=True)
return '"%s"' % sorted_by_version[0][1]
else:
return None
Expand Down
12 changes: 7 additions & 5 deletions runtool/collectors/osx.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
from __future__ import print_function
import os
import sys
import shutil
import subprocess
sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '..')))
from sea_runtool import Collector, get_decoders
from python_compatibility_layer import itervalues

dtrace_context_switch = r"""

Expand Down Expand Up @@ -205,7 +207,7 @@ def __init__(self, args):
self.subcollectors = set()

decoders = get_decoders()
for decoder_group in decoders.itervalues():
for decoder_group in itervalues(decoders):
for decoder_class in decoder_group:
if any('Subcollector' in str(name) for name in decoder_class.__bases__):
self.subcollectors.add(decoder_class)
Expand All @@ -224,7 +226,7 @@ def create_ask_pass():
return path
with open(path, 'w') as file:
file.write(osxaskpass)
os.chmod(path, 0700)
os.chmod(path, 0o700)
return path

def gen_gpu_hooks(self, text): # TODO: check /System/Library/Extensions/AppleIntelSKLGraphics.kext/Contents/Info.plist
Expand Down Expand Up @@ -286,7 +288,7 @@ def find_by_content(el, content):
else:
sibling = sibling.nextSibling
if value != '0':
print "Warning: To enable Graphics profiling, set GraphicsFirmwareSelect to 0 in: %s\n\tThen: sudo kextcache -i / & reboot" % file_name
print('Warning: To enable Graphics profiling, set GraphicsFirmwareSelect to 0 in: %s\n\tThen: sudo kextcache -i / & reboot' % file_name)

@staticmethod
def gen_options(options):
Expand Down Expand Up @@ -351,7 +353,7 @@ def start(self):
def get_pid_children(parent):
(out, err) = DTraceCollector.execute('ps -o pid,ppid -ax', log=False)
if err:
print err
print(err)
return
for line in out.split('\n'):
if not line:
Expand Down Expand Up @@ -389,7 +391,7 @@ def available(cls):
return False
(out, err) = cls.execute('csrutil status')
if 'disabled' not in out:
print 'Please do: "csrutil disable" from Recovery OS terminal to be able using dtrace...'
print('Please do: "csrutil disable" from Recovery OS terminal to be able using dtrace...')
return False
return True

Expand Down
8 changes: 4 additions & 4 deletions runtool/collectors/win.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from __future__ import print_function
import os
import sys
import time
Expand All @@ -11,7 +12,6 @@
from sea_runtool import Collector, is_domain_enabled
import sea


def relog_etl(frm, to):
sea.ITT('win').relog(frm, to)

Expand Down Expand Up @@ -48,7 +48,7 @@ def detect(cls, statics={}):
break
if not res:
return None
statics['res'] = sorted(res, key=lambda(_, ver): [int(item) for item in ver.split('.')], reverse=True)[0][0]
statics['res'] = sorted(res, key=lambda __ver: [int(item) for item in __ver[1].split('.')], reverse=True)[0][0]
return statics['res']

@staticmethod
Expand Down Expand Up @@ -171,7 +171,7 @@ def stop(self, wait=True, complete=True):

(out, err) = self.execute('logman stop GPA_GPUVIEW -ets')
if err and complete:
print err
print(err)

environ = os.environ.copy()
environ['TLOG'] = 'NORMAL'
Expand All @@ -193,7 +193,7 @@ def merge(cls, gpuview, file, started, wait, args=None):
cmd = '"%s" -merge Merged.etl IntelSEAPI.etl "%s"' % (xperf, os.path.basename(file))
(out, err) = Collector.execute(cmd, cwd=started)
if err and (os.path.basename(file) not in err):
print err
print(err)
relog_etl(os.path.join(started, os.path.basename(file)), file)
shutil.rmtree(started)
else:
Expand Down
4 changes: 3 additions & 1 deletion runtool/decoders/Adreno.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
from __future__ import print_function
from python_compatibility_layer import xrange

TRACK_INDEX, TRACK_NAME = -1, 'GPU'

Expand Down Expand Up @@ -173,7 +175,7 @@ def handle_record(self, proc, pid, tid, cpu, flags, timestamp, name, args):
elif name in ['kgsl_mem_timestamp_queue', 'kgsl_mem_timestamp_free']:
pass
else:
print name
print(name)

def finalize(self):
pass
Expand Down
8 changes: 5 additions & 3 deletions runtool/decoders/MSNT_SystemTrace.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
from __future__ import print_function
import sys
import socket
from python_compatibility_layer import basestring, iteritems

def resolve_host(ip):
try:
Expand All @@ -9,7 +11,7 @@ def resolve_host(ip):

def convert_numbers(obj):
if isinstance(obj, dict):
for k, v in obj.iteritems():
for (k, v) in iteritems(obj):
obj[k] = convert_numbers(v)
elif isinstance(obj, list):
new = [convert_numbers(v) for v in obj]
Expand Down Expand Up @@ -61,7 +63,7 @@ def handle_record(self, system, data, info):
if info['Opcode'] in ['Video', 'NIC', 'PhyDisk', 'LogDisk', 'CPU', 'Platform']:
self.callbacks.add_metadata(info['Opcode'], convert_numbers(data))
elif sys.gettrace():
print 'EventName:', info['EventName'], 'Opcode:', info['Opcode']
print('EventName:', info['EventName'], 'Opcode:', info['Opcode'])

def on_receive(self, size, now, pid, source, target):
receiver = self.tcpip.setdefault(source, {'packets': [], 'started': None})
Expand Down Expand Up @@ -104,7 +106,7 @@ def end_receiver(receiver):
receiver['started'] = None

def finalize(self):
for target, receiver in self.tcpip.iteritems():
for (target, receiver) in iteritems(self.tcpip):
self.end_receiver(receiver)
packets = receiver['packets']
if packets:
Expand Down
36 changes: 19 additions & 17 deletions runtool/exporters/ChromeTracing.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from __future__ import print_function
import os
import sys
#sys.path.append(os.path.realpath(os.path.join(os.path.dirname(__file__), '..'))) # uncomment for debugging single file
Expand All @@ -10,6 +11,7 @@
import subprocess
from datetime import datetime
from sea_runtool import TaskCombiner, Progress, resolve_stack, to_hex, ProgressConst, get_importers
from python_compatibility_layer import unicode, iteritems, itervalues

MAX_GT_SIZE = 50 * 1024 * 1024
GT_FLOAT_TIME = True
Expand Down Expand Up @@ -64,7 +66,7 @@ def __init__(self, args, tree):
handled = []
for trace in self.args.trace:
if not os.path.exists(trace):
print "Error: File not found:", trace
print("Error: File not found:", trace)
continue
if trace.endswith(".etl"):
self.handle_etw_trace(trace)
Expand All @@ -79,7 +81,7 @@ def __init__(self, args, tree):
self.handle_perf(trace)
handled.append(trace)
else:
print "Error: unsupported extension:", trace
print("Error: unsupported extension:", trace)
args.trace = [trace for trace in args.trace if trace not in handled]
self.start_new_trace()

Expand All @@ -89,7 +91,7 @@ def start_new_trace(self):
self.file = codecs.open(self.targets[-1], "wb+", 'utf-8')
self.file.write('{\n"traceEvents": [\n\n') # second \n is for the rare case when there are no events, and finish cuts last two symbols

for key, value in self.tree["threads"].iteritems():
for (key, value) in iteritems(self.tree["threads"]):
pid_tid = key.split(',')
self.file.write(
'{"name": "thread_name", "ph":"M", "pid":%s, "tid":%s, "args": {"name":"%s(%s)"}},\n' % (pid_tid[0], pid_tid[1], value, pid_tid[1])
Expand Down Expand Up @@ -216,7 +218,7 @@ def calc_time_sync(time_sync, series=True):
source_scale_start = time_sync[index - 1][Source] + int(diff[Source] * 0.75) # to keep the precision
target_scale_start = (time_sync[index - 1][Target] + (diff[Target] * 0.25)) * 1000000. # multiplying by 1000000. to have time is microseconds (ftrace/target time was in seconds)

print "Timelines correlation precision is +- %f us" % (diff[Target] / 2. * 1000000.)
print("Timelines correlation precision is +- %f us" % (diff[Target] / 2. * 1000000.))
else:
source_scale_start = time_sync[0][Source]
target_scale_start = time_sync[0][Target] * 1000000. # multiplying by 1000000. to have time in microseconds (ftrace/target time was in seconds)
Expand All @@ -240,7 +242,7 @@ def global_metadata(self, data):
self.file.write(
'{"name": "process_labels", "ph":"M", "pid":%d, "tid":%s, "args": {"labels":"%s"}},\n' % (data['pid'], data['tid'], ','.join(data['labels']))
)
if data['tid'] >= 0 and not self.tree['threads'].has_key('%d,%d' % (data['pid'], data['tid'])): # marking the main thread
if data['tid'] >= 0 and ('%d,%d' % (data['pid'], data['tid'])) not in self.tree['threads']: # marking the main thread
self.file.write(
'{"name": "thread_name", "ph":"M", "pid":%d, "tid":%s, "args": {"name":"%s"}},\n' % (data['pid'], data['tid'], "<main>")
)
Expand Down Expand Up @@ -268,14 +270,14 @@ def relation(self, data, head, tail):
template = '{"ph":"%s", "name": "relation", "pid":%d, "tid":%s, "ts":%.3f, "id":%s, "args":{"name": "%s"}, "cat":"%s"},\n'
else:
template = '{"ph":"%s", "name": "relation", "pid":%d, "tid":%s, "ts":%d, "id":%s, "args":{"name": "%s"}, "cat":"%s"},\n'
if not data.has_key('str'):
if 'str' not in data:
data['str'] = "unknown"
self.file.write(template % ("s", items[0]['pid'], items[0]['tid'], self.convert_time(items[0]['time']), relation_id, data['str'], data['domain']))
self.file.write(template % ("f", items[1]['pid'], items[1]['tid'], self.convert_time(items[1]['time'] - 1), relation_id, data['str'], data['domain']))

def format_value(self, arg): # this function must add quotes if value is string, and not number/float, do this recursively for dictionary
if type(arg) == type({}):
return "{" + ", ".join(['"%s":%s' % (key, self.format_value(value)) for key, value in arg.iteritems()]) + "}"
return "{" + ", ".join(['"%s":%s' % (key, self.format_value(value)) for (key, value) in iteritems(arg)]) + "}"
try:
val = float(arg)
if float('inf') != val:
Expand All @@ -289,7 +291,7 @@ def format_value(self, arg): # this function must add quotes if value is string

def format_args(self, arg): # this function must add quotes if value is string, and not number/float, do this recursively for dictionary
if type(arg) == type({}):
return dict([(key, self.format_args(value)) for key, value in arg.iteritems()])
return dict([(key, self.format_args(value)) for (key, value) in iteritems(arg)])
try:
val = float(arg)
if float('inf') != val:
Expand All @@ -309,7 +311,7 @@ def complete_task(self, type, begin, end):
if self.last_task == (type, begin, end):
return
self.last_task = (type, begin, end)
assert (GoogleTrace.Phase.has_key(type))
assert (type in GoogleTrace.Phase)
if begin['type'] == 7: # frame_begin
if 'id' not in begin:
begin['id'] = id(begin) # Async events are groupped by cat & id
Expand All @@ -334,7 +336,7 @@ def complete_task(self, type, begin, end):
json.loads(res)
except Exception as exc:
import traceback
print "\n" + exc.message + ":\n" + res + "\n"
print("\n" + exc.message + ":\n" + res + "\n")
traceback.print_stack()
self.format_task(GoogleTrace.Phase[type], type, begin, end)
res += ',\n'
Expand Down Expand Up @@ -383,7 +385,7 @@ def format_task(self, phase, type, begin, end):
res = []
res.append('{"ph":"%s"' % phase)
res.append(', "pid":%(pid)d' % begin)
if begin.has_key('tid'):
if 'tid' in begin:
res.append(', "tid":%(tid)d' % begin)
if GT_FLOAT_TIME:
res.append(', "ts":%.3f' % (self.convert_time(begin['time'])))
Expand Down Expand Up @@ -448,7 +450,7 @@ def format_task(self, phase, type, begin, end):
total = 0
breakdown = {}
children = 0
for size, values in begin['memory'].iteritems():
for (size, values) in iteritems(begin['memory']):
if size is None: # special case for children attribution
children = values
else:
Expand All @@ -467,8 +469,8 @@ def format_task(self, phase, type, begin, end):

def handle_leftovers(self):
TaskCombiner.handle_leftovers(self)
for counters in self.counters.itervalues(): # workaround: google trace forgets counter last value
for counter in counters.itervalues():
for counters in itervalues(self.counters): # workaround: google trace forgets counter last value
for counter in itervalues(counters):
counter['time'] += 1 # so, we repeat it on the end of the trace
self.complete_task("counter", counter, counter)

Expand All @@ -481,7 +483,7 @@ def finish(self, intermediate=False):
if not intermediate:
if self.samples:
self.file.write('], "stackFrames": {\n')
for id, frame in self.frames.iteritems():
for (id, frame) in iteritems(self.frames):
self.file.write('"%s": %s,\n' % (id, json.dumps(frame)))
if self.frames: # deleting last two symbols from the file as we can't leave comma at the end due to json restrictions
self.remove_last(2)
Expand All @@ -494,7 +496,7 @@ def finish(self, intermediate=False):
self.frames = {}
if self.metadata:
self.file.write('\n],\n')
for key, value in self.metadata.iteritems():
for (key, value) in iteritems(self.metadata):
self.file.write('"%s": %s,\n' % (key, json.dumps(value[0] if len(value) == 1 else value)))
self.remove_last(2) # remove trailing ,\n
self.file.write('\n}')
Expand All @@ -516,7 +518,7 @@ def get_catapult_path(args):
return path
zip_path = os.path.join(args.bindir, 'catapult.zip')
if os.path.exists(zip_path):
print "Extracting catapult..."
print("Extracting catapult...")
from zipfile import PyZipFile
pzf = PyZipFile(zip_path)
pzf.extractall(args.bindir)
Expand Down
31 changes: 16 additions & 15 deletions runtool/exporters/QtCreatorProfiler.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
from __future__ import print_function
import cgi
from sea_runtool import TaskCombiner, get_name, to_hex

from python_compatibility_layer import iteritems
#https://github.com/danimo/qt-creator/blob/master/src/plugins/qmlprofiler/qmlprofilertracefile.cpp
#https://github.com/danimo/qt-creator/blob/master/src/plugins/qmlprofiler/qv8profilerdatamodel.cpp

Expand Down Expand Up @@ -39,7 +40,7 @@ def complete_task(self, type, begin, end):
name = get_name(begin)

details = (type + ":") if type != 'task' else ""
if begin.has_key('parent'):
if 'parent' in begin:
details += to_hex(begin['parent']) + "->"
details += name

Expand All @@ -51,15 +52,15 @@ def complete_task(self, type, begin, end):
kind = 'Javascript'

record = (
begin['__file__'].replace("\\", "/") if begin.has_key('__file__') else "",
begin['__line__'] if begin.has_key('__line__') else "0",
begin['__file__'].replace("\\", "/") if '__file__' in begin else "",
begin['__line__'] if '__line__' in begin else "0",
kind,
"%s | %s" % (details, begin['domain']),
name
)
record = tuple([cgi.escape(item) for item in record])

if self.event_map.has_key(record):
if record in self.event_map:
index = self.event_map[record]
else:
index = len(self.events)
Expand All @@ -74,9 +75,9 @@ def complete_task(self, type, begin, end):
args['value'] = begin['delta']
else: # TODO: add multi-value support
return
if begin.has_key('args'):
if 'args' in begin:
args = begin['args']
if end.has_key('args'):
if 'args' in end:
args.update(end['args'])
if args:
self.notes.append((start_time, dur, index, args))
Expand All @@ -86,20 +87,20 @@ def complete_task(self, type, begin, end):

def write_header(self):
# at this moment print is redirected to output file
print '<?xml version="1.0" encoding="UTF-8"?>'
print '<trace version="1.02" traceStart="%d" traceEnd="%d">' % (self.start_time, self.end_time)
print '<eventData totalTime="%d">' % (self.end_time - self.start_time)
print('<?xml version="1.0" encoding="UTF-8"?>')
print('<trace version="1.02" traceStart="%d" traceEnd="%d">' % (self.start_time, self.end_time))
print('<eventData totalTime="%d">' % (self.end_time - self.start_time))
counter = 0
for event in self.events:
print '<event index="%d"><filename>%s</filename><line>%s</line><type>%s</type><details>%s</details><displayname>%s</displayname></event>' \
% (counter, event[0], event[1], event[2], event[3], event[4])
print('<event index="%d"><filename>%s</filename><line>%s</line><type>%s</type><details>%s</details><displayname>%s</displayname></event>' \
% (counter, event[0], event[1], event[2], event[3], event[4]))
counter += 1
print '</eventData><profilerDataModel>'
print('</eventData><profilerDataModel>')

def write_footer(self, file):
file.write('</profilerDataModel><noteData>\n')
for note in self.notes:
args = "\n".join([str(key) + " = " + str(val).replace("{","").replace("}","") for key, val in note[3].iteritems()])
args = "\n".join([str(key) + " = " + str(val).replace("{","").replace("}","") for (key, val) in iteritems(note[3])])
file.write('<note startTime="%d" duration="%d" eventIndex="%d">%s</note>\n' % (note[0], note[1], note[2], cgi.escape(args)))
file.write('</noteData><v8profile totalTime="0"/></trace>\n')

Expand All @@ -112,7 +113,7 @@ def finish(self):
if fi.isfirstline():
self.write_header()
wrote_header = True
print line,
print(line,end=' ')
if wrote_header:
with open(self.file_name, "a") as file:
self.write_footer(file)
Expand Down
Loading