mirror of https://gerrit.osmocom.org/libosmocore
initial support for static userspace probes via systemtap
This adds a --enable-systemtap configure option, which will then add static tracepoints to the generated libosmocore binary. At this point, only two tracepoints are supported: log_start and log_done. They can be used to trace the amount of time a libosmocore-using application spends in potentiall blocking calls to log to stderr or to files. Related: OS#4311 Change-Id: I7e1ab664241deb524c9582cbd1bec31af46c747e
This commit is contained in:
parent
dc43f7d3c7
commit
433005c87c
|
@ -1,7 +1,7 @@
|
||||||
ACLOCAL_AMFLAGS = -I m4
|
ACLOCAL_AMFLAGS = -I m4
|
||||||
|
|
||||||
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
|
AM_CPPFLAGS = $(all_includes) -I$(top_srcdir)/include
|
||||||
SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim src/pseudotalloc src/usb utils tests
|
SUBDIRS = include src src/vty src/codec src/gsm src/coding src/gb src/ctrl src/sim src/pseudotalloc src/usb utils tapset tests
|
||||||
|
|
||||||
pkgconfigdir = $(libdir)/pkgconfig
|
pkgconfigdir = $(libdir)/pkgconfig
|
||||||
pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc libosmogsm.pc \
|
pkgconfig_DATA = libosmocore.pc libosmocodec.pc libosmovty.pc libosmogsm.pc \
|
||||||
|
|
33
configure.ac
33
configure.ac
|
@ -433,6 +433,38 @@ AC_MSG_CHECKING([whether to enable ARM NEON instructions support])
|
||||||
AC_MSG_RESULT([$neon])
|
AC_MSG_RESULT([$neon])
|
||||||
AM_CONDITIONAL(HAVE_NEON, [test "x$neon" != "xno"])
|
AM_CONDITIONAL(HAVE_NEON, [test "x$neon" != "xno"])
|
||||||
|
|
||||||
|
#
|
||||||
|
# SystemTap support
|
||||||
|
#
|
||||||
|
AC_MSG_CHECKING([whether to include systemtap tracing support])
|
||||||
|
AC_ARG_ENABLE([systemtap],
|
||||||
|
[AS_HELP_STRING([--enable-systemtap],
|
||||||
|
[Enable inclusion of systemtap trace support])],
|
||||||
|
[ENABLE_SYSTEMTAP="${enableval}"], [ENABLE_SYSTEMTAP='no'])
|
||||||
|
AM_CONDITIONAL([ENABLE_SYSTEMTAP], [test x$ENABLE_SYSTEMTAP = xyes])
|
||||||
|
AC_MSG_RESULT(${ENABLE_SYSTEMTAP})
|
||||||
|
|
||||||
|
if test "x${ENABLE_SYSTEMTAP}" = xyes; then
|
||||||
|
# Additional configuration for --enable-systemtap is HERE
|
||||||
|
AC_CHECK_PROGS(DTRACE, dtrace)
|
||||||
|
if test -z "$DTRACE"; then
|
||||||
|
AC_MSG_ERROR([dtrace not found])
|
||||||
|
fi
|
||||||
|
AC_CHECK_HEADER([sys/sdt.h], [SDT_H_FOUND='yes'],
|
||||||
|
[SDT_H_FOUND='no';
|
||||||
|
AC_MSG_ERROR([systemtap support needs sys/sdt.h header])])
|
||||||
|
AC_DEFINE([HAVE_SYSTEMTAP], [1], [Define to 1 if using SystemTap probes.])
|
||||||
|
AC_ARG_WITH([tapset-install-dir],
|
||||||
|
[AS_HELP_STRING([--with-tapset-install-dir],
|
||||||
|
[The absolute path where the tapset dir will be installed])],
|
||||||
|
[if test "x${withval}" = x; then
|
||||||
|
ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"
|
||||||
|
else
|
||||||
|
ABS_TAPSET_DIR="${withval}"
|
||||||
|
fi], [ABS_TAPSET_DIR="\$(datadir)/systemtap/tapset"])
|
||||||
|
AC_SUBST(ABS_TAPSET_DIR)
|
||||||
|
fi
|
||||||
|
|
||||||
|
|
||||||
OSMO_AC_CODE_COVERAGE
|
OSMO_AC_CODE_COVERAGE
|
||||||
|
|
||||||
|
@ -487,6 +519,7 @@ AC_OUTPUT(
|
||||||
src/gb/Makefile
|
src/gb/Makefile
|
||||||
src/ctrl/Makefile
|
src/ctrl/Makefile
|
||||||
src/pseudotalloc/Makefile
|
src/pseudotalloc/Makefile
|
||||||
|
tapset/Makefile
|
||||||
tests/Makefile
|
tests/Makefile
|
||||||
tests/atlocal
|
tests/atlocal
|
||||||
utils/Makefile
|
utils/Makefile
|
||||||
|
|
|
@ -29,6 +29,7 @@ libosmocore_la_SOURCES = context.c timer.c timer_gettimeofday.c timer_clockgetti
|
||||||
use_count.c \
|
use_count.c \
|
||||||
exec.c \
|
exec.c \
|
||||||
it_q.c \
|
it_q.c \
|
||||||
|
probes.d \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
if HAVE_SSSE3
|
if HAVE_SSSE3
|
||||||
|
@ -82,5 +83,16 @@ libosmocore_la_SOURCES += mnl.c
|
||||||
libosmocore_la_LIBADD += $(LIBMNL_LIBS)
|
libosmocore_la_LIBADD += $(LIBMNL_LIBS)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
if ENABLE_SYSTEMTAP
|
||||||
|
probes.h: probes.d
|
||||||
|
$(DTRACE) -C -h -s $< -o $@
|
||||||
|
|
||||||
|
probes.lo: probes.d
|
||||||
|
$(LIBTOOL) --mode=compile $(AM_V_lt) --tag=CC env CFLAGS="$(CFLAGS)" $(DTRACE) -C -G -s $< -o $@
|
||||||
|
|
||||||
|
BUILT_SOURCES += probes.h probes.lo
|
||||||
|
libosmocore_la_LIBADD += probes.lo
|
||||||
|
endif
|
||||||
|
|
||||||
crc%gen.c: crcXXgen.c.tpl
|
crc%gen.c: crcXXgen.c.tpl
|
||||||
$(AM_V_GEN)sed -e's/XX/$*/g' $< > $@
|
$(AM_V_GEN)sed -e's/XX/$*/g' $< > $@
|
||||||
|
|
|
@ -44,6 +44,17 @@
|
||||||
#include <syslog.h>
|
#include <syslog.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef HAVE_SYSTEMTAP
|
||||||
|
/* include the generated probes header and put markers in code */
|
||||||
|
#include "probes.h"
|
||||||
|
#define TRACE(probe) probe
|
||||||
|
#define TRACE_ENABLED(probe) probe ## _ENABLED()
|
||||||
|
#else
|
||||||
|
/* Wrap the probe to allow it to be removed when no systemtap available */
|
||||||
|
#define TRACE(probe)
|
||||||
|
#define TRACE_ENABLED(probe) (0)
|
||||||
|
#endif /* HAVE_SYSTEMTAP */
|
||||||
|
|
||||||
#include <time.h>
|
#include <time.h>
|
||||||
#include <sys/time.h>
|
#include <sys/time.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
|
@ -670,9 +681,11 @@ void logp2(int subsys, unsigned int level, const char *file, int line, int cont,
|
||||||
{
|
{
|
||||||
va_list ap;
|
va_list ap;
|
||||||
|
|
||||||
|
TRACE(LIBOSMOCORE_LOG_START());
|
||||||
va_start(ap, format);
|
va_start(ap, format);
|
||||||
osmo_vlogp(subsys, level, file, line, cont, format, ap);
|
osmo_vlogp(subsys, level, file, line, cont, format, ap);
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
|
TRACE(LIBOSMOCORE_LOG_DONE());
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! Register a new log target with the logging core
|
/*! Register a new log target with the logging core
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
provider libosmocore {
|
||||||
|
probe log_start();
|
||||||
|
probe log_done();
|
||||||
|
};
|
|
@ -0,0 +1,22 @@
|
||||||
|
.PHONY: clean-local install-data-hook uninstall-local
|
||||||
|
|
||||||
|
EXTRA_DIST = libosmocore.stp
|
||||||
|
TAPSET_FILES = $(EXTRA_DIST)
|
||||||
|
TAPSET_INSTALL_DIR = $(DESTDIR)@ABS_TAPSET_DIR@
|
||||||
|
|
||||||
|
if ENABLE_SYSTEMTAP
|
||||||
|
all-local: $(TAPSET_FILES)
|
||||||
|
|
||||||
|
clean-local:
|
||||||
|
|
||||||
|
install-data-hook:
|
||||||
|
$(MKDIR_P) $(TAPSET_INSTALL_DIR)
|
||||||
|
$(INSTALL_DATA) $(TAPSET_FILES) $(TAPSET_INSTALL_DIR)
|
||||||
|
|
||||||
|
uninstall-local:
|
||||||
|
@list='$(TAPSET_FILES)'; for p in $$list; do \
|
||||||
|
echo " rm -f '$(TAPSET_INSTALL_DIR)/$$p'"; \
|
||||||
|
rm -f "$(TAPSET_INSTALL_DIR)/$$p"; \
|
||||||
|
done
|
||||||
|
|
||||||
|
endif
|
|
@ -0,0 +1,18 @@
|
||||||
|
/* libosmocore tapset
|
||||||
|
*
|
||||||
|
* This file is part of libosmocore.
|
||||||
|
*
|
||||||
|
* Each probe defines the probe name and a full probestr which consist of the probe name and between
|
||||||
|
* brackets all argument names and values.
|
||||||
|
*/
|
||||||
|
|
||||||
|
probe libosmocore_log_start = process("libosmocore").mark("log_start")
|
||||||
|
{
|
||||||
|
count = $arg1;
|
||||||
|
probestr = sprintf("%s(count=%d), $$name, count);
|
||||||
|
}
|
||||||
|
|
||||||
|
probe libosmocore_log_done = process("libosmocore").mark("log_done")
|
||||||
|
{
|
||||||
|
probestr = sprintf("%s", $$name);
|
||||||
|
}
|
Loading…
Reference in New Issue