perf report: Print out raw events in hexa
authorIngo Molnar <mingo@elte.hu>
Sun, 14 Jun 2009 12:44:07 +0000 (14:44 +0200)
committerIngo Molnar <mingo@elte.hu>
Sun, 14 Jun 2009 12:45:12 +0000 (14:45 +0200)
Print out events in hexa dump format, when -D is specified:

0x4868 [0x48]: event: 1
.
. ... raw event: size 72 bytes
.  0000:  01 00 00 00 00 00 48 00 d4 72 00 00 d4 72 00 00  ......H..r...r.
.  0010:  00 00 40 f2 3e 00 00 00 00 30 01 00 00 00 00 00  ..@.>....0.....
.  0020:  00 00 00 00 00 00 00 00 2f 75 73 72 2f 6c 69 62  ......../usr/li
.  0030:  36 34 2f 6c 69 62 65 6c 66 2d 30 2e 31 34 31 2e  64/libelf-0.141
.  0040:  73 6f 00 00 00 00 00 00                          f-0.141
.
0x4868 [0x48]: PERF_EVENT_MMAP 29396: [0x3ef2400000(0x13000) @ (nil)]: /usr/lib64/libelf-0.141.so

This helps the debugging of mis-parsing of data files, and helps
the addition of new sample/trace formats.

Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Mike Galbraith <efault@gmx.de>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Arnaldo Carvalho de Melo <acme@redhat.com>
LKML-Reference: <new-submission>
Signed-off-by: Ingo Molnar <mingo@elte.hu>
tools/perf/builtin-report.c

index 82fa93b..37515da 100644 (file)
@@ -1095,9 +1095,43 @@ process_period_event(event_t *event, unsigned long offset, unsigned long head)
        return 0;
 }
 
+static void trace_event(event_t *event)
+{
+       unsigned char *raw_event = (void *)event;
+       int i, j;
+
+       if (!dump_trace)
+               return;
+
+       dprintf(".\n. ... raw event: size %d bytes\n", event->header.size);
+
+       for (i = 0; i < event->header.size; i++) {
+               if ((i & 15) == 0)
+                       dprintf(".  %04x: ", i);
+
+               dprintf(" %02x", raw_event[i]);
+
+               if (((i & 15) == 15) || i == event->header.size-1) {
+                       dprintf("  ");
+                       for (j = 0; j < 15-(i & 15); j++)
+                               dprintf("   ");
+                       for (j = 0; j < (i & 15); j++) {
+                               if (isprint(raw_event[i-15+j]))
+                                       dprintf("%c", raw_event[i-15+j]);
+                               else
+                                       dprintf(".");
+                       }
+                       dprintf("\n");
+               }
+       }
+       dprintf(".\n");
+}
+
 static int
 process_event(event_t *event, unsigned long offset, unsigned long head)
 {
+       trace_event(event);
+
        if (event->header.misc & PERF_EVENT_MISC_OVERFLOW)
                return process_overflow_event(event, offset, head);
 
@@ -1204,7 +1238,7 @@ more:
 
        size = event->header.size;
 
-       dprintf("%p [%p]: event: %d\n",
+       dprintf("\n%p [%p]: event: %d\n",
                        (void *)(offset + head),
                        (void *)(long)event->header.size,
                        event->header.type);