aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSteven Rostedt <srostedt@redhat.com>2011-02-14 13:47:53 -0500
committerSteven Rostedt <rostedt@goodmis.org>2011-02-14 15:37:06 -0500
commitd4b6a3efdf7604d2edcb8470543b39cdedce60f4 (patch)
treeb1df96346028b16311ffd5e5440c0da2f24c98f7
parent00bacb780b8b5076224577ec15be8b4d7d6ec99d (diff)
trace-cmd/report: Add --kallsyms to insert function list
If for some reason a trace.dat file is missing the function list (sometimes happens when creating a trace.dat from restore), add away to allow trace-cmd report to pull in a kallsyms file to use instead. Signed-off-by: Steven Rostedt <rostedt@goodmis.org>
-rw-r--r--trace-read.c44
1 files changed, 44 insertions, 0 deletions
diff --git a/trace-read.c b/trace-read.c
index 15284f5..326054e 100644
--- a/trace-read.c
+++ b/trace-read.c
@@ -679,10 +679,47 @@ static void add_cpu(const char *cpu_str)
679 __add_cpu(cpu); 679 __add_cpu(cpu);
680} 680}
681 681
682static void read_file_fd(int fd, char *dst, int len)
683{
684 size_t size = 0;
685 int r;
686
687 do {
688 r = read(fd, dst+size, len);
689 if (r > 0) {
690 size += r;
691 len -= r;
692 }
693 } while (r > 0);
694}
695
696static void add_functions(struct pevent *pevent, const char *file)
697{
698 struct stat st;
699 char *buf;
700 int ret;
701 int fd;
702
703 fd = open(file, O_RDONLY);
704 if (fd < 0)
705 die("Can't read file %s", file);
706
707 ret = fstat(fd, &st);
708 if (ret < 0)
709 die("Can't stat file %s", file);
710
711 buf = malloc_or_die(st.st_size);
712 read_file_fd(fd, buf, st.st_size);
713 close(fd);
714 parse_proc_kallsyms(pevent, buf, st.st_size);
715 free(buf);
716}
717
682void trace_report (int argc, char **argv) 718void trace_report (int argc, char **argv)
683{ 719{
684 struct tracecmd_input *handle; 720 struct tracecmd_input *handle;
685 struct pevent *pevent; 721 struct pevent *pevent;
722 const char *functions = NULL;
686 int show_funcs = 0; 723 int show_funcs = 0;
687 int show_endian = 0; 724 int show_endian = 0;
688 int show_page_size = 0; 725 int show_page_size = 0;
@@ -709,6 +746,7 @@ void trace_report (int argc, char **argv)
709 {"cpu", required_argument, NULL, 0}, 746 {"cpu", required_argument, NULL, 0},
710 {"events", no_argument, NULL, 0}, 747 {"events", no_argument, NULL, 0},
711 {"filter-test", no_argument, NULL, 'T'}, 748 {"filter-test", no_argument, NULL, 'T'},
749 {"kallsyms", required_argument, NULL, 0},
712 {"help", no_argument, NULL, '?'}, 750 {"help", no_argument, NULL, '?'},
713 {NULL, 0, NULL, 0} 751 {NULL, 0, NULL, 0}
714 }; 752 };
@@ -785,6 +823,9 @@ void trace_report (int argc, char **argv)
785 case 2: /* filter-test */ 823 case 2: /* filter-test */
786 test_filters = 1; 824 test_filters = 1;
787 break; 825 break;
826 case 3: /* kallsyms */
827 functions = optarg;
828 break;
788 default: 829 default:
789 usage(argv); 830 usage(argv);
790 } 831 }
@@ -824,6 +865,9 @@ void trace_report (int argc, char **argv)
824 if (test_filters) 865 if (test_filters)
825 pevent->test_filters = 1; 866 pevent->test_filters = 1;
826 867
868 if (functions)
869 add_functions(pevent, functions);
870
827 if (show_endian) { 871 if (show_endian) {
828 printf("file is %s endian and host is %s endian\n", 872 printf("file is %s endian and host is %s endian\n",
829 pevent_is_file_bigendian(pevent) ? "big" : "little", 873 pevent_is_file_bigendian(pevent) ? "big" : "little",