Messages in this thread Patch in this message | | | From | Namhyung Kim <> | Subject | Re: [RFC PATCH 0/2] libtraceevent/perf: Add support for trace-cmd plugins | Date | Tue, 19 Jun 2012 23:39:34 +0900 |
| |
On Tue, 19 Jun 2012 07:54:42 -0400, Steven Rostedt wrote: > We could simply check if all the characters in the array passes > 'isprint()' and if it does then print the string, otherwise print the > hex. Do this for all events, and if it one fails, then mark it always to > print hex. >
Ok, checking it at parse time is not possible because we cannot access to its data. You meant something like this?
diff --git a/tools/lib/traceevent/event-parse.c b/tools/lib/traceevent/event-parse.c index 853b604b6240..7dae44b74e0b 100644 --- a/tools/lib/traceevent/event-parse.c +++ b/tools/lib/traceevent/event-parse.c @@ -3655,6 +3655,16 @@ static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size, trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); } +static int is_printable_array(char *p, unsigned int len) +{ + unsigned int i; + + for (i = 0; i < len && p[i]; i++) + if (!isprint(p[i])) + return 0; + return 1; +} + static void print_event_fields(struct trace_seq *s, void *data, int size, struct event_format *event) { @@ -3674,7 +3684,8 @@ static void print_event_fields(struct trace_seq *s, void *data, int size, len = offset >> 16; offset &= 0xffff; } - if (field->flags & FIELD_IS_STRING) { + if ((field->flags & FIELD_IS_STRING) && + is_printable_array(data + offset, len)) { trace_seq_printf(s, "%s", (char *)data + offset); } else { trace_seq_puts(s, "ARRAY["); @@ -3685,6 +3696,7 @@ static void print_event_fields(struct trace_seq *s, void *data, int size, *((unsigned char *)data + offset + i)); } trace_seq_putc(s, ']'); + field->flags &= ~FIELD_IS_STRING; } } else { val = pevent_read_number(event->pevent, data + field->offset,
| |