public inbox for linux-kernel@vger.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 0/2] perf: add support for logging debug messages to file
@ 2019-09-22  2:38 Changbin Du
  2019-09-22  2:38 ` [PATCH v2 1/2] perf: support multiple debug options separated by ',' Changbin Du
                   ` (2 more replies)
  0 siblings, 3 replies; 5+ messages in thread
From: Changbin Du @ 2019-09-22  2:38 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Jiri Olsa
  Cc: Alexander Shishkin, Namhyung Kim, linux-kernel, Changbin Du

When in TUI mode, it is impossible to show all the debug messages to
console. This make it hard to debug perf issues using debug messages.
This patch adds support for logging debug messages to file to resolve
this problem.

v2:
  o specific all debug options one time.

Changbin Du (2):
  perf: support multiple debug options separated by ','
  perf: add support for logging debug messages to file

 tools/perf/Documentation/perf.txt |  14 ++--
 tools/perf/util/debug.c           | 106 ++++++++++++++++++------------
 2 files changed, 73 insertions(+), 47 deletions(-)

-- 
2.20.1


^ permalink raw reply	[flat|nested] 5+ messages in thread

* [PATCH v2 1/2] perf: support multiple debug options separated by ','
  2019-09-22  2:38 [PATCH v2 0/2] perf: add support for logging debug messages to file Changbin Du
@ 2019-09-22  2:38 ` Changbin Du
  2019-09-22  2:38 ` [PATCH v2 2/2] perf: add support for logging debug messages to file Changbin Du
  2019-09-29  7:44 ` [PATCH v2 0/2] " Jiri Olsa
  2 siblings, 0 replies; 5+ messages in thread
From: Changbin Du @ 2019-09-22  2:38 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Jiri Olsa
  Cc: Alexander Shishkin, Namhyung Kim, linux-kernel, Changbin Du

This patch adds support for multiple debug options separated by ',' and
non-int values.
	--debug verbose=2,stderr

Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
 tools/perf/Documentation/perf.txt | 10 ++--
 tools/perf/util/debug.c           | 86 ++++++++++++++++---------------
 2 files changed, 50 insertions(+), 46 deletions(-)

diff --git a/tools/perf/Documentation/perf.txt b/tools/perf/Documentation/perf.txt
index 401f0ed67439..c05a94b2488e 100644
--- a/tools/perf/Documentation/perf.txt
+++ b/tools/perf/Documentation/perf.txt
@@ -19,11 +19,11 @@ OPTIONS
 	  --debug verbose=2 # sets verbose = 2
 
 	List of debug variables allowed to set:
-	  verbose          - general debug messages
-	  ordered-events   - ordered events object debug messages
-	  data-convert     - data convert command debug messages
-	  stderr           - write debug output (option -v) to stderr
-	                     in browser mode
+	  verbose=level		- general debug messages
+	  ordered-events=level	- ordered events object debug messages
+	  data-convert=level	- data convert command debug messages
+	  stderr		- write debug output (option -v) to stderr
+				  in browser mode
 
 --buildid-dir::
 	Setup buildid cache directory. It has higher priority than
diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
index a1b59bd35519..ae6eb6d1c695 100644
--- a/tools/perf/util/debug.c
+++ b/tools/perf/util/debug.c
@@ -27,7 +27,7 @@
 int verbose;
 bool dump_trace = false, quiet = false;
 int debug_ordered_events;
-static int redirect_to_stderr;
+static bool redirect_to_stderr;
 int debug_data_convert;
 
 int veprintf(int level, int var, const char *fmt, va_list args)
@@ -173,41 +173,18 @@ void trace_event(union perf_event *event)
 		     trace_event_printer, event);
 }
 
-static struct debug_variable {
-	const char *name;
-	int *ptr;
-} debug_variables[] = {
-	{ .name = "verbose",		.ptr = &verbose },
-	{ .name = "ordered-events",	.ptr = &debug_ordered_events},
-	{ .name = "stderr",		.ptr = &redirect_to_stderr},
-	{ .name = "data-convert",	.ptr = &debug_data_convert },
-	{ .name = NULL, }
-};
-
-int perf_debug_option(const char *str)
+static int str2loglevel(const char *vstr)
 {
-	struct debug_variable *var = &debug_variables[0];
-	char *vstr, *s = strdup(str);
 	int v = 1;
-
-	vstr = strchr(s, '=');
-	if (vstr)
-		*vstr++ = 0;
-
-	while (var->name) {
-		if (!strcmp(s, var->name))
-			break;
-		var++;
-	}
-
-	if (!var->name) {
-		pr_err("Unknown debug variable name '%s'\n", s);
-		free(s);
-		return -1;
-	}
+	char *endptr;
 
 	if (vstr) {
-		v = atoi(vstr);
+		v = strtol(vstr, &endptr,0);
+		if (vstr == endptr) {
+			fprintf(stderr, "warning: '%s' is not a digit\n", vstr);
+			return -1;
+		}
+
 		/*
 		 * Allow only values in range (0, 10),
 		 * otherwise set 0.
@@ -218,20 +195,47 @@ int perf_debug_option(const char *str)
 	if (quiet)
 		v = -1;
 
-	*var->ptr = v;
-	free(s);
+	return v;
+}
+
+int perf_debug_option(const char *str)
+{
+	char *sep, *vstr;
+	char *dstr = strdup(str);
+	char *opt = dstr;
+
+	do {
+		if ((sep = strchr(opt, ',')) != NULL)
+			*sep = '\0';
+
+		vstr = strchr(opt, '=');
+		if (vstr)
+			*vstr++ = 0;
+
+		if (!strcmp(opt, "verbose"))
+			verbose = str2loglevel(vstr);
+		else if (!strcmp(opt, "ordered-events"))
+			debug_ordered_events = str2loglevel(vstr);
+		else if (!strcmp(opt, "data-convert"))
+			debug_data_convert = str2loglevel(vstr);
+		else if (!strcmp(opt, "stderr"))
+			redirect_to_stderr = true;
+		else {
+			fprintf(stderr, "unkown debug option '%s'\n", opt);
+			free(dstr);
+			return -1;
+		}
+
+		opt = sep + 1;
+	} while (sep && sep[1]);
+
+	free(dstr);
 	return 0;
 }
 
 int perf_quiet_option(void)
 {
-	struct debug_variable *var = &debug_variables[0];
-
-	/* disable all debug messages */
-	while (var->name) {
-		*var->ptr = -1;
-		var++;
-	}
+	verbose = debug_ordered_events = debug_data_convert = -1;
 
 	return 0;
 }
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* [PATCH v2 2/2] perf: add support for logging debug messages to file
  2019-09-22  2:38 [PATCH v2 0/2] perf: add support for logging debug messages to file Changbin Du
  2019-09-22  2:38 ` [PATCH v2 1/2] perf: support multiple debug options separated by ',' Changbin Du
@ 2019-09-22  2:38 ` Changbin Du
  2019-09-29  7:44 ` [PATCH v2 0/2] " Jiri Olsa
  2 siblings, 0 replies; 5+ messages in thread
From: Changbin Du @ 2019-09-22  2:38 UTC (permalink / raw)
  To: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo, Jiri Olsa
  Cc: Alexander Shishkin, Namhyung Kim, linux-kernel, Changbin Du

When in TUI mode, it is impossible to show all the debug messages to
console. This make it hard to debug perf issues using debug messages.
This patch adds support for logging debug messages to file to resolve
this problem.

The usage is:
perf -debug verbose=2,file=~/perf.log COMMAND

Signed-off-by: Changbin Du <changbin.du@gmail.com>
---
 tools/perf/Documentation/perf.txt | 14 ++++++++------
 tools/perf/util/debug.c           | 22 +++++++++++++++++++++-
 2 files changed, 29 insertions(+), 7 deletions(-)

diff --git a/tools/perf/Documentation/perf.txt b/tools/perf/Documentation/perf.txt
index c05a94b2488e..b2084a93210d 100644
--- a/tools/perf/Documentation/perf.txt
+++ b/tools/perf/Documentation/perf.txt
@@ -16,14 +16,16 @@ OPTIONS
 	Setup debug variable (see list below) in value
 	range (0, 10). Use like:
 	  --debug verbose   # sets verbose = 1
-	  --debug verbose=2 # sets verbose = 2
+	  --debug verbose=2,file=~/perf.log
+	                    # sets verbose = 2 and save log to file
 
 	List of debug variables allowed to set:
-	  verbose=level		- general debug messages
-	  ordered-events=level	- ordered events object debug messages
-	  data-convert=level	- data convert command debug messages
-	  stderr		- write debug output (option -v) to stderr
-				  in browser mode
+	  verbose=level         - general debug messages
+	  ordered-events=level  - ordered events object debug messages
+	  data-convert=level    - data convert command debug messages
+	  stderr                - write debug output (option -v) to stderr
+	                          in browser mode
+	  file=path             - write debug output to log file
 
 --buildid-dir::
 	Setup buildid cache directory. It has higher priority than
diff --git a/tools/perf/util/debug.c b/tools/perf/util/debug.c
index ae6eb6d1c695..f62d87ab79d5 100644
--- a/tools/perf/util/debug.c
+++ b/tools/perf/util/debug.c
@@ -6,6 +6,7 @@
 #include <stdarg.h>
 #include <stdio.h>
 #include <stdlib.h>
+#include <errno.h>
 #include <sys/wait.h>
 #include <api/debug.h>
 #include <linux/kernel.h>
@@ -28,6 +29,7 @@ int verbose;
 bool dump_trace = false, quiet = false;
 int debug_ordered_events;
 static bool redirect_to_stderr;
+static FILE *log_file;
 int debug_data_convert;
 
 int veprintf(int level, int var, const char *fmt, va_list args)
@@ -39,6 +41,9 @@ int veprintf(int level, int var, const char *fmt, va_list args)
 			ui_helpline__vshow(fmt, args);
 		else
 			ret = vfprintf(stderr, fmt, args);
+
+		if (log_file)
+			vfprintf(log_file, fmt, args);
 	}
 
 	return ret;
@@ -220,7 +225,22 @@ int perf_debug_option(const char *str)
 			debug_data_convert = str2loglevel(vstr);
 		else if (!strcmp(opt, "stderr"))
 			redirect_to_stderr = true;
-		else {
+		else if (!strcmp(opt, "file")) {
+			if (!vstr)
+				vstr = (char *)"perf.log";
+
+			if (log_file)
+				fclose(log_file);
+
+			log_file = fopen(vstr, "a");
+			if (!log_file) {
+				pr_err("Can not create log file: %s\n",
+				       strerror(errno));
+				free(dstr);
+				return -1;
+			}
+			fprintf(log_file, "\n===========perf log===========\n");
+		} else {
 			fprintf(stderr, "unkown debug option '%s'\n", opt);
 			free(dstr);
 			return -1;
-- 
2.20.1


^ permalink raw reply related	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/2] perf: add support for logging debug messages to file
  2019-09-22  2:38 [PATCH v2 0/2] perf: add support for logging debug messages to file Changbin Du
  2019-09-22  2:38 ` [PATCH v2 1/2] perf: support multiple debug options separated by ',' Changbin Du
  2019-09-22  2:38 ` [PATCH v2 2/2] perf: add support for logging debug messages to file Changbin Du
@ 2019-09-29  7:44 ` Jiri Olsa
  2019-10-04  2:35   ` Changbin Du
  2 siblings, 1 reply; 5+ messages in thread
From: Jiri Olsa @ 2019-09-29  7:44 UTC (permalink / raw)
  To: Changbin Du
  Cc: Peter Zijlstra, Ingo Molnar, Arnaldo Carvalho de Melo,
	Alexander Shishkin, Namhyung Kim, linux-kernel

On Sun, Sep 22, 2019 at 10:38:21AM +0800, Changbin Du wrote:
> When in TUI mode, it is impossible to show all the debug messages to
> console. This make it hard to debug perf issues using debug messages.
> This patch adds support for logging debug messages to file to resolve
> this problem.
> 
> v2:
>   o specific all debug options one time.
> 
> Changbin Du (2):
>   perf: support multiple debug options separated by ','
>   perf: add support for logging debug messages to file

hi,
getting segfault with:

[jolsa@krava perf]$ ./perf --debug verbose=2,file report
build id event received for [kernel.kallsyms]: bf6ca14c03795fd67b4d88113681ba4af2b8c18a
Segmentation fault (core dumped)

jirka

> 
>  tools/perf/Documentation/perf.txt |  14 ++--
>  tools/perf/util/debug.c           | 106 ++++++++++++++++++------------
>  2 files changed, 73 insertions(+), 47 deletions(-)
> 
> -- 
> 2.20.1
> 

^ permalink raw reply	[flat|nested] 5+ messages in thread

* Re: [PATCH v2 0/2] perf: add support for logging debug messages to file
  2019-09-29  7:44 ` [PATCH v2 0/2] " Jiri Olsa
@ 2019-10-04  2:35   ` Changbin Du
  0 siblings, 0 replies; 5+ messages in thread
From: Changbin Du @ 2019-10-04  2:35 UTC (permalink / raw)
  To: Jiri Olsa
  Cc: Changbin Du, Peter Zijlstra, Ingo Molnar,
	Arnaldo Carvalho de Melo, Alexander Shishkin, Namhyung Kim,
	linux-kernel

On Sun, Sep 29, 2019 at 09:44:07AM +0200, Jiri Olsa wrote:
> On Sun, Sep 22, 2019 at 10:38:21AM +0800, Changbin Du wrote:
> > When in TUI mode, it is impossible to show all the debug messages to
> > console. This make it hard to debug perf issues using debug messages.
> > This patch adds support for logging debug messages to file to resolve
> > this problem.
> > 
> > v2:
> >   o specific all debug options one time.
> > 
> > Changbin Du (2):
> >   perf: support multiple debug options separated by ','
> >   perf: add support for logging debug messages to file
> 
> hi,
> getting segfault with:
> 
> [jolsa@krava perf]$ ./perf --debug verbose=2,file report
> build id event received for [kernel.kallsyms]: bf6ca14c03795fd67b4d88113681ba4af2b8c18a
> Segmentation fault (core dumped)
>
Hmm, this because the va_list variable cannot be used twice. I resolve this by
making stderr and file options exclusive.

> jirka
> 
> > 
> >  tools/perf/Documentation/perf.txt |  14 ++--
> >  tools/perf/util/debug.c           | 106 ++++++++++++++++++------------
> >  2 files changed, 73 insertions(+), 47 deletions(-)
> > 
> > -- 
> > 2.20.1
> > 

-- 
Cheers,
Changbin Du

^ permalink raw reply	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2019-10-04  2:35 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2019-09-22  2:38 [PATCH v2 0/2] perf: add support for logging debug messages to file Changbin Du
2019-09-22  2:38 ` [PATCH v2 1/2] perf: support multiple debug options separated by ',' Changbin Du
2019-09-22  2:38 ` [PATCH v2 2/2] perf: add support for logging debug messages to file Changbin Du
2019-09-29  7:44 ` [PATCH v2 0/2] " Jiri Olsa
2019-10-04  2:35   ` Changbin Du

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox