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:
parent
fc76410539
commit
31965ae27b
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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,
|
||||||
},
|
},
|
||||||
|
|
Loading…
Reference in New Issue