aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2009-10-13 00:55:35 -0400
committerSteven Rostedt <rostedt@goodmis.org>2009-10-13 00:55:35 -0400
commitf8766a8266ecbfd46190fb97a393bf7d01971850 (patch)
tree5fe00ce6b69f12539d19ff4c2cbb89aa432bce6c
parent62989922ff2e9b53738acd60a2b6e202ca403e6d (diff)
do not exit when parser fails on an event
If an event fails to parse, just warn about it, and continue. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--parse-events.c35
-rw-r--r--parse-events.h15
-rw-r--r--trace-cmd.c15
3 files changed, 50 insertions, 15 deletions
diff --git a/parse-events.c b/parse-events.c
index 42f1e3f..5795c09 100644
--- a/parse-events.c
+++ b/parse-events.c
@@ -625,7 +625,7 @@ enum event_type read_token_item(char **tok)
625int test_type(enum event_type type, enum event_type expect) 625int test_type(enum event_type type, enum event_type expect)
626{ 626{
627 if (type != expect) { 627 if (type != expect) {
628 die("Error: expected type %d but read %d", 628 warn("Error: expected type %d but read %d",
629 expect, type); 629 expect, type);
630 return -1; 630 return -1;
631 } 631 }
@@ -636,13 +636,13 @@ int test_type_token(enum event_type type, char *token,
636 enum event_type expect, char *expect_tok) 636 enum event_type expect, char *expect_tok)
637{ 637{
638 if (type != expect) { 638 if (type != expect) {
639 die("Error: expected type %d but read %d", 639 warn("Error: expected type %d but read %d",
640 expect, type); 640 expect, type);
641 return -1; 641 return -1;
642 } 642 }
643 643
644 if (strcmp(token, expect_tok) != 0) { 644 if (strcmp(token, expect_tok) != 0) {
645 die("Error: expected '%s' but read '%s'", 645 warn("Error: expected '%s' but read '%s'",
646 expect_tok, token); 646 expect_tok, token);
647 return -1; 647 return -1;
648 } 648 }
@@ -685,7 +685,7 @@ int __read_expected(enum event_type expect, char *str, int newline_ok)
685 685
686 free_token(token); 686 free_token(token);
687 687
688 return 0; 688 return ret;
689} 689}
690 690
691int read_expected(enum event_type expect, char *str) 691int read_expected(enum event_type expect, char *str)
@@ -1226,7 +1226,8 @@ process_op(struct event *event, struct print_arg *arg, char **tok)
1226 type = process_array(event, arg, tok); 1226 type = process_array(event, arg, tok);
1227 1227
1228 } else { 1228 } else {
1229 die("unknown op '%s'", token); 1229 warn("unknown op '%s'", token);
1230 event->flags |= EVENT_FL_FAILED;
1230 /* the arg is now the left side */ 1231 /* the arg is now the left side */
1231 return EVENT_NONE; 1232 return EVENT_NONE;
1232 } 1233 }
@@ -2749,6 +2750,12 @@ void print_event(int cpu, void *data, int size, unsigned long long nsecs)
2749 comm, pid, cpu, 2750 comm, pid, cpu,
2750 secs, usecs, event->name); 2751 secs, usecs, event->name);
2751 2752
2753 if (event->flags & EVENT_FL_FAILED) {
2754 printf("EVENT '%s' FAILED TO PARSE\n",
2755 event->name);
2756 return;
2757 }
2758
2752 pretty_print(data, size, event); 2759 pretty_print(data, size, event);
2753 printf("\n"); 2760 printf("\n");
2754} 2761}
@@ -2955,12 +2962,16 @@ int parse_event_file(char *buf, unsigned long size, char *system)
2955 die("failed to read event id"); 2962 die("failed to read event id");
2956 2963
2957 ret = event_read_format(event); 2964 ret = event_read_format(event);
2958 if (ret < 0) 2965 if (ret < 0) {
2959 die("failed to read event format"); 2966 warn("failed to read event format for %s", event->name);
2967 goto event_failed;
2968 }
2960 2969
2961 ret = event_read_print(event); 2970 ret = event_read_print(event);
2962 if (ret < 0) 2971 if (ret < 0) {
2963 die("failed to read event print fmt"); 2972 warn("failed to read event print fmt for %s", event->name);
2973 goto event_failed;
2974 }
2964 2975
2965#define PRINT_ARGS 0 2976#define PRINT_ARGS 0
2966 if (PRINT_ARGS && event->print_fmt.args) 2977 if (PRINT_ARGS && event->print_fmt.args)
@@ -2968,6 +2979,12 @@ int parse_event_file(char *buf, unsigned long size, char *system)
2968 2979
2969 add_event(event); 2980 add_event(event);
2970 return 0; 2981 return 0;
2982
2983 event_failed:
2984 event->flags |= EVENT_FL_FAILED;
2985 /* still add it even if it failed */
2986 add_event(event);
2987 return -1;
2971} 2988}
2972 2989
2973void parse_set_info(int nr_cpus, int long_sz) 2990void parse_set_info(int nr_cpus, int long_sz)
diff --git a/parse-events.h b/parse-events.h
index 73b36dd..d517ba2 100644
--- a/parse-events.h
+++ b/parse-events.h
@@ -131,12 +131,14 @@ struct event {
131}; 131};
132 132
133enum { 133enum {
134 EVENT_FL_ISFTRACE = 1, 134 EVENT_FL_ISFTRACE = 0x01,
135 EVENT_FL_ISPRINT = 2, 135 EVENT_FL_ISPRINT = 0x02,
136 EVENT_FL_ISBPRINT = 4, 136 EVENT_FL_ISBPRINT = 0x04,
137 EVENT_FL_ISFUNC = 8, 137 EVENT_FL_ISFUNC = 0x08,
138 EVENT_FL_ISFUNCENT = 16, 138 EVENT_FL_ISFUNCENT = 0x10,
139 EVENT_FL_ISFUNCRET = 32, 139 EVENT_FL_ISFUNCRET = 0x20,
140
141 EVENT_FL_FAILED = 0x80000000
140}; 142};
141 143
142struct record { 144struct record {
@@ -156,6 +158,7 @@ void trace_report(int argc, char **argv);
156 158
157void die(char *fmt, ...); 159void die(char *fmt, ...);
158void *malloc_or_die(unsigned int size); 160void *malloc_or_die(unsigned int size);
161void warn(char *fmt, ...);
159 162
160void parse_cmdlines(char *file, int size); 163void parse_cmdlines(char *file, int size);
161void parse_proc_kallsyms(char *file, unsigned int size); 164void parse_proc_kallsyms(char *file, unsigned int size);
diff --git a/trace-cmd.c b/trace-cmd.c
index c452c8f..3657dd3 100644
--- a/trace-cmd.c
+++ b/trace-cmd.c
@@ -147,6 +147,21 @@ void die(char *fmt, ...)
147 exit(ret); 147 exit(ret);
148} 148}
149 149
150void warn(char *fmt, ...)
151{
152 va_list ap;
153
154 if (errno)
155 perror("trace-cmd");
156
157 va_start(ap, fmt);
158 fprintf(stderr, " ");
159 vfprintf(stderr, fmt, ap);
160 va_end(ap);
161
162 fprintf(stderr, "\n");
163}
164
150void *malloc_or_die(unsigned int size) 165void *malloc_or_die(unsigned int size)
151{ 166{
152 void *data; 167 void *data;