From d4f53cc3de1217c965c2285709b784ff66a8033c Mon Sep 17 00:00:00 2001 From: Antoine Busque Date: Mon, 3 Aug 2015 16:16:37 -0400 Subject: [PATCH] Test: add UST baddr statedump test MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit Signed-off-by: Antoine Busque Signed-off-by: Jérémie Galarneau --- .gitignore | 2 + configure.ac | 1 + tests/regression/ust/Makefile.am | 2 +- .../ust/baddr-statedump/Makefile.am | 26 ++++ tests/regression/ust/baddr-statedump/README | 33 +++++ tests/regression/ust/baddr-statedump/prog.c | 10 ++ .../ust/baddr-statedump/test_baddr-statedump | 27 +++++ .../baddr-statedump/test_baddr-statedump.py | 113 ++++++++++++++++++ tests/regression/ust/baddr-statedump/tp.c | 3 + tests/regression/ust/baddr-statedump/tp.h | 27 +++++ tests/with_bindings_regression | 1 + 11 files changed, 244 insertions(+), 1 deletion(-) create mode 100644 tests/regression/ust/baddr-statedump/Makefile.am create mode 100644 tests/regression/ust/baddr-statedump/README create mode 100644 tests/regression/ust/baddr-statedump/prog.c create mode 100755 tests/regression/ust/baddr-statedump/test_baddr-statedump create mode 100644 tests/regression/ust/baddr-statedump/test_baddr-statedump.py create mode 100644 tests/regression/ust/baddr-statedump/tp.c create mode 100644 tests/regression/ust/baddr-statedump/tp.h diff --git a/.gitignore b/.gitignore index 409b5d105..295b69677 100644 --- a/.gitignore +++ b/.gitignore @@ -93,6 +93,8 @@ health_check /tests/regression/ust/fork/fork2 /tests/regression/ust/libc-wrapper/prog tests/regression/ust/python-logging/test_python_logging +/tests/regression/ust/baddr-statedump/prog +/tests/regression/ust/baddr-statedump/prog.debug /tests/utils/testapp/gen-ust-nevents/gen-ust-nevents /tests/utils/testapp/gen-ust-tracef/gen-ust-tracef /tests/regression/tools/live/live_test diff --git a/configure.ac b/configure.ac index 4a0673e76..d7bac224d 100644 --- a/configure.ac +++ b/configure.ac @@ -805,6 +805,7 @@ AC_CONFIG_FILES([ tests/regression/ust/exit-fast/Makefile tests/regression/ust/fork/Makefile tests/regression/ust/libc-wrapper/Makefile + tests/regression/ust/baddr-statedump/Makefile tests/regression/ust/java-jul/Makefile tests/regression/ust/java-log4j/Makefile tests/regression/ust/python-logging/Makefile diff --git a/tests/regression/ust/Makefile.am b/tests/regression/ust/Makefile.am index f2afad5ea..01404f7dc 100644 --- a/tests/regression/ust/Makefile.am +++ b/tests/regression/ust/Makefile.am @@ -2,7 +2,7 @@ if HAVE_LIBLTTNG_UST_CTL SUBDIRS = nprocesses high-throughput low-throughput before-after multi-session \ overlap buffers-pid linking daemon exit-fast fork libc-wrapper \ periodical-metadata-flush java-jul java-log4j python-logging \ - getcpu-override clock-override + getcpu-override clock-override baddr-statedump EXTRA_DIST = test_event_basic test_event_tracef test_event_perf diff --git a/tests/regression/ust/baddr-statedump/Makefile.am b/tests/regression/ust/baddr-statedump/Makefile.am new file mode 100644 index 000000000..f45c5aeeb --- /dev/null +++ b/tests/regression/ust/baddr-statedump/Makefile.am @@ -0,0 +1,26 @@ +AM_CPPFLAGS = -I$(srcdir) -g + +noinst_PROGRAMS = prog +prog_SOURCES = prog.c tp.c tp.h +prog_LDADD = -llttng-ust -ldl + +noinst_SCRIPTS = test_baddr-statedump test_baddr-statedump.py +EXTRA_DIST = test_baddr-statedump test_baddr-statedump.py + +all-local: prog$(EXEEXT) + @if [ x"$(srcdir)" != x"$(builddir)" ]; then \ + for script in $(EXTRA_DIST); do \ + cp -f $(srcdir)/$$script $(builddir); \ + done; \ + fi + objcopy --only-keep-debug prog prog.debug + strip -g prog + objcopy --add-gnu-debuglink prog.debug prog + +clean-local: + @if [ x"$(srcdir)" != x"$(builddir)" ]; then \ + for script in $(EXTRA_DIST); do \ + rm -f $(builddir)/$$script; \ + done; \ + fi + rm -f prog.debug diff --git a/tests/regression/ust/baddr-statedump/README b/tests/regression/ust/baddr-statedump/README new file mode 100644 index 000000000..bfc6f3ce6 --- /dev/null +++ b/tests/regression/ust/baddr-statedump/README @@ -0,0 +1,33 @@ +UST base address statedump test +------------------------------- + +This test verifies that the tracing of base address statedump works +properly. When an application traced with LTTng UST registers to the +session daemon, it should produce a statedump, delimited by `start` +and `end` events. Between those events, the base addresses of the +executable and all the shared objects it has loaded are dumped, along +with extra debug information such as build id or debug link if it +exists. + +DESCRIPTION +----------- + +The test application simply sleeps for one second to ensure the +statedump has the time to complete fully, and defines a single +userspace tracepoint. The statedump events should be generated when +the application registers with the sessiond. The application is +compiled with debug information, which is then copied into a separate +`prog.debug` file, and a debug link section is added to the original +`prog` executable, now stripped of debug information. This ensures +that `lttng_ust_statedump:debug_link` event will be produced. The +events `start`, `soinfo`, `build_id`, and `end` from the same provider +are also expected in the trace and verified by the test. + +DEPENDENCIES +------------ + +To run this test, you will need: + + - lttng-tools (with python bindings) + - babeltrace + - python 3.0 or later diff --git a/tests/regression/ust/baddr-statedump/prog.c b/tests/regression/ust/baddr-statedump/prog.c new file mode 100644 index 000000000..25c8957fe --- /dev/null +++ b/tests/regression/ust/baddr-statedump/prog.c @@ -0,0 +1,10 @@ +#include + +#define TRACEPOINT_DEFINE +#include "tp.h" + +int main() +{ + sleep(1); + return 0; +} diff --git a/tests/regression/ust/baddr-statedump/test_baddr-statedump b/tests/regression/ust/baddr-statedump/test_baddr-statedump new file mode 100755 index 000000000..1f4044a2c --- /dev/null +++ b/tests/regression/ust/baddr-statedump/test_baddr-statedump @@ -0,0 +1,27 @@ +#!/bin/sh +# +# Copyright (C) - 2013 Jérémie Galarneau +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License, version 2 only, as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +CURDIR=$(dirname $0) +TESTDIR=${CURDIR}/../../.. + +source $TESTDIR/utils/utils.sh + +start_lttng_sessiond_notap + +python3 ${CURDIR}/test_baddr-statedump.py + +stop_lttng_sessiond_notap diff --git a/tests/regression/ust/baddr-statedump/test_baddr-statedump.py b/tests/regression/ust/baddr-statedump/test_baddr-statedump.py new file mode 100644 index 000000000..308eff429 --- /dev/null +++ b/tests/regression/ust/baddr-statedump/test_baddr-statedump.py @@ -0,0 +1,113 @@ +#!/usr/bin/env python3 +# +# Copyright (C) - 2013 Jérémie Galarneau +# Copyright (C) - 2015 Antoine Busque +# +# This program is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License, version 2 only, as +# published by the Free Software Foundation. +# +# This program is distributed in the hope that it will be useful, but WITHOUT +# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for +# more details. +# +# You should have received a copy of the GNU General Public License along with +# this program; if not, write to the Free Software Foundation, Inc., 51 +# Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +import os +import subprocess +import re +import shutil +import sys + +test_path = os.path.dirname(os.path.abspath(__file__)) + "/" +test_utils_path = test_path +for i in range(4): + test_utils_path = os.path.dirname(test_utils_path) +test_utils_path = test_utils_path + "/utils" +sys.path.append(test_utils_path) +from test_utils import * + + +NR_TESTS = 7 +current_test = 1 +print("1..{0}".format(NR_TESTS)) + +# Check if a sessiond is running... bail out if none found. +if session_daemon_alive() == 0: + bail("""No sessiond running. Please make sure you are running this test + with the "run" shell script and verify that the lttng tools are + properly installed.""") + +session_info = create_session() +enable_ust_tracepoint_event(session_info, "*") +start_session(session_info) + +test_process = subprocess.Popen(test_path + "prog", stdout=subprocess.PIPE, stderr=subprocess.PIPE) +if sys.version_info >= (3, 3): + try: + test_process.wait(5) + except subprocess.TimeoutExpired: + test_process.kill() + bail("Failed to run ust baddr-statedump test application.", session_info) +else: + test_process.wait() + +print_test_result(test_process.returncode == 0, current_test, "Test application exited normally") +current_test += 1 + +stop_session(session_info) + +# Check for statedump events in the resulting trace +try: + babeltrace_process = subprocess.Popen(["babeltrace", session_info.trace_path], stdout=subprocess.PIPE, stderr=subprocess.PIPE) +except FileNotFoundError: + bail("Could not open babeltrace. Please make sure it is installed.", session_info) + +start_event_found = False +soinfo_event_found = False +build_id_event_found = False +debug_link_event_found = False +end_event_found = False + +for event_line in babeltrace_process.stdout: + # Let babeltrace finish to get the return code + if start_event_found and soinfo_event_found and build_id_event_found and \ + debug_link_event_found and end_event_found: + continue + + event_line = event_line.decode('utf-8').replace("\n", "") + if re.search(r".*lttng_ust_statedump:start.*", event_line) is not None: + start_event_found = True + elif re.search(r".*lttng_ust_statedump:soinfo.*", event_line) is not None: + soinfo_event_found = True + elif re.search(r".*lttng_ust_statedump:build_id.*", event_line) is not None: + build_id_event_found = True + elif re.search(r".*lttng_ust_statedump:debug_link.*", event_line) is not None: + debug_link_event_found = True + elif re.search(r".*lttng_ust_statedump:end.*", event_line) is not None: + end_event_found = True + +babeltrace_process.wait() + +print_test_result(babeltrace_process.returncode == 0, current_test, "Resulting trace is readable") +current_test += 1 + +print_test_result(start_event_found, current_test, "lttng_ust_statedump:start event found in resulting trace") +current_test += 1 + +print_test_result(soinfo_event_found, current_test, "lttng_ust_statedump:soinfo event found in resulting trace") +current_test += 1 + +print_test_result(build_id_event_found, current_test, "lttng_ust_statedump:build_id event found in resulting trace") +current_test += 1 + +print_test_result(debug_link_event_found, current_test, "lttng_ust_statedump:debug_link event found in resulting trace") +current_test += 1 + +print_test_result(end_event_found, current_test, "lttng_ust_statedump:end event found in resulting trace") +current_test += 1 + +shutil.rmtree(session_info.tmp_directory) diff --git a/tests/regression/ust/baddr-statedump/tp.c b/tests/regression/ust/baddr-statedump/tp.c new file mode 100644 index 000000000..2283f6f10 --- /dev/null +++ b/tests/regression/ust/baddr-statedump/tp.c @@ -0,0 +1,3 @@ +#define TRACEPOINT_CREATE_PROBES + +#include "tp.h" diff --git a/tests/regression/ust/baddr-statedump/tp.h b/tests/regression/ust/baddr-statedump/tp.h new file mode 100644 index 000000000..d0abcadcf --- /dev/null +++ b/tests/regression/ust/baddr-statedump/tp.h @@ -0,0 +1,27 @@ +#undef TRACEPOINT_PROVIDER +#define TRACEPOINT_PROVIDER my_provider + +#undef TRACEPOINT_INCLUDE +#define TRACEPOINT_INCLUDE "./tp.h" + +#if !defined(_TP_H) || defined(TRACEPOINT_HEADER_MULTI_READ) +#define _TP_H + +#include + +TRACEPOINT_EVENT( + my_provider, + my_first_tracepoint, + TP_ARGS( + int, my_integer_arg, + char*, my_string_arg + ), + TP_FIELDS( + ctf_string(my_string_field, my_string_arg) + ctf_integer(int, my_integer_field, my_integer_arg) + ) +) + +#endif /* _TP_H */ + +#include diff --git a/tests/with_bindings_regression b/tests/with_bindings_regression index 5cb190382..2097e5c20 100644 --- a/tests/with_bindings_regression +++ b/tests/with_bindings_regression @@ -3,3 +3,4 @@ regression/ust/daemon/test_daemon regression/ust/exit-fast/test_exit-fast regression/ust/fork/test_fork regression/ust/libc-wrapper/test_libc-wrapper +regression/ust/baddr-statedump/test_baddr-statedump -- 2.34.1