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>
This commit is contained in:
Lluís 2011-08-31 20:31:51 +02:00 committed by Stefan Hajnoczi
parent 03727e6a06
commit 9a82b6a590
7 changed files with 81 additions and 11 deletions

View file

@ -384,6 +384,8 @@ trace-nested-$(CONFIG_TRACE_DEFAULT) += default.o
trace-nested-$(CONFIG_TRACE_SIMPLE) += simple.o trace-nested-$(CONFIG_TRACE_SIMPLE) += simple.o
trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o trace-obj-$(CONFIG_TRACE_SIMPLE) += qemu-timer-common.o
trace-nested-$(CONFIG_TRACE_STDERR) += stderr.o
trace-nested-y += control.o trace-nested-y += control.o
trace-obj-y += $(addprefix trace/, $(trace-nested-y)) trace-obj-y += $(addprefix trace/, $(trace-nested-y))

1
configure vendored
View file

@ -3078,6 +3078,7 @@ if test "$trace_backend" = "simple"; then
fi fi
if test "$trace_backend" = "stderr"; then if test "$trace_backend" = "stderr"; then
echo "CONFIG_TRACE_STDERR=y" >> $config_host_mak echo "CONFIG_TRACE_STDERR=y" >> $config_host_mak
trace_default=no
fi fi
if test "$trace_backend" = "ust"; then if test "$trace_backend" = "ust"; then
echo "CONFIG_TRACE_UST=y" >> $config_host_mak echo "CONFIG_TRACE_UST=y" >> $config_host_mak

View file

@ -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 This is the simplest backend and can be used together with existing code that
uses DPRINTF(). 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 === === Simpletrace ===
The "simple" backend supports common use cases and comes as part of the QEMU The "simple" backend supports common use cases and comes as part of the QEMU

View file

@ -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) The file must contain one event name (as listed in the @var{trace-events} file)
per line. 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} @item file=@var{file}
Log output traces to @var{file}. Log output traces to @var{file}.

View file

@ -241,7 +241,12 @@ linetoh_begin_stderr()
{ {
cat <<EOF cat <<EOF
#include <stdio.h> #include <stdio.h>
#include "trace/stderr.h"
extern TraceEvent trace_list[];
EOF EOF
stderr_event_num=0
} }
linetoh_stderr() linetoh_stderr()
@ -260,29 +265,47 @@ linetoh_stderr()
cat <<EOF cat <<EOF
static inline void trace_$name($args) 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 EOF
stderr_event_num=$((stderr_event_num + 1))
} }
linetoh_end_stderr() linetoh_end_stderr()
{ {
return cat <<EOF
#define NR_TRACE_EVENTS $stderr_event_num
EOF
} }
linetoc_begin_stderr() linetoc_begin_stderr()
{ {
return cat <<EOF
#include "trace.h"
TraceEvent trace_list[] = {
EOF
stderr_event_num=0
} }
linetoc_stderr() 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() linetoc_end_stderr()
{ {
return cat <<EOF
};
EOF
} }
#END OF STDERR #END OF STDERR

37
trace/stderr.c Normal file
View file

@ -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;
}

11
trace/stderr.h Normal file
View file

@ -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 */