trace: always compile support for controlling and querying trace event states

The current interface is generic for this small set of operations, and thus
other backends can easily modify the "trace/control.c" file to add their own
implementation.

Signed-off-by: Lluís Vilanova <vilanova@ac.upc.edu>
This commit is contained in:
Lluís 2011-08-31 20:31:24 +02:00 committed by Stefan Hajnoczi
parent fc76410539
commit 31965ae27b
3 changed files with 41 additions and 25 deletions

View File

@ -108,6 +108,36 @@ portability macros, ensure they are preceded and followed by double quotes:
of trace events. Marking trace events disabled by default saves the user of trace events. Marking trace events disabled by default saves the user
from having to manually disable noisy trace events. from having to manually disable noisy trace events.
== Generic interface and monitor commands ==
You can programmatically query and control the dynamic state of trace events
through a backend-agnostic interface:
* trace_print_events
* trace_event_set_state
Enables or disables trace events at runtime inside QEMU.
The function returns "true" if the state of the event has been successfully
changed, or "false" otherwise:
#include "trace/control.h"
trace_event_set_state("virtio_irq", true); /* enable */
[...]
trace_event_set_state("virtio_irq", false); /* disable */
Note that some of the backends do not provide an implementation for this
interface, in which case QEMU will just print a warning.
This functionality is also provided through monitor commands:
* info trace-events
View available trace events and their state. State 1 means enabled, state 0
means disabled.
* trace-event NAME on|off
Enable/disable a given trace event.
== Trace backends == == Trace backends ==
The "tracetool" script automates tedious trace event code generation and also The "tracetool" script automates tedious trace event code generation and also
@ -157,27 +187,9 @@ unless you have specific needs for more advanced backends.
flushed and emptied. This means the 'info trace' will display few or no flushed and emptied. This means the 'info trace' will display few or no
entries if the buffer has just been flushed. entries if the buffer has just been flushed.
* info trace-events
View available trace events and their state. State 1 means enabled, state 0
means disabled.
* trace-event NAME on|off
Enable/disable a given trace event.
* trace-file on|off|flush|set <path> * trace-file on|off|flush|set <path>
Enable/disable/flush the trace file or set the trace file name. Enable/disable/flush the trace file or set the trace file name.
==== Enabling/disabling trace events programmatically ====
The st_change_trace_event_state() function can be used to enable or disable trace
events at runtime inside QEMU:
#include "trace.h"
st_change_trace_event_state("virtio_irq", true); /* enable */
[...]
st_change_trace_event_state("virtio_irq", false); /* disable */
==== Analyzing trace files ==== ==== Analyzing trace files ====
The "simple" backend produces binary trace files that can be formatted with the The "simple" backend produces binary trace files that can be formatted with the

View File

@ -180,7 +180,6 @@ STEXI
Output logs to @var{filename}. Output logs to @var{filename}.
ETEXI ETEXI
#ifdef CONFIG_TRACE_SIMPLE
{ {
.name = "trace-event", .name = "trace-event",
.args_type = "name:s,option:b", .args_type = "name:s,option:b",
@ -195,6 +194,7 @@ STEXI
changes status of a trace event changes status of a trace event
ETEXI ETEXI
#if defined(CONFIG_SIMPLE_TRACE)
{ {
.name = "trace-file", .name = "trace-file",
.args_type = "op:s?,arg:F?", .args_type = "op:s?,arg:F?",
@ -1358,11 +1358,14 @@ ETEXI
STEXI STEXI
@item info trace @item info trace
show contents of trace buffer show contents of trace buffer
@item info trace-events
show available trace events and their state
ETEXI ETEXI
#endif #endif
STEXI
@item info trace-events
show available trace events and their state
ETEXI
STEXI STEXI
@end table @end table
ETEXI ETEXI

View File

@ -57,8 +57,9 @@
#include "json-parser.h" #include "json-parser.h"
#include "osdep.h" #include "osdep.h"
#include "cpu.h" #include "cpu.h"
#include "trace/control.h"
#ifdef CONFIG_TRACE_SIMPLE #ifdef CONFIG_TRACE_SIMPLE
#include "trace.h" #include "trace/simple.h"
#endif #endif
#include "trace/control.h" #include "trace/control.h"
#include "ui/qemu-spice.h" #include "ui/qemu-spice.h"
@ -593,7 +594,6 @@ static void do_help_cmd(Monitor *mon, const QDict *qdict)
help_cmd(mon, qdict_get_try_str(qdict, "name")); help_cmd(mon, qdict_get_try_str(qdict, "name"));
} }
#ifdef CONFIG_TRACE_SIMPLE
static void do_trace_event_set_state(Monitor *mon, const QDict *qdict) static void do_trace_event_set_state(Monitor *mon, const QDict *qdict)
{ {
const char *tp_name = qdict_get_str(qdict, "name"); const char *tp_name = qdict_get_str(qdict, "name");
@ -605,6 +605,7 @@ static void do_trace_event_set_state(Monitor *mon, const QDict *qdict)
} }
} }
#ifdef CONFIG_SIMPLE_TRACE
static void do_trace_file(Monitor *mon, const QDict *qdict) static void do_trace_file(Monitor *mon, const QDict *qdict)
{ {
const char *op = qdict_get_try_str(qdict, "op"); const char *op = qdict_get_try_str(qdict, "op");
@ -1002,12 +1003,12 @@ static void do_info_trace(Monitor *mon)
{ {
st_print_trace((FILE *)mon, &monitor_fprintf); st_print_trace((FILE *)mon, &monitor_fprintf);
} }
#endif
static void do_trace_print_events(Monitor *mon) static void do_trace_print_events(Monitor *mon)
{ {
trace_print_events((FILE *)mon, &monitor_fprintf); trace_print_events((FILE *)mon, &monitor_fprintf);
} }
#endif
/** /**
* do_quit(): Quit QEMU execution * do_quit(): Quit QEMU execution
@ -3144,6 +3145,7 @@ static const mon_cmd_t info_cmds[] = {
.help = "show current contents of trace buffer", .help = "show current contents of trace buffer",
.mhandler.info = do_info_trace, .mhandler.info = do_info_trace,
}, },
#endif
{ {
.name = "trace-events", .name = "trace-events",
.args_type = "", .args_type = "",
@ -3151,7 +3153,6 @@ static const mon_cmd_t info_cmds[] = {
.help = "show available trace-events & their state", .help = "show available trace-events & their state",
.mhandler.info = do_trace_print_events, .mhandler.info = do_trace_print_events,
}, },
#endif
{ {
.name = NULL, .name = NULL,
}, },