diff --git a/scripts/simpletrace.py b/scripts/simpletrace.py index 2a977e2ab9..a3a6315055 100755 --- a/scripts/simpletrace.py +++ b/scripts/simpletrace.py @@ -97,11 +97,17 @@ def read_trace_header(fobj): raise ValueError('Log format %d not supported with this QEMU release!' % log_version) -def read_trace_records(edict, fobj): - """Deserialize trace records from a file, yielding record tuples (event_num, timestamp, pid, arg1, ..., arg6).""" - idtoname = { - dropped_event_id: "dropped" - } +def read_trace_records(edict, idtoname, fobj): + """Deserialize trace records from a file, yielding record tuples (event_num, timestamp, pid, arg1, ..., arg6). + + Note that `idtoname` is modified if the file contains mapping records. + + Args: + edict (str -> Event): events dict, indexed by name + idtoname (int -> str): event names dict, indexed by event ID + fobj (file): input file + + """ while True: t = fobj.read(8) if len(t) == 0: @@ -171,10 +177,16 @@ def process(events, log, analyzer, read_header=True): dropped_event = Event.build("Dropped_Event(uint64_t num_events_dropped)") edict = {"dropped": dropped_event} + idtoname = {dropped_event_id: "dropped"} for event in events: edict[event.name] = event + # If there is no header assume event ID mapping matches events list + if not read_header: + for event_id, event in enumerate(events): + idtoname[event_id] = event.name + def build_fn(analyzer, event): if isinstance(event, str): return analyzer.catchall @@ -197,7 +209,7 @@ def process(events, log, analyzer, read_header=True): analyzer.begin() fn_cache = {} - for rec in read_trace_records(edict, log): + for rec in read_trace_records(edict, idtoname, log): event_num = rec[0] event = edict[event_num] if event_num not in fn_cache: diff --git a/scripts/tracetool/format/simpletrace_stap.py b/scripts/tracetool/format/simpletrace_stap.py index 144b704bcd..e7e44842ca 100644 --- a/scripts/tracetool/format/simpletrace_stap.py +++ b/scripts/tracetool/format/simpletrace_stap.py @@ -22,33 +22,8 @@ def global_var_name(name): return probeprefix().replace(".", "_") + "_" + name def generate(events, backend, group): - id_map = global_var_name("event_name_to_id_map") - next_id = global_var_name("event_next_id") - map_func = global_var_name("simple_trace_map_event") out('/* This file is autogenerated by tracetool, do not edit. */', - '', - 'global %(id_map)s', - 'global %(next_id)s', - 'function %(map_func)s(name)', - '', - '{', - ' if (!([name] in %(id_map)s)) {', - ' %(id_map)s[name] = %(next_id)s', - ' name_len = strlen(name)', - ' printf("%%8b%%8b%%4b%%.*s", 0, ', - ' %(next_id)s, name_len, name_len, name)', - ' %(next_id)s = %(next_id)s + 1', - ' }', - ' return %(id_map)s[name]', - '}', - 'probe begin', - '{', - ' printf("%%8b%%8b%%8b", 0xffffffffffffffff, 0xf2b177cb0aa429b4, 4)', - '}', - '', - id_map=id_map, - next_id=next_id, - map_func=map_func) + '') for event_id, e in enumerate(events): if 'disable' in e.properties: @@ -56,9 +31,7 @@ def generate(events, backend, group): out('probe %(probeprefix)s.simpletrace.%(name)s = %(probeprefix)s.%(name)s ?', '{', - ' id = %(map_func)s("%(name)s")', probeprefix=probeprefix(), - map_func=map_func, name=e.name) # Calculate record size @@ -77,7 +50,7 @@ def generate(events, backend, group): sizestr = ' + '.join(sizes) # Generate format string and value pairs for record header and arguments - fields = [('8b', 'id'), + fields = [('8b', str(event_id)), ('8b', 'gettimeofday_ns()'), ('4b', sizestr), ('4b', 'pid()')]