|
@@ -40,17 +40,17 @@ def read_header(fobj, hfmt):
|
|
return None
|
|
return None
|
|
return struct.unpack(hfmt, hdr)
|
|
return struct.unpack(hfmt, hdr)
|
|
|
|
|
|
-def get_record(edict, idtoname, rechdr, fobj):
|
|
|
|
|
|
+def get_record(event_mapping, event_id_to_name, rechdr, fobj):
|
|
"""Deserialize a trace record from a file into a tuple
|
|
"""Deserialize a trace record from a file into a tuple
|
|
(name, timestamp, pid, arg1, ..., arg6)."""
|
|
(name, timestamp, pid, arg1, ..., arg6)."""
|
|
if rechdr is None:
|
|
if rechdr is None:
|
|
return None
|
|
return None
|
|
if rechdr[0] != dropped_event_id:
|
|
if rechdr[0] != dropped_event_id:
|
|
event_id = rechdr[0]
|
|
event_id = rechdr[0]
|
|
- name = idtoname[event_id]
|
|
|
|
|
|
+ name = event_id_to_name[event_id]
|
|
rec = (name, rechdr[1], rechdr[3])
|
|
rec = (name, rechdr[1], rechdr[3])
|
|
try:
|
|
try:
|
|
- event = edict[name]
|
|
|
|
|
|
+ event = event_mapping[name]
|
|
except KeyError as e:
|
|
except KeyError as e:
|
|
sys.stderr.write('%s event is logged but is not declared ' \
|
|
sys.stderr.write('%s event is logged but is not declared ' \
|
|
'in the trace events file, try using ' \
|
|
'in the trace events file, try using ' \
|
|
@@ -79,10 +79,10 @@ def get_mapping(fobj):
|
|
|
|
|
|
return (event_id, name)
|
|
return (event_id, name)
|
|
|
|
|
|
-def read_record(edict, idtoname, fobj):
|
|
|
|
|
|
+def read_record(event_mapping, event_id_to_name, fobj):
|
|
"""Deserialize a trace record from a file into a tuple (event_num, timestamp, pid, arg1, ..., arg6)."""
|
|
"""Deserialize a trace record from a file into a tuple (event_num, timestamp, pid, arg1, ..., arg6)."""
|
|
rechdr = read_header(fobj, rec_header_fmt)
|
|
rechdr = read_header(fobj, rec_header_fmt)
|
|
- return get_record(edict, idtoname, rechdr, fobj)
|
|
|
|
|
|
+ return get_record(event_mapping, event_id_to_name, rechdr, fobj)
|
|
|
|
|
|
def read_trace_header(fobj):
|
|
def read_trace_header(fobj):
|
|
"""Read and verify trace file header"""
|
|
"""Read and verify trace file header"""
|
|
@@ -103,14 +103,14 @@ def read_trace_header(fobj):
|
|
raise ValueError('Log format %d not supported with this QEMU release!'
|
|
raise ValueError('Log format %d not supported with this QEMU release!'
|
|
% log_version)
|
|
% log_version)
|
|
|
|
|
|
-def read_trace_records(edict, idtoname, fobj):
|
|
|
|
|
|
+def read_trace_records(event_mapping, event_id_to_name, fobj):
|
|
"""Deserialize trace records from a file, yielding record tuples (event_num, timestamp, pid, arg1, ..., arg6).
|
|
"""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.
|
|
|
|
|
|
+ Note that `event_id_to_name` is modified if the file contains mapping records.
|
|
|
|
|
|
Args:
|
|
Args:
|
|
- edict (str -> Event): events dict, indexed by name
|
|
|
|
- idtoname (int -> str): event names dict, indexed by event ID
|
|
|
|
|
|
+ event_mapping (str -> Event): events dict, indexed by name
|
|
|
|
+ event_id_to_name (int -> str): event names dict, indexed by event ID
|
|
fobj (file): input file
|
|
fobj (file): input file
|
|
|
|
|
|
"""
|
|
"""
|
|
@@ -122,9 +122,9 @@ def read_trace_records(edict, idtoname, fobj):
|
|
(rectype, ) = struct.unpack('=Q', t)
|
|
(rectype, ) = struct.unpack('=Q', t)
|
|
if rectype == record_type_mapping:
|
|
if rectype == record_type_mapping:
|
|
event_id, name = get_mapping(fobj)
|
|
event_id, name = get_mapping(fobj)
|
|
- idtoname[event_id] = name
|
|
|
|
|
|
+ event_id_to_name[event_id] = name
|
|
else:
|
|
else:
|
|
- rec = read_record(edict, idtoname, fobj)
|
|
|
|
|
|
+ rec = read_record(event_mapping, event_id_to_name, fobj)
|
|
|
|
|
|
yield rec
|
|
yield rec
|
|
|
|
|
|
@@ -201,16 +201,16 @@ def process(events, log, analyzer, read_header=True):
|
|
frameinfo = inspect.getframeinfo(inspect.currentframe())
|
|
frameinfo = inspect.getframeinfo(inspect.currentframe())
|
|
dropped_event = Event.build("Dropped_Event(uint64_t num_events_dropped)",
|
|
dropped_event = Event.build("Dropped_Event(uint64_t num_events_dropped)",
|
|
frameinfo.lineno + 1, frameinfo.filename)
|
|
frameinfo.lineno + 1, frameinfo.filename)
|
|
- edict = {"dropped": dropped_event}
|
|
|
|
- idtoname = {dropped_event_id: "dropped"}
|
|
|
|
|
|
+ event_mapping = {"dropped": dropped_event}
|
|
|
|
+ event_id_to_name = {dropped_event_id: "dropped"}
|
|
|
|
|
|
for event in events_list:
|
|
for event in events_list:
|
|
- edict[event.name] = event
|
|
|
|
|
|
+ event_mapping[event.name] = event
|
|
|
|
|
|
# If there is no header assume event ID mapping matches events list
|
|
# If there is no header assume event ID mapping matches events list
|
|
if not read_header:
|
|
if not read_header:
|
|
for event_id, event in enumerate(events_list):
|
|
for event_id, event in enumerate(events_list):
|
|
- idtoname[event_id] = event.name
|
|
|
|
|
|
+ event_id_to_name[event_id] = event.name
|
|
|
|
|
|
def build_fn(analyzer, event):
|
|
def build_fn(analyzer, event):
|
|
if isinstance(event, str):
|
|
if isinstance(event, str):
|
|
@@ -234,9 +234,9 @@ def build_fn(analyzer, event):
|
|
|
|
|
|
analyzer.begin()
|
|
analyzer.begin()
|
|
fn_cache = {}
|
|
fn_cache = {}
|
|
- for rec in read_trace_records(edict, idtoname, log):
|
|
|
|
|
|
+ for rec in read_trace_records(event_mapping, event_id_to_name, log):
|
|
event_num = rec[0]
|
|
event_num = rec[0]
|
|
- event = edict[event_num]
|
|
|
|
|
|
+ event = event_mapping[event_num]
|
|
if event_num not in fn_cache:
|
|
if event_num not in fn_cache:
|
|
fn_cache[event_num] = build_fn(analyzer, event)
|
|
fn_cache[event_num] = build_fn(analyzer, event)
|
|
fn_cache[event_num](event, rec)
|
|
fn_cache[event_num](event, rec)
|