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-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
1
configure
vendored
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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}.
|
||||||
|
|
||||||
|
@ -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
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