Tracing pull request
-----BEGIN PGP SIGNATURE----- Version: GnuPG v1 iQEcBAABAgAGBQJTBNDcAAoJEJykq7OBq3PISEMIAIrJN9RTfpeAaUY4bSj9Q283 ReAgkTbe1yhuvik8E3sN9OOm24EfD9o2mE3Io2Jq1tslgM0yDXcuBoIT6rrmwF3L MLRtE89JIStv1JbNyeorTgS8N/6kY0evKkmG8kskwHS3QVCKo3+OsPz7D6JNQrdA KQNJZa19DVIfdgBGCD1HuGOVgCIe3rrGOc16/XvPuK3CXACyvfEO7B/1YStSXBu5 QmtccRMzCo7Xt6PwAvq4RclNa45lnjVvv0lcyApdajn/zFGBzXmK19NrMhDDHQC+ fLS3fmWQCo3dFeVwoyfUhamt3wxD3Mpp5PYEytJ5EOmv+UPuCQ1/8SQJjxxKESo= =sVTF -----END PGP SIGNATURE----- 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: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
7a87a7b3e4
2
.gitignore
vendored
2
.gitignore
vendored
@ -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
Makefile
5
Makefile
@ -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: ;
|
||||
|
20
configure
vendored
20
configure
vendored
@ -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
|
||||
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 libust header files"
|
||||
error_exit "Trace backend 'ust' missing lttng-ust header files"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
@ -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
|
||||
|
@ -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"')
|
||||
|
||||
for e in events:
|
||||
argnames = ", ".join(e.args.names())
|
||||
if len(e.args) > 0:
|
||||
argnames = ', ' + argnames
|
||||
|
||||
out('DEFINE_TRACE(ust_%(name)s);',
|
||||
'',
|
||||
'static void ust_%(name)s_probe(%(args)s)',
|
||||
'{',
|
||||
' trace_mark(ust, %(name)s, %(fmt)s%(argnames)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,
|
||||
)
|
||||
|
||||
# register probes
|
||||
out('',
|
||||
'static void __attribute__((constructor)) trace_init(void)',
|
||||
'{')
|
||||
|
||||
for e in events:
|
||||
out(' register_trace_ust_%(name)s(ust_%(name)s_probe);',
|
||||
name = e.name,
|
||||
)
|
||||
|
||||
out('}')
|
||||
pass
|
||||
|
||||
|
||||
def h(events):
|
||||
out('#include <ust/tracepoint.h>',
|
||||
'#undef mutex_lock',
|
||||
'#undef mutex_unlock',
|
||||
'#undef inline',
|
||||
'#undef wmb')
|
||||
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
|
||||
|
||||
out('static inline void trace_%(name)s(%(args)s)',
|
||||
'{',
|
||||
' tracepoint(qemu, %(name)s%(tp_args)s);',
|
||||
'}',
|
||||
'',
|
||||
name = e.name,
|
||||
args = e.args,
|
||||
tp_args = argnames,
|
||||
)
|
||||
|
||||
def ust_events_c(events):
|
||||
pass
|
||||
|
||||
def ust_events_h(events):
|
||||
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',
|
||||
out('TRACEPOINT_EVENT(',
|
||||
' qemu,',
|
||||
' %(name)s,',
|
||||
' TP_ARGS(%(args)s),',
|
||||
' TP_FIELDS(',
|
||||
name = e.name,
|
||||
args = e.args,
|
||||
argnames = ", ".join(e.args.names()),
|
||||
args = ", ".join(", ".join(i) for i in e.args),
|
||||
)
|
||||
|
||||
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 + ')')
|
||||
|
||||
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,
|
||||
)
|
||||
|
||||
out()
|
||||
)
|
30
scripts/tracetool/format/ust_events_c.py
Normal file
30
scripts/tracetool/format/ust_events_c.py
Normal file
@ -0,0 +1,30 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Generate .c for LTTng ust event description.
|
||||
"""
|
||||
|
||||
__author__ = "Mohamad Gebai <mohamad.gebai@polymtl.ca>"
|
||||
__copyright__ = "Copyright 2012, Mohamad Gebai <mohamad.gebai@polymtl.ca>"
|
||||
__license__ = "GPL version 2 or (at your option) any later version"
|
||||
|
||||
__maintainer__ = "Stefan Hajnoczi"
|
||||
__email__ = "stefanha@redhat.com"
|
||||
|
||||
|
||||
from tracetool import out
|
||||
|
||||
|
||||
def begin(events):
|
||||
out('/* This file is autogenerated by tracetool, do not edit. */',
|
||||
'',
|
||||
'#define TRACEPOINT_DEFINE',
|
||||
'#define TRACEPOINT_CREATE_PROBES',
|
||||
'',
|
||||
'/* If gcc version 4.7 or older is used, LTTng ust gives a warning when compiling with',
|
||||
' -Wredundant-decls.',
|
||||
' */',
|
||||
'#pragma GCC diagnostic ignored "-Wredundant-decls"',
|
||||
'',
|
||||
'#include "generated-ust-provider.h"')
|
57
scripts/tracetool/format/ust_events_h.py
Normal file
57
scripts/tracetool/format/ust_events_h.py
Normal file
@ -0,0 +1,57 @@
|
||||
#!/usr/bin/env python
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
"""
|
||||
Generate .h for LTTng ust event description.
|
||||
"""
|
||||
|
||||
__author__ = "Mohamad Gebai <mohamad.gebai@polymtl.ca>"
|
||||
__copyright__ = "Copyright 2012, Mohamad Gebai <mohamad.gebai@polymtl.ca>"
|
||||
__license__ = "GPL version 2 or (at your option) any later version"
|
||||
|
||||
__maintainer__ = "Stefan Hajnoczi"
|
||||
__email__ = "stefanha@redhat.com"
|
||||
|
||||
|
||||
from tracetool import out
|
||||
|
||||
|
||||
def begin(events):
|
||||
out('/* This file is autogenerated by tracetool, do not edit. */',
|
||||
'',
|
||||
'#undef TRACEPOINT_PROVIDER',
|
||||
'#define TRACEPOINT_PROVIDER qemu',
|
||||
'',
|
||||
'#undef TRACEPOINT_INCLUDE_FILE',
|
||||
'#define TRACEPOINT_INCLUDE_FILE ./generated-ust-provider.h',
|
||||
'',
|
||||
'#if !defined (TRACE__GENERATED_UST_H) || defined(TRACEPOINT_HEADER_MULTI_READ)',
|
||||
'#define TRACE__GENERATED_UST_H',
|
||||
'',
|
||||
'#include "qemu-common.h"',
|
||||
'#include <lttng/tracepoint.h>',
|
||||
'',
|
||||
'/*',
|
||||
' * LTTng ust 2.0 does not allow you to use TP_ARGS(void) for tracepoints',
|
||||
' * requiring no arguments. We define these macros introduced in more recent'
|
||||
' * versions of LTTng ust as a workaround',
|
||||
' */',
|
||||
'#ifndef _TP_EXPROTO1',
|
||||
'#define _TP_EXPROTO1(a) void',
|
||||
'#endif',
|
||||
'#ifndef _TP_EXDATA_PROTO1',
|
||||
'#define _TP_EXDATA_PROTO1(a) void *__tp_data',
|
||||
'#endif',
|
||||
'#ifndef _TP_EXDATA_VAR1',
|
||||
'#define _TP_EXDATA_VAR1(a) __tp_data',
|
||||
'#endif',
|
||||
'#ifndef _TP_EXVAR1',
|
||||
'#define _TP_EXVAR1(a)',
|
||||
'#endif',
|
||||
'')
|
||||
|
||||
def end(events):
|
||||
out('#endif /* TRACE__GENERATED_UST_H */',
|
||||
'',
|
||||
'/* This part must be outside ifdef protection */',
|
||||
'#include <lttng/tracepoint-event.h>')
|
@ -495,10 +495,10 @@ qcow2_writev_done_part(void *co, int cur_nr_sectors) "co %p cur_nr_sectors %d"
|
||||
qcow2_writev_data(void *co, uint64_t offset) "co %p offset %" PRIx64
|
||||
|
||||
# block/qcow2-cluster.c
|
||||
qcow2_alloc_clusters_offset(void *co, uint64_t offset, int num) "co %p offet %" PRIx64 " num %d"
|
||||
qcow2_handle_copied(void *co, uint64_t guest_offset, uint64_t host_offset, uint64_t bytes) "co %p guest_offet %" PRIx64 " host_offset %" PRIx64 " bytes %" PRIx64
|
||||
qcow2_handle_alloc(void *co, uint64_t guest_offset, uint64_t host_offset, uint64_t bytes) "co %p guest_offet %" PRIx64 " host_offset %" PRIx64 " bytes %" PRIx64
|
||||
qcow2_do_alloc_clusters_offset(void *co, uint64_t guest_offset, uint64_t host_offset, int nb_clusters) "co %p guest_offet %" PRIx64 " host_offset %" PRIx64 " nb_clusters %d"
|
||||
qcow2_alloc_clusters_offset(void *co, uint64_t offset, int num) "co %p offset %" PRIx64 " num %d"
|
||||
qcow2_handle_copied(void *co, uint64_t guest_offset, uint64_t host_offset, uint64_t bytes) "co %p guest_offset %" PRIx64 " host_offset %" PRIx64 " bytes %" PRIx64
|
||||
qcow2_handle_alloc(void *co, uint64_t guest_offset, uint64_t host_offset, uint64_t bytes) "co %p guest_offset %" PRIx64 " host_offset %" PRIx64 " bytes %" PRIx64
|
||||
qcow2_do_alloc_clusters_offset(void *co, uint64_t guest_offset, uint64_t host_offset, int nb_clusters) "co %p guest_offset %" PRIx64 " host_offset %" PRIx64 " nb_clusters %d"
|
||||
qcow2_cluster_alloc_phys(void *co) "co %p"
|
||||
qcow2_cluster_link_l2(void *co, int nb_clusters) "co %p nb_clusters %d"
|
||||
|
||||
|
@ -1,5 +1,29 @@
|
||||
# -*- mode: makefile -*-
|
||||
|
||||
######################################################################
|
||||
# Auto-generated event descriptions for LTTng ust code
|
||||
|
||||
ifeq ($(TRACE_BACKEND),ust)
|
||||
$(obj)/generated-ust-provider.h: $(obj)/generated-ust-provider.h-timestamp
|
||||
$(obj)/generated-ust-provider.h-timestamp: $(SRC_PATH)/trace-events
|
||||
$(call quiet-command,$(TRACETOOL) \
|
||||
--format=ust-events-h \
|
||||
--backend=$(TRACE_BACKEND) \
|
||||
< $< > $@," GEN $(patsubst %-timestamp,%,$@)")
|
||||
@cmp -s $@ $(patsubst %-timestamp,%,$@) || cp $@ $(patsubst %-timestamp,%,$@)
|
||||
|
||||
$(obj)/generated-ust.c: $(obj)/generated-ust.c-timestamp $(BUILD_DIR)/config-host.mak
|
||||
$(obj)/generated-ust.c-timestamp: $(SRC_PATH)/trace-events
|
||||
$(call quiet-command,$(TRACETOOL) \
|
||||
--format=ust-events-c \
|
||||
--backend=$(TRACE_BACKEND) \
|
||||
< $< > $@," GEN $(patsubst %-timestamp,%,$@)")
|
||||
@cmp -s $@ $(patsubst %-timestamp,%,$@) || cp $@ $(patsubst %-timestamp,%,$@)
|
||||
|
||||
$(obj)/generated-events.h: $(obj)/generated-ust-provider.h
|
||||
$(obj)/generated-events.c: $(obj)/generated-ust.c
|
||||
endif
|
||||
|
||||
######################################################################
|
||||
# Auto-generated event descriptions
|
||||
|
||||
@ -77,5 +101,6 @@ util-obj-$(CONFIG_TRACE_DEFAULT) += default.o
|
||||
util-obj-$(CONFIG_TRACE_SIMPLE) += simple.o
|
||||
util-obj-$(CONFIG_TRACE_STDERR) += stderr.o
|
||||
util-obj-$(CONFIG_TRACE_FTRACE) += ftrace.o
|
||||
util-obj-$(CONFIG_TRACE_UST) += generated-ust.o
|
||||
util-obj-y += control.o
|
||||
util-obj-y += generated-tracers.o
|
||||
|
Loading…
Reference in New Issue
Block a user