aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2010-03-25 16:43:08 -0400
committerSteven Rostedt <rostedt@goodmis.org>2010-03-25 16:43:08 -0400
commit96f72b61aabc6f12d78d5cb8d33d7e2ad4560fa0 (patch)
tree1758ada867d0a12dc14cdde2e08108d4c5057a6e
parente71d0e2d1ca6a2c308d7097e1232addbe0cad787 (diff)
parse-events: Print field contents of failed parsed event
If an event fails to parse the print string, then it is better to show the contents as raw elements than just to print "FAILED TO PARSE" and drop the event. At least now the events show a bit more information, even if the print string did not parse correctly. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--parse-events.c61
1 files changed, 59 insertions, 2 deletions
diff --git a/parse-events.c b/parse-events.c
index ea7f5dd..6c3a7ab 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -3376,6 +3376,63 @@ static void print_mac_arg(struct trace_seq *s, int mac, void *data, int size,
3376 trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]); 3376 trace_seq_printf(s, fmt, buf[0], buf[1], buf[2], buf[3], buf[4], buf[5]);
3377} 3377}
3378 3378
3379static void print_event_fields(struct trace_seq *s, void *data, int size,
3380 struct event_format *event)
3381{
3382 struct format_field *field;
3383 unsigned long long val;
3384 unsigned int offset, len, i;
3385
3386 field = event->format.fields;
3387 while (field) {
3388 trace_seq_printf(s, " %s=", field->name);
3389 if (field->flags & FIELD_IS_ARRAY) {
3390 offset = field->offset;
3391 len = field->size;
3392 if (field->flags & FIELD_IS_DYNAMIC) {
3393 val = pevent_read_number(event->pevent, data + offset, len);
3394 offset = val;
3395 len = offset >> 16;
3396 offset &= 0xffff;
3397 }
3398 if (field->flags & FIELD_IS_STRING) {
3399 trace_seq_printf(s, "%s", (char *)data + offset);
3400 } else {
3401 trace_seq_puts(s, "ARRAY[");
3402 for (i = 0; i < len; i++) {
3403 if (i)
3404 trace_seq_puts(s, ", ");
3405 trace_seq_printf(s, "%02x",
3406 *((unsigned char *)data + offset + i));
3407 }
3408 trace_seq_putc(s, ']');
3409 }
3410 } else {
3411 val = pevent_read_number(event->pevent, data + field->offset,
3412 field->size);
3413 if (field->flags & FIELD_IS_POINTER) {
3414 trace_seq_printf(s, "0x%llx", val);
3415 } else if (field->flags & FIELD_IS_SIGNED) {
3416 switch (field->size) {
3417 case 4:
3418 trace_seq_printf(s, "%d", (int)val);
3419 break;
3420 case 2:
3421 trace_seq_printf(s, "%2d", (short)val);
3422 break;
3423 case 1:
3424 trace_seq_printf(s, "%1d", (char)val);
3425 break;
3426 default:
3427 trace_seq_printf(s, "%lld", val);
3428 }
3429 } else
3430 trace_seq_printf(s, "%llu", val);
3431 }
3432 field = field->next;
3433 }
3434}
3435
3379static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event) 3436static void pretty_print(struct trace_seq *s, void *data, int size, struct event_format *event)
3380{ 3437{
3381 struct pevent *pevent = event->pevent; 3438 struct pevent *pevent = event->pevent;
@@ -3393,8 +3450,8 @@ static void pretty_print(struct trace_seq *s, void *data, int size, struct event
3393 int ls; 3450 int ls;
3394 3451
3395 if (event->flags & EVENT_FL_FAILED) { 3452 if (event->flags & EVENT_FL_FAILED) {
3396 trace_seq_printf(s, "EVENT '%s' FAILED TO PARSE", 3453 trace_seq_printf(s, "[FAILED TO PARSE]");
3397 event->name); 3454 print_event_fields(s, data, size, event);
3398 return; 3455 return;
3399 } 3456 }
3400 3457