# This script parses the logcat lines produced by the Tuning Fork DebugBackend # which are base64 encoded serializations of TuningForkLogEvent protos. # Usage: # adb logcat -d | python parselogcat.py import sys import re # To generate python files from the proto files: # export TF_PROTO_DIR=../../src/tuningfork/proto/ # protoc --python_out=. -I$TF_PROTO_DIR $TF_PROTO_DIR/tuningfork.proto # protoc --python_out=. -I$TF_PROTO_DIR $TF_PROTO_DIR/tuningfork_clearcut_log.proto # export TF_DEV_PROTO_DIR=<somewhere> # protoc --python_out=. -I$TF_DEV_PROTO_DIR $TF_DEV_PROTO_DIR/dev_tuningfork.proto # 'pip install protobuf' if you get a 'No module named protobuf' error import tuningfork_clearcut_log_pb2 as tcl import dev_tuningfork_pb2 as tf # Example logcat line: #11-30 15:32:22.892 13781 16553 I TuningFork.Clearcut: (TCL1/1)GgAqHAgAEgAaFgAAAAAAAAAAAAAAAAAAAAAAAAAAAEg= tflogcat_regex = r"(\S+ \S+).*TuningFork.*\(TCL(.+)/(.+)\)(.*)" def flatten(s): return ', '.join(s.strip().split('\n')) def prettyPrint(tclevent): fp =tf.FidelityParams() fp.ParseFromString(tclevent.fidelityparams) print "fidelityparams: ", flatten(str(fp)) for h in tclevent.histograms: print "histograms {" print " instrument_id: ", h.instrument_id a = tf.Annotation() a.ParseFromString(h.annotation) print " annotation: ", flatten(str(a)) for c in h.counts: print " counts: ", c print "}" ser = "" def getTCLEvent(i, n, ser_in): global ser if i==1: ser = "" ser += ser_in if i<>n: return l = tcl.TuningForkLogEvent() l.ParseFromString(ser.decode("base64")) return l def readStdin(): for logcat_lines in sys.stdin.readlines(): m = re.match(tflogcat_regex, logcat_lines) if m: subparts = m.groups() tstamp = subparts[0] tclevent = getTCLEvent(int(subparts[1]),int(subparts[2]),subparts[3]) if tclevent: prettyPrint(tclevent) def main(): readStdin() if __name__ == "__main__": main()