diff mbox

[v5,06/10] trace-state: add "-trace events" argument to control initial state

Message ID 20110628165334.23482.6251.stgit@ginnungagap.bsc.es
State New
Headers show

Commit Message

=?utf-8?Q?Llu=C3=ADs?= June 28, 2011, 4:53 p.m. UTC
The "-trace events" argument can be used to provide a file with a list of trace
event names that will be enabled prior to starting execution, thus providing
early tracing.

This saves the user from manually toggling event states through the monitor
interface or whichever backend-specific interface.

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
---
 docs/tracing.txt |    3 +++
 qemu-config.c    |    3 +++
 qemu-options.hx  |   24 ++++++++++++++++++------
 trace/control.c  |   30 ++++++++++++++++++++++++++++++
 trace/control.h  |    2 ++
 vl.c             |    2 ++
 6 files changed, 58 insertions(+), 6 deletions(-)

Comments

Stefan Hajnoczi July 15, 2011, 9:40 a.m. UTC | #1
On Tue, Jun 28, 2011 at 06:53:34PM +0200, Lluís wrote:
> diff --git a/docs/tracing.txt b/docs/tracing.txt
> index 017ff59..8f6e5c9 100644
> --- a/docs/tracing.txt
> +++ b/docs/tracing.txt
> @@ -129,6 +129,9 @@ This functionality is also provided through monitor commands:
>  * trace-event NAME on|off
>    Enable/disable a given trace event.
>  
> +The "-trace events=<file>" command line argument can be used to enable the
> +events listed in <file> from the very beginning of the program.

Please document the syntax of the file: one event name per line.

> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -2394,17 +2394,29 @@ Normally QEMU loads a configuration file from @var{sysconfdir}/qemu.conf and
>  option will prevent QEMU from loading these configuration files at startup.
>  ETEXI
>  DEF("trace", HAS_ARG, QEMU_OPTION_trace,
> -    "-trace\n"
> -    "                Specify a trace file to log traces to\n",
> +    "-trace [events=<file>][,file=<file>]\n"
> +    "                specify tracing options\n",
>      QEMU_ARCH_ALL)
>  STEXI
> -HXCOMM This line is not accurate, as the option is backend-specific but HX does
> -HXCOMM not support conditional compilation of text.
> -@item -trace
> +HXCOMM This line is not accurate, as some sub-options are backend-specific but
> +HXCOMM HX does not support conditional compilation of text.
> +@item -trace [events=@var{file}][,file=@var{file}]
>  @findex -trace
> -Specify a trace file to log output traces to.
> +
> +Specify tracing options.
> +
> +@table @option
> +@item events=@var{file}
> +Immediately enable events listed in @var{file}.
> +The file must contain one event name (as listed in the @var{trace-events} file)
> +per line.
> +
> +This option is not available when using the @var{nop} tracing backend.
> +@item file=@var{file}

This option is only available when using the @var{simple} tracing
backend.

(nop, ust, dtrace, stderr don't support it)

Stefan
diff mbox

Patch

diff --git a/docs/tracing.txt b/docs/tracing.txt
index 017ff59..8f6e5c9 100644
--- a/docs/tracing.txt
+++ b/docs/tracing.txt
@@ -129,6 +129,9 @@  This functionality is also provided through monitor commands:
 * trace-event NAME on|off
   Enable/disable a given trace event.
 
+The "-trace events=<file>" command line argument can be used to enable the
+events listed in <file> from the very beginning of the program.
+
 == Trace backends ==
 
 The "tracetool" script automates tedious trace event code generation and also
diff --git a/qemu-config.c b/qemu-config.c
index d187dc5..3fae102 100644
--- a/qemu-config.c
+++ b/qemu-config.c
@@ -302,6 +302,9 @@  static QemuOptsList qemu_trace_opts = {
     .head = QTAILQ_HEAD_INITIALIZER(qemu_trace_opts.head),
     .desc = {
         {
+            .name = "events",
+            .type = QEMU_OPT_STRING,
+        },{
             .name = "file",
             .type = QEMU_OPT_STRING,
         },
diff --git a/qemu-options.hx b/qemu-options.hx
index b691e13..7e7b1f7 100644
--- a/qemu-options.hx
+++ b/qemu-options.hx
@@ -2394,17 +2394,29 @@  Normally QEMU loads a configuration file from @var{sysconfdir}/qemu.conf and
 option will prevent QEMU from loading these configuration files at startup.
 ETEXI
 DEF("trace", HAS_ARG, QEMU_OPTION_trace,
-    "-trace\n"
-    "                Specify a trace file to log traces to\n",
+    "-trace [events=<file>][,file=<file>]\n"
+    "                specify tracing options\n",
     QEMU_ARCH_ALL)
 STEXI
-HXCOMM This line is not accurate, as the option is backend-specific but HX does
-HXCOMM not support conditional compilation of text.
-@item -trace
+HXCOMM This line is not accurate, as some sub-options are backend-specific but
+HXCOMM HX does not support conditional compilation of text.
+@item -trace [events=@var{file}][,file=@var{file}]
 @findex -trace
-Specify a trace file to log output traces to.
+
+Specify tracing options.
+
+@table @option
+@item events=@var{file}
+Immediately enable events listed in @var{file}.
+The file must contain one event name (as listed in the @var{trace-events} file)
+per line.
+
+This option is not available when using the @var{nop} tracing backend.
+@item file=@var{file}
+Log output traces to @var{file}.
 
 This option is available only when using the @var{simple} tracing backend.
+@end table
 ETEXI
 
 HXCOMM This is the last statement. Insert new options before this line!
diff --git a/trace/control.c b/trace/control.c
index 6138eab..0086f1f 100644
--- a/trace/control.c
+++ b/trace/control.c
@@ -34,3 +34,33 @@  bool trace_event_set_state (const char *name, bool state)
 #endif
     return false;
 }
+
+void trace_config_event_set_state (const char *fname)
+{
+    if (fname == NULL) {
+        return;
+    }
+
+    FILE *fp = fopen(fname, "r");
+    if (!fp) {
+        fprintf(stderr, "could not open trace events file '%s': %s\n",
+                fname, strerror(errno));
+        exit(1);
+    }
+    char line_buf[1024];
+    while (fgets(line_buf, sizeof(line_buf), fp)) {
+        size_t len = strlen(line_buf);
+        if (len > 1) {              /* skip empty lines */
+            line_buf[len - 1] = '\0';
+            if (!trace_event_set_state(line_buf, true)) {
+                fprintf(stderr, "qemu: error: trace event '%s' does not exist\n", line_buf);
+                exit(1);
+            }
+        }
+    }
+    if (fclose(fp) != 0) {
+        fprintf(stderr, "qemu: error: closing file '%s': %s\n",
+                fname, strerror(errno));
+        exit(1);
+    }
+}
diff --git a/trace/control.h b/trace/control.h
index 37d3aa0..48f4b01 100644
--- a/trace/control.h
+++ b/trace/control.h
@@ -11,4 +11,6 @@ 
 void trace_print_events (FILE *stream, fprintf_function stream_printf);
 bool trace_event_set_state (const char *name, bool state);
 
+void trace_config_event_set_state (const char *fname);
+
 #endif  /* TRACE_CONTROL_H */
diff --git a/vl.c b/vl.c
index b766dc7..c95b186 100644
--- a/vl.c
+++ b/vl.c
@@ -156,6 +156,7 @@  int main(int argc, char **argv)
 #include "slirp/libslirp.h"
 
 #include "trace.h"
+#include "trace/control.h"
 #include "trace/simple.h"
 #include "qemu-queue.h"
 #include "cpus.h"
@@ -2870,6 +2871,7 @@  int main(int argc, char **argv, char **envp)
                 fprintf(stderr, "qemu: option \"-%s\" is not supported by this tracing backend\n", popt->name);
                 exit(1);
 #endif
+                trace_config_event_set_state(qemu_opt_get(opts, "events"));
                 trace_file = qemu_opt_get(opts, "file");
 #if !defined(CONFIG_SIMPLE_TRACE)
                 if (trace_file) {