#!/bin/bash # # Copyright (C) - 2017 Erica Bugden # Copyright (C) - 2017 Francis Deslauriers # # This library is free software; you can redistribute it and/or modify it under # the terms of the GNU Lesser General Public License as published by the Free # Software Foundation; version 2.1 of the License. # # This library 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 Lesser General Public License for more # details. # # You should have received a copy of the GNU Lesser General Public License # along with this library; if not, write to the Free Software Foundation, Inc., # 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA TEST_DESC="Userspace probe - Testing userspace probe on ELF symbol" CURDIR=$(dirname "$0")/ TESTDIR=$CURDIR/../.. TESTAPP_DIR="$TESTDIR/utils/testapp/" ELF_TEST_BIN_DIR="$TESTAPP_DIR/userspace-probe-elf-binary/" ELF_TEST_BIN_NAME="userspace-probe-elf-binary" ELF_TEST_BIN="$ELF_TEST_BIN_DIR/$ELF_TEST_BIN_NAME" ELF_CXX_TEST_BIN_DIR="$TESTAPP_DIR/userspace-probe-elf-cxx-binary/" ELF_CXX_TEST_BIN_NAME="userspace-probe-elf-cxx-binary" ELF_CXX_TEST_BIN="$ELF_CXX_TEST_BIN_DIR/$ELF_CXX_TEST_BIN_NAME" SDT_TEST_BIN_DIR="$TESTAPP_DIR/userspace-probe-sdt-binary/.libs/" SDT_TEST_BIN_NAME="userspace-probe-sdt-binary" SDT_TEST_BIN="$SDT_TEST_BIN_DIR/$SDT_TEST_BIN_NAME" ELF_SYMBOL="test_function" PROBE_EVENT_NAME=userspace_probe_test_event NUM_TESTS=81 OUTPUT_DEST=/dev/null ERROR_OUTPUT_DEST=/dev/null source "$TESTDIR/utils/utils.sh" function validate_list() { local session_name=$1 local event_name=$2 out=$("$TESTDIR/../src/bin/lttng/$LTTNG_BIN" list "$session_name" | grep "$event_name") if [ -z "$out" ]; then fail "Validate userspace probe listing" diag "$event_name not found when listing $session_name" else pass "Validate userspace probe listing. Found $event_name." fi } function test_userspace_probe_enable_file_noexist () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_file_noexist" ENABLE_EXPR="elf:/etc/file-not-exist:$ELF_SYMBOL" diag "Userspace probe enable on non-existant file" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME $ENABLE_EXPR $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_file_not_elf () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_file_not_elf" ENABLE_EXPR="elf:/etc/passwd:$ELF_SYMBOL" diag "Userspace probe enable on a non ELF file" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME $ENABLE_EXPR $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_elf_missing_symbol_name () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_elf_missing_symbol" ENABLE_EXPR="elf:$ELF_TEST_BIN:" diag "Userspace probe enable with unspecified ELF symbol" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_elf_nonexistant_symbol () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_elf_nonexistant_symbol" ELF_SYMBOL_NO_EXIST="function_doesnt_exist" ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL_NO_EXIST" diag "Userspace probe enable with nonexistant ELF symbol" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_elf_symbol_not_function () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_elf_symbol_not_function" ELF_SYMBOL_NO_FUNC="not_a_function" ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL_NO_FUNC" diag "Userspace probe enable with non-function ELF symbol" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_implicit_probe_type () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_implicit_probe_type" ENABLE_EXPR="$ELF_TEST_BIN:$ELF_SYMBOL" diag "Userspace probe enabled successfully with implicit probe type" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME validate_list $SESSION_NAME $ELF_SYMBOL validate_list $SESSION_NAME $ELF_TEST_BIN_NAME validate_list $SESSION_NAME "ELF" validate_list $SESSION_NAME "Function" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_elf_symbol_exists () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_elf_symbol_exists" ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL" diag "Userspace probe enabled successfully" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME validate_list $SESSION_NAME $ELF_SYMBOL validate_list $SESSION_NAME $ELF_TEST_BIN_NAME validate_list $SESSION_NAME "ELF" validate_list $SESSION_NAME "Function" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_in_path () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_in_path" ENABLE_EXPR="elf:$ELF_TEST_BIN_NAME:$ELF_SYMBOL" diag "Userspace probe on binary in PATH enabled successfully" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" # Save old PATH and add the test directory to the PATH. OLDPATH="$PATH" export PATH="$PATH:$(realpath $ELF_TEST_BIN_DIR)" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME validate_list $SESSION_NAME $ELF_SYMBOL validate_list $SESSION_NAME $ELF_TEST_BIN_NAME validate_list $SESSION_NAME "ELF" validate_list $SESSION_NAME "Function" # Reset the previously saved PATH. export PATH="$OLDPATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_full_path () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_full_path" ENABLE_EXPR="elf:$(realpath $ELF_TEST_BIN):$ELF_SYMBOL" diag "Userspace probe with full path enabled successfully" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME validate_list $SESSION_NAME $ELF_SYMBOL validate_list $SESSION_NAME $ELF_TEST_BIN_NAME validate_list $SESSION_NAME "ELF" validate_list $SESSION_NAME "Function" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_colon_in_path () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userspace_probe_enable_colon_in_path" COLON_FILE_PATH=$(mktemp -d) ELF_BIN_SYMLINK="$COLON_FILE_PATH/colon_:_in_name" ELF_BIN_WITH_COLON_IN_NAME_ESCAPED="$COLON_FILE_PATH/colon_\:_in_name" ENABLE_EXPR="elf:"$ELF_BIN_WITH_COLON_IN_NAME_ESCAPED":$ELF_SYMBOL" ln -s $(realpath $ELF_TEST_BIN) $ELF_BIN_SYMLINK diag "Userspace probe with binary with colon in name enabled successfully" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME validate_list $SESSION_NAME $ELF_SYMBOL validate_list $SESSION_NAME $ELF_TEST_BIN_NAME validate_list $SESSION_NAME "ELF" validate_list $SESSION_NAME "Function" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" rm -rf "$COLON_FILE_PATH" } function test_userspace_probe_elf () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_elf" ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL" diag "Userspace probe on Elf symbol enabled and traced" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$ELF_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_elf_cxx_function () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_elf_cxx_function" # Probing C++ mangled symbols should work the same way as regular Elf # symbols ELF_SYMBOL_CXX="_Z17test_cxx_functionv" ENABLE_EXPR="elf:$ELF_CXX_TEST_BIN:$ELF_SYMBOL_CXX" diag "Userspace probe on C++ mangled function enabled and traced" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$ELF_CXX_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_elf_cxx_method () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_elf_cxx_method" # Probing C++ mangled symbols should work the same way as regular Elf # symbols ELF_SYMBOL_CXX="_ZN10test_class11test_methodEv" ENABLE_EXPR="elf:$ELF_CXX_TEST_BIN:$ELF_SYMBOL_CXX" diag "Userspace probe on C++ mangled method enabled and traced" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$ELF_CXX_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_elf_disable () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_elf_disable" ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL" diag "Userspace probe on Elf symbol disabled and traced" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" # Activate and disable event lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME disable_kernel_lttng_userspace_probe_event_ok $SESSION_NAME $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$ELF_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME # Verify that the trace contains zero event. validate_trace_empty "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_elf_list () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_elf_list" ENABLE_EXPR="elf:$ELF_TEST_BIN:$ELF_SYMBOL" diag "Userspace probe ELF enabled and listed" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME validate_list $SESSION_NAME $PROBE_EVENT_NAME validate_list $SESSION_NAME $ELF_SYMBOL validate_list $SESSION_NAME $ELF_TEST_BIN_NAME validate_list $SESSION_NAME "ELF" validate_list $SESSION_NAME "Function" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_save_load_elf() { # Test that the load and save works for userspace probes AND that when # a userspace probe is placed on a symlink by the user the save command # saves the path to the link and not to the actual file. This is to # support instrumentation of shared objects that are often accessed # through symlinks and updated. TRACE_PATH=$(mktemp -d) TMP_LINK_DIR=$(mktemp -d) TMP_SAVE_DIR=$(mktemp -d) SESSION_NAME="test_userprobe_save_load_elf" ELF_BIN_SYMLINK="$TMP_LINK_DIR"/bin_elf_symlink ENABLE_EXPR_ELF="elf:$ELF_BIN_SYMLINK:$ELF_SYMBOL" PROBE_EVENT_NAME_ELF="$PROBE_EVENT_NAME"_elf # Create symlinks to the target binaries. ln -s $(realpath $ELF_TEST_BIN) $ELF_BIN_SYMLINK diag "Userspace probes Elf are saved and loaded" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" # Enable userspace prove events. lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR_ELF" "$PROBE_EVENT_NAME_ELF" # Confirm that the events were enabled. validate_list $SESSION_NAME $ELF_TEST_BIN_NAME # Save the session to a file. lttng_save $SESSION_NAME "--output-path=$TMP_SAVE_DIR" destroy_lttng_session_ok $SESSION_NAME # Confirm that the userspace probe are save to the xml file. local count=$(cat $TMP_SAVE_DIR/* | grep --count -E "$ELF_BIN_SYMLINK") if [[ $count -eq "1" ]]; then pass "Symlink found in saved session" else fail "Symlink to binary not found in saved session" fi # Load the saved session. lttng_load_ok "--input-path=$TMP_SAVE_DIR" # Confirm that the userspace probes event are enabled in the newly # loaded session. validate_list $SESSION_NAME $ELF_TEST_BIN_NAME # Cleanup temp files and folders. rm -rf "$TRACE_PATH" rm -rf "$TMP_LINK_DIR" rm -rf "$TMP_SAVE_DIR" } function test_userspace_probe_save_load_sdt() { # Test that the load and save works for userspace probes AND that when # a userspace probe is placed on a symlink by the user the save command # saves the path to the link and not to the actual file. This is to # support instrumentation of shared objects that are often accessed # through symlinks and updated. TRACE_PATH=$(mktemp -d) TMP_LINK_DIR=$(mktemp -d) TMP_SAVE_DIR=$(mktemp -d) SESSION_NAME="test_userprobe_save_load_sdt" PROVIDER="foobar" PROBE="tp1" SDT_BIN_SYMLINK="$TMP_LINK_DIR"/bin_sdt_symlink ENABLE_EXPR_SDT="sdt:$SDT_BIN_SYMLINK:$PROVIDER:$PROBE" PROBE_EVENT_NAME_SDT="$PROBE_EVENT_NAME"_sdt # Create symlinks to the target binaries. ln -s $(realpath $SDT_TEST_BIN) $SDT_BIN_SYMLINK diag "Userspace probes SDT are saved and loaded" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" # Enable userspace prove events. lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR_SDT" "$PROBE_EVENT_NAME_SDT" # Confirm that the events were enabled. validate_list $SESSION_NAME $SDT_TEST_BIN_NAME # Save the session to a file. lttng_save $SESSION_NAME "--output-path=$TMP_SAVE_DIR" destroy_lttng_session_ok $SESSION_NAME # Confirm that the userspace probe are save to the xml file. local count=$(cat $TMP_SAVE_DIR/* | grep --count -E "$SDT_BIN_SYMLINK") if [[ $count -eq "1" ]]; then pass "Symlink found in saved session" else fail "Symlink to binary not found in saved session" fi # Load the saved session. lttng_load_ok "--input-path=$TMP_SAVE_DIR" # Confirm that the userspace probes event are enabled in the newly # loaded session. validate_list $SESSION_NAME $SDT_TEST_BIN_NAME # Cleanup temp files and folders. rm -rf "$TRACE_PATH" rm -rf "$TMP_LINK_DIR" rm -rf "$TMP_SAVE_DIR" } function test_userspace_probe_sdt () { TRACE_PATH=$(mktemp -d) PROVIDER="foobar" PROBE="tp1" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe on SDT tracepoint enabled and traced" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$SDT_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_sdt_list () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_list" PROVIDER="foobar" PROBE="tp1" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe SDT enabled and listed" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME validate_list $SESSION_NAME $PROBE_EVENT_NAME validate_list $SESSION_NAME $PROVIDER validate_list $SESSION_NAME $PROBE validate_list $SESSION_NAME $SDT_TEST_BIN_NAME validate_list $SESSION_NAME "SDT" validate_list $SESSION_NAME "Tracepoint" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_sdt_nonexistant_provider () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_nonexistand_provider" PROVIDER="not_provider" PROBE="tp1" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe SDT on tracepoint non existant provider" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_sdt_nonexistant_probe () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_nonexistant_probe" PROVIDER="foobar" PROBE="not_a_tracepoint" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe SDT on non existant probe" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_enable_sdt_with_sema () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_with_sema" PROVIDER="foobar" PROBE="tp_with_semaphore" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe SDT on non existant probe" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_fail $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_sdt_one_probe () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_one_probe" PROVIDER="foobar" PROBE="tp1" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe SDT on tracepoint with one callsite" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$SDT_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_sdt_two_probes () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_two_probes" PROVIDER="foobar" PROBE="tp2" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe SDT on tracepoint with two callsites" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$SDT_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_sdt_in_shared_object () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_shared_object" PROVIDER="foobar" PROBE="tp_in_shared_object" ENABLE_EXPR="sdt:$SDT_TEST_BIN_DIR/libfoo.so:$PROVIDER:$PROBE" diag "Userspace probe SDT on tracepoint in shared object" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$SDT_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_sdt_in_shared_object_dlopen () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_shared_object_dlopen" PROVIDER="foobar" PROBE="tp_in_dlopen" ENABLE_EXPR="sdt:$SDT_TEST_BIN_DIR/libbar.so:$PROVIDER:$PROBE" diag "Userspace probe SDT on tracepoint in dlopen()ed shared object" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$SDT_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_sdt_in_shared_object_ldpreload () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_shared_object_ldpreload" PROVIDER="foobar" PROBE="tp_in_ldpreload" ENABLE_EXPR="sdt:$SDT_TEST_BIN_DIR/libzzz.so:$PROVIDER:$PROBE" diag "Userspace probe SDT on tracepoint in an LD_PRELOADed shared object" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME LD_PRELOAD="$SDT_TEST_BIN_DIR/libzzz.so" eval "$SDT_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } function test_userspace_probe_sdt_with_arg () { TRACE_PATH=$(mktemp -d) SESSION_NAME="test_userprobe_sdt_arg" PROVIDER="foobar" PROBE="tp_with_arg" ENABLE_EXPR="sdt:$SDT_TEST_BIN:$PROVIDER:$PROBE" diag "Userspace probe SDT on tracepoint with argument" create_lttng_session_ok $SESSION_NAME "$TRACE_PATH" lttng_enable_kernel_userspace_probe_event_ok $SESSION_NAME "$ENABLE_EXPR" $PROBE_EVENT_NAME start_lttng_tracing_ok $SESSION_NAME eval "$SDT_TEST_BIN" > /dev/null stop_lttng_tracing_ok $SESSION_NAME validate_trace $PROBE_EVENT_NAME "$TRACE_PATH" destroy_lttng_session_ok $SESSION_NAME rm -rf "$TRACE_PATH" } ls "$SDT_TEST_BIN" >/dev/null 2>&1 if test $? == 0; then NUM_TESTS=$((NUM_TESTS+68)) RUN_SDT_TESTS=1 else RUN_SDT_TESTS=0 fi ls "$ELF_CXX_TEST_BIN" >/dev/null 2>&1 if test $? == 0; then NUM_TESTS=$((NUM_TESTS+12)) RUN_ELF_CXX_TESTS=1 else RUN_ELF_CXX_TESTS=0 fi plan_tests $NUM_TESTS print_test_banner "$TEST_DESC" if [ "$(id -u)" == "0" ]; then isroot=1 else isroot=0 fi skip $isroot "Root access is needed. Skipping all tests." $NUM_TESTS || { start_lttng_sessiond # Unsuccessful event enabling test_userspace_probe_enable_file_noexist test_userspace_probe_enable_file_not_elf test_userspace_probe_enable_elf_missing_symbol_name test_userspace_probe_enable_elf_nonexistant_symbol test_userspace_probe_enable_elf_symbol_not_function # Successful userspace probe elf enabling test_userspace_probe_enable_implicit_probe_type test_userspace_probe_enable_in_path test_userspace_probe_enable_full_path test_userspace_probe_enable_elf_symbol_exists test_userspace_probe_enable_colon_in_path # Successful tracing userspace probe elf test_userspace_probe_elf # Disable userspace-probe elf test_userspace_probe_elf_disable # Successful listing of userspace probe elf test_userspace_probe_elf_list # Successful save and load of userspace probe elf test_userspace_probe_save_load_elf if test $RUN_ELF_CXX_TESTS == 1; then # Successful tracing of userspace probe elf on C++ symbol test_userspace_probe_elf_cxx_function test_userspace_probe_elf_cxx_method fi if test $RUN_SDT_TESTS == 1; then # Unsuccessful event enabling test_userspace_probe_enable_sdt_nonexistant_provider test_userspace_probe_enable_sdt_nonexistant_probe test_userspace_probe_enable_sdt_with_sema # Successful userspace probe sdt enabling test_userspace_probe_sdt_one_probe test_userspace_probe_sdt_two_probes test_userspace_probe_sdt_with_arg test_userspace_probe_sdt_in_shared_object test_userspace_probe_sdt_in_shared_object_dlopen test_userspace_probe_sdt_in_shared_object_ldpreload # Successful tracing of userspace probe sdt test_userspace_probe_sdt # Successful listing of userspace probe sdt test_userspace_probe_sdt_list # Successful save and load of userspace probe sdt test_userspace_probe_save_load_sdt fi stop_lttng_sessiond }