diff options
author | Steven Rostedt <srostedt@redhat.com> | 2009-12-15 21:13:00 -0500 |
---|---|---|
committer | Steven Rostedt <rostedt@goodmis.org> | 2009-12-15 21:13:00 -0500 |
commit | 861ba2a81310fd290101d04547c0a13c423b22cd (patch) | |
tree | bbb5b5cd7fb1ecce74d17c1bc1420fe7abb3bc98 | |
parent | 9b961aa74b44b0952232626c5e819161d3517035 (diff) |
trace-cmd: Add negating of events
Add the '-v' option to disable events. This is advantageous with:
trace-cmd record -e all -v -e lock -e syscalls
This will enable all events and then disable lock and syscall events
before executing the command.
Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r-- | trace-cmd.c | 37 |
1 files changed, 34 insertions, 3 deletions
diff --git a/trace-cmd.c b/trace-cmd.c index 879d9ad..ac14a61 100644 --- a/trace-cmd.c +++ b/trace-cmd.c | |||
@@ -58,6 +58,7 @@ static int *pids; | |||
58 | struct event_list { | 58 | struct event_list { |
59 | struct event_list *next; | 59 | struct event_list *next; |
60 | const char *event; | 60 | const char *event; |
61 | int neg; | ||
61 | }; | 62 | }; |
62 | 63 | ||
63 | static struct event_list *event_selection; | 64 | static struct event_list *event_selection; |
@@ -424,7 +425,24 @@ static void disable_event(const char *name) | |||
424 | put_tracing_file(path); | 425 | put_tracing_file(path); |
425 | fwrite("0", 1, 1, fp); | 426 | fwrite("0", 1, 1, fp); |
426 | fclose(fp); | 427 | fclose(fp); |
428 | return; | ||
427 | } | 429 | } |
430 | |||
431 | path = get_tracing_file("set_event"); | ||
432 | fp = fopen(path, "a"); | ||
433 | if (!fp) | ||
434 | die("writing to '%s'", path); | ||
435 | put_tracing_file(path); | ||
436 | ret = fwrite("!", 1, 1, fp); | ||
437 | if (ret < 0) | ||
438 | die("can't write negative"); | ||
439 | ret = fwrite(name, 1, strlen(name), fp); | ||
440 | if (ret < 0) | ||
441 | die("bad event '%s'", name); | ||
442 | ret = fwrite("\n", 1, 1, fp); | ||
443 | if (ret < 0) | ||
444 | die("bad event '%s'", name); | ||
445 | fclose(fp); | ||
428 | } | 446 | } |
429 | 447 | ||
430 | static void enable_tracing(void) | 448 | static void enable_tracing(void) |
@@ -497,7 +515,14 @@ static void enable_events(void) | |||
497 | struct event_list *event; | 515 | struct event_list *event; |
498 | 516 | ||
499 | for (event = event_selection; event; event = event->next) { | 517 | for (event = event_selection; event; event = event->next) { |
500 | enable_event(event->event); | 518 | if (!event->neg) |
519 | enable_event(event->event); | ||
520 | } | ||
521 | |||
522 | /* Now disable any events */ | ||
523 | for (event = event_selection; event; event = event->next) { | ||
524 | if (event->neg) | ||
525 | disable_event(event->event); | ||
501 | } | 526 | } |
502 | } | 527 | } |
503 | 528 | ||
@@ -631,9 +656,10 @@ void usage(char **argv) | |||
631 | printf("\n" | 656 | printf("\n" |
632 | "%s version %s\n\n" | 657 | "%s version %s\n\n" |
633 | "usage:\n" | 658 | "usage:\n" |
634 | " %s record [-e event][-p plugin][-d][-o file][-s usecs][-O option ] [command ...]\n" | 659 | " %s record [-v][-e event][-p plugin][-d][-o file][-s usecs][-O option ] [command ...]\n" |
635 | " -e run command with event enabled\n" | 660 | " -e run command with event enabled\n" |
636 | " -p run command with plugin enabled\n" | 661 | " -p run command with plugin enabled\n" |
662 | " -v will negate all -e after it (disable those events)\n" | ||
637 | " -d disable function tracer when running\n" | 663 | " -d disable function tracer when running\n" |
638 | " -o data output file [default trace.dat]\n" | 664 | " -o data output file [default trace.dat]\n" |
639 | " -O option to enable (or disable)\n" | 665 | " -O option to enable (or disable)\n" |
@@ -680,6 +706,7 @@ int main (int argc, char **argv) | |||
680 | int options = 0; | 706 | int options = 0; |
681 | int record = 0; | 707 | int record = 0; |
682 | int run_command = 0; | 708 | int run_command = 0; |
709 | int neg_event = 0; | ||
683 | int fset; | 710 | int fset; |
684 | int cpu; | 711 | int cpu; |
685 | 712 | ||
@@ -696,7 +723,7 @@ int main (int argc, char **argv) | |||
696 | } else if ((record = (strcmp(argv[1], "record") == 0)) || | 723 | } else if ((record = (strcmp(argv[1], "record") == 0)) || |
697 | (strcmp(argv[1], "start") == 0)) { | 724 | (strcmp(argv[1], "start") == 0)) { |
698 | 725 | ||
699 | while ((c = getopt(argc-1, argv+1, "+he:p:do:O:")) >= 0) { | 726 | while ((c = getopt(argc-1, argv+1, "+he:p:do:O:s:v")) >= 0) { |
700 | switch (c) { | 727 | switch (c) { |
701 | case 'h': | 728 | case 'h': |
702 | usage(argv); | 729 | usage(argv); |
@@ -706,8 +733,12 @@ int main (int argc, char **argv) | |||
706 | event = malloc_or_die(sizeof(*event)); | 733 | event = malloc_or_die(sizeof(*event)); |
707 | event->event = optarg; | 734 | event->event = optarg; |
708 | event->next = event_selection; | 735 | event->next = event_selection; |
736 | event->neg = neg_event; | ||
709 | event_selection = event; | 737 | event_selection = event; |
710 | break; | 738 | break; |
739 | case 'v': | ||
740 | neg_event = 1; | ||
741 | break; | ||
711 | case 'p': | 742 | case 'p': |
712 | if (plugin) | 743 | if (plugin) |
713 | die("only one plugin allowed"); | 744 | die("only one plugin allowed"); |