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:
parent
03727e6a06
commit
9a82b6a590
@ -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))
|
||||
|
1
configure
vendored
1
configure
vendored
@ -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
|
||||
|
@ -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
|
||||
|
@ -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}.
|
||||
|
||||
|
@ -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
|
||||
|
||||
|
37
trace/stderr.c
Normal file
37
trace/stderr.c
Normal 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
11
trace/stderr.h
Normal 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 */
|
Loading…
Reference in New Issue
Block a user