Skip to content

Commit

Permalink
trace: always compile support for controlling and querying trace even…
Browse files Browse the repository at this point in the history
…t 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>
  • Loading branch information
Lluís authored and Stefan Hajnoczi committed Sep 1, 2011
1 parent fc76410 commit 31965ae
Show file tree
Hide file tree
Showing 3 changed files with 40 additions and 24 deletions.
48 changes: 30 additions & 18 deletions docs/tracing.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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
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 ==

The "tracetool" script automates tedious trace event code generation and also
Expand Down Expand Up @@ -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
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>
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 ====

The "simple" backend produces binary trace files that can be formatted with the
Expand Down
7 changes: 5 additions & 2 deletions hmp-commands.hx
Original file line number Diff line number Diff line change
Expand Up @@ -180,7 +180,6 @@ STEXI
Output logs to @var{filename}.
ETEXI

#ifdef CONFIG_TRACE_SIMPLE
{
.name = "trace-event",
.args_type = "name:s,option:b",
Expand All @@ -195,6 +194,7 @@ STEXI
changes status of a trace event
ETEXI

#if defined(CONFIG_SIMPLE_TRACE)
{
.name = "trace-file",
.args_type = "op:s?,arg:F?",
Expand Down Expand Up @@ -1358,10 +1358,13 @@ ETEXI
STEXI
@item info trace
show contents of trace buffer
ETEXI
#endif

STEXI
@item info trace-events
show available trace events and their state
ETEXI
#endif

STEXI
@end table
Expand Down
9 changes: 5 additions & 4 deletions monitor.c
Original file line number Diff line number Diff line change
Expand Up @@ -57,8 +57,9 @@
#include "json-parser.h"
#include "osdep.h"
#include "cpu.h"
#include "trace/control.h"
#ifdef CONFIG_TRACE_SIMPLE
#include "trace.h"
#include "trace/simple.h"
#endif
#include "trace/control.h"
#include "ui/qemu-spice.h"
Expand Down Expand Up @@ -593,7 +594,6 @@ static void do_help_cmd(Monitor *mon, const QDict *qdict)
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)
{
const char *tp_name = qdict_get_str(qdict, "name");
Expand All @@ -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)
{
const char *op = qdict_get_try_str(qdict, "op");
Expand Down Expand Up @@ -1002,12 +1003,12 @@ static void do_info_trace(Monitor *mon)
{
st_print_trace((FILE *)mon, &monitor_fprintf);
}
#endif

static void do_trace_print_events(Monitor *mon)
{
trace_print_events((FILE *)mon, &monitor_fprintf);
}
#endif

/**
* do_quit(): Quit QEMU execution
Expand Down Expand Up @@ -3144,14 +3145,14 @@ static const mon_cmd_t info_cmds[] = {
.help = "show current contents of trace buffer",
.mhandler.info = do_info_trace,
},
#endif
{
.name = "trace-events",
.args_type = "",
.params = "",
.help = "show available trace-events & their state",
.mhandler.info = do_trace_print_events,
},
#endif
{
.name = NULL,
},
Expand Down

0 comments on commit 31965ae

Please sign in to comment.