diff options
author | Lluís <xscript@gmx.net> | 2011-08-31 20:31:51 +0200 |
---|---|---|
committer | Stefan Hajnoczi <stefanha@linux.vnet.ibm.com> | 2011-09-01 10:34:54 +0100 |
commit | 9a82b6a590bd7c845ab9754b34b33ffee982ccb2 (patch) | |
tree | c23b7078b7db55c798577eb28f281873a5d2062c | |
parent | 03727e6a06087dc8f46d5674b4b29262bf7377a4 (diff) |
trace: [stderr] add support for dynamically enabling/disabling events
Uses the generic interface provided in "trace/control.h" in order to provide
a programmatic interface as well as command line and monitor controls.
Signed-off-by: Fabien Chouteau <chouteau@adacore.com>
Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
-rw-r--r-- | Makefile.objs | 2 | ||||
-rwxr-xr-x | configure | 1 | ||||
-rw-r--r-- | docs/tracing.txt | 5 | ||||
-rw-r--r-- | qemu-options.hx | 3 | ||||
-rwxr-xr-x | scripts/tracetool | 33 | ||||
-rw-r--r-- | trace/stderr.c | 37 | ||||
-rw-r--r-- | trace/stderr.h | 11 |
7 files changed, 81 insertions, 11 deletions
diff --git a/Makefile.objs b/Makefile.objs index 036a4eb6ab..26b885bfeb 100644 --- a/Makefile.objs +++ b/Makefile.objs @@ -384,6 +384,8 @@ trace-nested-$(CONFIG_TRACE_DEFAULT) += default.o trace-nested-$(CONFIG_TRACE_SIMPLE) += simple.o trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o +trace-nested-$(CONFIG_TRACE_STDERR) += stderr.o + trace-nested-y += control.o trace-obj-y += $(addprefix trace/, $(trace-nested-y)) @@ -3078,6 +3078,7 @@ if test "$trace_backend" = "simple"; then fi if test "$trace_backend" = "stderr"; then echo "CONFIG_TRACE_STDERR=y" >> $config_host_mak + trace_default=no fi if test "$trace_backend" = "ust"; then echo "CONFIG_TRACE_UST=y" >> $config_host_mak diff --git a/docs/tracing.txt b/docs/tracing.txt index d1d4e8cba2..4b27ab0c2a 100644 --- a/docs/tracing.txt +++ b/docs/tracing.txt @@ -178,11 +178,6 @@ effectively turns trace events into debug printfs. This is the simplest backend and can be used together with existing code that uses DPRINTF(). -Note that with this backend trace events cannot be programmatically -enabled/disabled. Thus, in order to trim down the amount of output and the -performance impact of tracing, you might want to add the "disable" property in -the "trace-events" file for those events you are not interested in. - === Simpletrace === The "simple" backend supports common use cases and comes as part of the QEMU diff --git a/qemu-options.hx b/qemu-options.hx index edd181bb8e..f672365e42 100644 --- a/qemu-options.hx +++ b/qemu-options.hx @@ -2454,7 +2454,8 @@ 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 only available when using the @var{simple} tracing backend. +This option is only available when using the @var{simple} and @var{stderr} +tracing backends. @item file=@var{file} Log output traces to @var{file}. diff --git a/scripts/tracetool b/scripts/tracetool index c740080ebb..743d246289 100755 --- a/scripts/tracetool +++ b/scripts/tracetool @@ -241,7 +241,12 @@ linetoh_begin_stderr() { cat <<EOF #include <stdio.h> +#include "trace/stderr.h" + +extern TraceEvent trace_list[]; EOF + + stderr_event_num=0 } linetoh_stderr() @@ -260,29 +265,47 @@ linetoh_stderr() cat <<EOF static inline void trace_$name($args) { - fprintf(stderr, "$name $fmt\n" $argnames); + if (trace_list[$stderr_event_num].state != 0) { + fprintf(stderr, "$name $fmt\n" $argnames); + } } EOF + stderr_event_num=$((stderr_event_num + 1)) + } linetoh_end_stderr() { -return + cat <<EOF +#define NR_TRACE_EVENTS $stderr_event_num +EOF } linetoc_begin_stderr() { -return + cat <<EOF +#include "trace.h" + +TraceEvent trace_list[] = { +EOF + stderr_event_num=0 } linetoc_stderr() { -return + local name + name=$(get_name "$1") + cat <<EOF +{.tp_name = "$name", .state=0}, +EOF + stderr_event_num=$(($stderr_event_num + 1)) } linetoc_end_stderr() { -return + cat <<EOF +}; +EOF } #END OF STDERR diff --git a/trace/stderr.c b/trace/stderr.c new file mode 100644 index 0000000000..7107c4a131 --- /dev/null +++ b/trace/stderr.c @@ -0,0 +1,37 @@ +#include "trace.h" +#include "trace/control.h" + + +void trace_print_events(FILE *stream, fprintf_function stream_printf) +{ + unsigned int i; + + for (i = 0; i < NR_TRACE_EVENTS; i++) { + stream_printf(stream, "%s [Event ID %u] : state %u\n", + trace_list[i].tp_name, i, trace_list[i].state); + } +} + +bool trace_event_set_state(const char *name, bool state) +{ + unsigned int i; + + for (i = 0; i < NR_TRACE_EVENTS; i++) { + if (!strcmp(trace_list[i].tp_name, name)) { + trace_list[i].state = state; + return true; + } + } + return false; +} + +bool trace_backend_init(const char *events, const char *file) +{ + if (file) { + fprintf(stderr, "error: -trace file=...: " + "option not supported by the selected tracing backend\n"); + return false; + } + trace_backend_init_events(events); + return true; +} diff --git a/trace/stderr.h b/trace/stderr.h new file mode 100644 index 0000000000..d575b613e3 --- /dev/null +++ b/trace/stderr.h @@ -0,0 +1,11 @@ +#ifndef TRACE_STDERR_H +#define TRACE_STDERR_H + +typedef uint64_t TraceEventID; + +typedef struct { + const char *tp_name; + bool state; +} TraceEvent; + +#endif /* ! TRACE_STDERR_H */ |