Commit 7a87a7b3 authored by Peter Maydell's avatar Peter Maydell
Browse files

Merge remote-tracking branch 'remotes/stefanha/tags/tracing-pull-request' into staging



Tracing pull request

# gpg: Signature made Wed 19 Feb 2014 15:42:20 GMT using RSA key ID 81AB73C8
# gpg: Good signature from "Stefan Hajnoczi <stefanha@redhat.com>"
# gpg:                 aka "Stefan Hajnoczi <stefanha@gmail.com>"
# gpg: WARNING: This key is not certified with a trusted signature!
# gpg:          There is no indication that the signature belongs to the owner.
# Primary key fingerprint: 8695 A8BF D3F9 7CDA AC35  775A 9CA4 ABB3 81AB 73C8

* remotes/stefanha/tags/tracing-pull-request:
  trace-events: Fix typo in "offset"
  Add ust generated files to .gitignore
  Update documentation for LTTng ust tracing
  Adapt Makefiles to the new LTTng ust interface
  Modified the tracetool framework for LTTng 2.x
  Fix configure script for LTTng 2.x

Signed-off-by: default avatarPeter Maydell <peter.maydell@linaro.org>
parents e607784f 94783de6
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -10,6 +10,8 @@
/trace/generated-tracers.dtrace
/trace/generated-events.h
/trace/generated-events.c
/trace/generated-ust-provider.h
/trace/generated-ust.c
/libcacard/trace/generated-tracers.c
*-timestamp
/*-softmmu
+5 −0
Original line number Diff line number Diff line
@@ -57,6 +57,11 @@ GENERATED_HEADERS += trace/generated-tracers-dtrace.h
endif
GENERATED_SOURCES += trace/generated-tracers.c

ifeq ($(TRACE_BACKEND),ust)
GENERATED_HEADERS += trace/generated-ust-provider.h
GENERATED_SOURCES += trace/generated-ust.c
endif

# Don't try to regenerate Makefile or configure
# We don't generate any of them
Makefile: ;
+15 −5
Original line number Diff line number Diff line
@@ -3379,15 +3379,25 @@ fi
# For 'ust' backend, test if ust headers are present
if test "$trace_backend" = "ust"; then
  cat > $TMPC << EOF
#include <ust/tracepoint.h>
#include <ust/marker.h>
#include <lttng/tracepoint.h>
int main(void) { return 0; }
EOF
  if compile_prog "" "" ; then
    LIBS="-lust -lurcu-bp $LIBS"
    libs_qga="-lust -lurcu-bp $libs_qga"
    if $pkg_config lttng-ust --exists; then
      lttng_ust_libs=`$pkg_config --libs lttng-ust`
    else
    error_exit "Trace backend 'ust' missing libust header files"
      lttng_ust_libs="-llttng-ust"
    fi
    if $pkg_config liburcu-bp --exists; then
      urcu_bp_libs=`$pkg_config --libs liburcu-bp`
    else
      urcu_bp_libs="-lurcu-bp"
    fi

    LIBS="$lttng_ust_libs $urcu_bp_libs $LIBS"
    libs_qga="$lttng_ust_libs $urcu_bp_libs $libs_qga"
  else
    error_exit "Trace backend 'ust' missing lttng-ust header files"
  fi
fi

+36 −0
Original line number Diff line number Diff line
@@ -214,6 +214,42 @@ The "ust" backend uses the LTTng Userspace Tracer library. There are no
monitor commands built into QEMU, instead UST utilities should be used to list,
enable/disable, and dump traces.

Package lttng-tools is required for userspace tracing. You must ensure that the
current user belongs to the "tracing" group, or manually launch the
lttng-sessiond daemon for the current user prior to running any instance of
QEMU.

While running an instrumented QEMU, LTTng should be able to list all available
events:

    lttng list -u

Create tracing session:

    lttng create mysession

Enable events:

    lttng enable-event qemu:g_malloc -u

Where the events can either be a comma-separated list of events, or "-a" to
enable all tracepoint events. Start and stop tracing as needed:

    lttng start
    lttng stop

View the trace:

    lttng view

Destroy tracing session:

    lttng destroy

Babeltrace can be used at any later time to view the trace:

    babeltrace $HOME/lttng-traces/mysession-<date>-<time>

=== SystemTap ===

The "dtrace" backend uses DTrace sdt probes but has only been tested with
+45 −56
Original line number Diff line number Diff line
@@ -18,76 +18,65 @@ from tracetool import out

PUBLIC = True


def c(events):
    out('#include <ust/marker.h>',
        '#undef mutex_lock',
        '#undef mutex_unlock',
        '#undef inline',
        '#undef wmb',
        '#include "trace.h"')
    pass


def h(events):
    out('#include <lttng/tracepoint.h>',
        '#include "trace/generated-ust-provider.h"',
        '')
    for e in events:
        argnames = ", ".join(e.args.names())
        if len(e.args) > 0:
            argnames = ', ' + argnames
            argnames = ", " + argnames

            out('DEFINE_TRACE(ust_%(name)s);',
                '',
                'static void ust_%(name)s_probe(%(args)s)',
        out('static inline void trace_%(name)s(%(args)s)',
            '{',
                '    trace_mark(ust, %(name)s, %(fmt)s%(argnames)s);',
            '    tracepoint(qemu, %(name)s%(tp_args)s);',
            '}',
                name = e.name,
                args = e.args,
                fmt = e.fmt,
                argnames = argnames,
                )

        else:
            out('DEFINE_TRACE(ust_%(name)s);',
            '',
                'static void ust_%(name)s_probe(%(args)s)',
                '{',
                '    trace_mark(ust, %(name)s, UST_MARKER_NOARGS);',
                '}',
            name = e.name,
            args = e.args,
            tp_args = argnames,
            )

    # register probes
    out('',
        'static void __attribute__((constructor)) trace_init(void)',
        '{')
def ust_events_c(events):
    pass

def ust_events_h(events):
    for e in events:
        out('    register_trace_ust_%(name)s(ust_%(name)s_probe);',
        if len(e.args) > 0:
            out('TRACEPOINT_EVENT(',
                '   qemu,',
                '   %(name)s,',
                '   TP_ARGS(%(args)s),',
                '   TP_FIELDS(',
                name = e.name,
                args = ", ".join(", ".join(i) for i in e.args),
                )

    out('}')

            for t,n in e.args:
                if ('int' in t) or ('long' in t) or ('unsigned' in t) or ('size_t' in t):
                    out('       ctf_integer(' + t + ', ' + n + ', ' + n + ')')
                elif ('double' in t) or ('float' in t):
                    out('       ctf_float(' + t + ', ' + n + ', ' + n + ')')
                elif ('char *' in t) or ('char*' in t):
                    out('       ctf_string(' + n + ', ' + n + ')')
                elif ('void *' in t) or ('void*' in t):
                    out('       ctf_integer_hex(unsigned long, ' + n + ', ' + n + ')')

def h(events):
    out('#include <ust/tracepoint.h>',
        '#undef mutex_lock',
        '#undef mutex_unlock',
        '#undef inline',
        '#undef wmb')

    for e in events:
        if len(e.args) > 0:
            out('DECLARE_TRACE(ust_%(name)s, TP_PROTO(%(args)s), TP_ARGS(%(argnames)s));',
                '#define trace_%(name)s trace_ust_%(name)s',
                name = e.name,
                args = e.args,
                argnames = ", ".join(e.args.names()),
                )
            out('   )',
                ')',
                '')

        else:
            out('_DECLARE_TRACEPOINT_NOARGS(ust_%(name)s);',
                '#define trace_%(name)s trace_ust_%(name)s',
            out('TRACEPOINT_EVENT(',
                '   qemu,',
                '   %(name)s,',
                '   TP_ARGS(void),',
                '   TP_FIELDS()',
                ')',
                '',
                name = e.name,
                )
 No newline at end of file

    out()
Loading