From c319a5160a1b86c5cfa288cdf36e7473f8c38515 Mon Sep 17 00:00:00 2001 From: Stefan Hajnoczi Date: Tue, 7 Oct 2014 14:06:52 +0200 Subject: [PATCH 34/43] simpletrace: add support for trace record pid field Message-id: <1412690820-31016-4-git-send-email-stefanha@redhat.com> Patchwork-id: 61608 O-Subject: [RHEL7.1 qemu-kvm PATCH 03/11] simpletrace: add support for trace record pid field Bugzilla: 1088112 RH-Acked-by: Laszlo Ersek RH-Acked-by: Miroslav Rezanina RH-Acked-by: Paolo Bonzini Extract the pid field from the trace record and print it. Change the trace record tuple from: (event_num, timestamp, arg1, ..., arg6) to: (event_num, timestamp, pid, arg1, ..., arg6) Trace event methods now support 3 prototypes: 1. (arg1, arg2, arg3) 2. (timestamp, arg1, arg2, arg3) 3. (timestamp, pid, arg1, arg2, arg3) Existing script continue to work without changes, they only know about prototypes 1 and 2. Signed-off-by: Stefan Hajnoczi (cherry picked from commit 80ff35cd3ff451e8f200413ddf27816058630c1f) Signed-off-by: Stefan Hajnoczi Signed-off-by: Miroslav Rezanina --- scripts/simpletrace.py | 26 +++++++++++++++----------- 1 file changed, 15 insertions(+), 11 deletions(-) diff --git a/scripts/simpletrace.py b/scripts/simpletrace.py index 3cb2cf0..682ec66 100755 --- a/scripts/simpletrace.py +++ b/scripts/simpletrace.py @@ -32,10 +32,10 @@ def read_header(fobj, hfmt): return struct.unpack(hfmt, hdr) def get_record(edict, rechdr, fobj): - """Deserialize a trace record from a file into a tuple (event_num, timestamp, arg1, ..., arg6).""" + """Deserialize a trace record from a file into a tuple (event_num, timestamp, pid, arg1, ..., arg6).""" if rechdr is None: return None - rec = (rechdr[0], rechdr[1]) + rec = (rechdr[0], rechdr[1], rechdr[3]) if rechdr[0] != dropped_event_id: event_id = rechdr[0] event = edict[event_id] @@ -55,12 +55,12 @@ def get_record(edict, rechdr, fobj): def read_record(edict, fobj): - """Deserialize a trace record from a file into a tuple (event_num, timestamp, 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) return get_record(edict, rechdr, fobj) # return tuple of record elements def read_trace_file(edict, fobj): - """Deserialize trace records from a file, yielding record tuples (event_num, timestamp, arg1, ..., arg6).""" + """Deserialize trace records from a file, yielding record tuples (event_num, timestamp, pid, arg1, ..., arg6).""" header = read_header(fobj, log_header_fmt) if header is None or \ header[0] != header_event_id or \ @@ -132,10 +132,13 @@ def process(events, log, analyzer): fn_argcount = len(inspect.getargspec(fn)[0]) - 1 if fn_argcount == event_argcount + 1: # Include timestamp as first argument - return lambda _, rec: fn(*rec[1:2 + event_argcount]) + return lambda _, rec: fn(*((rec[1:2],) + rec[3:3 + event_argcount])) + elif fn_argcount == event_argcount + 2: + # Include timestamp and pid + return lambda _, rec: fn(*rec[1:3 + event_argcount]) else: - # Just arguments, no timestamp - return lambda _, rec: fn(*rec[2:2 + event_argcount]) + # Just arguments, no timestamp or pid + return lambda _, rec: fn(*rec[3:3 + event_argcount]) analyzer.begin() fn_cache = {} @@ -167,19 +170,20 @@ if __name__ == '__main__': self.last_timestamp = None def catchall(self, event, rec): - i = 1 timestamp = rec[1] if self.last_timestamp is None: self.last_timestamp = timestamp delta_ns = timestamp - self.last_timestamp self.last_timestamp = timestamp - fields = [event.name, '%0.3f' % (delta_ns / 1000.0)] + fields = [event.name, '%0.3f' % (delta_ns / 1000.0), + 'pid=%d' % rec[2]] + i = 3 for type, name in event.args: if is_string(type): - fields.append('%s=%s' % (name, rec[i + 1])) + fields.append('%s=%s' % (name, rec[i])) else: - fields.append('%s=0x%x' % (name, rec[i + 1])) + fields.append('%s=0x%x' % (name, rec[i])) i += 1 print ' '.join(fields) -- 1.8.3.1