summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSerhei Makarov <[email protected]>2025-05-08 18:17:45 -0400
committerSerhei Makarov <[email protected]>2025-05-08 18:17:45 -0400
commitdeca125665a76cf024bd063ff4f477cb675ad41e (patch)
treed00cc7476c51cebe197b91fb3be6325d2e09959f
parentd05241ce690018548857199bd34d7734c7164679 (diff)
tests/run-stack-live-test.sh: prototype 'live' eu-stack testing
Missing a few pieces, but worth sharing as an RFC. My idea is to ensure better test coverage for eu-stack and then eu-stacktrace+libdwfl_stacktrace by running against a live process with known content, stopped at a known location, and aggressively scrubbing output that's known to vary from testrun to testrun. This is a very basic preview of how that might look. If the approach is sound, I hope to make it more sophisticated/reliable. Unanswered questions: - Scrub more data (e.g. libc symvers) from a more known program. Scrub stack frame numbers to account for a case where extra frames appear / are missing at the bottom of the stack? - Something better than sed for the scrubbing? - An equivalent eu-stacktrace test will require privileged perf_events access for profiling data and therefore likely to be skipped by default. How feasible is it to be enabled on the buildbots, though? * tests/run-stack-live-test.sh: New test with wild and fuzzy testrun_compare variant that scrubs inherently unpredictable parts of the data. Needs to scrub even more. * tests/Makefile.am (TESTS): Add run-stack-live-test.sh.
-rw-r--r--tests/Makefile.am3
-rwxr-xr-xtests/run-stack-live-test.sh64
2 files changed, 66 insertions, 1 deletions
diff --git a/tests/Makefile.am b/tests/Makefile.am
index 00ba754d..ecd514c7 100644
--- a/tests/Makefile.am
+++ b/tests/Makefile.am
@@ -191,7 +191,8 @@ TESTS = run-arextract.sh run-arsymtest.sh run-ar.sh newfile test-nlist \
run-backtrace-core-s390x.sh run-backtrace-core-s390.sh \
run-backtrace-core-aarch64.sh run-backtrace-core-sparc.sh \
run-backtrace-demangle.sh run-stack-d-test.sh run-stack-i-test.sh \
- run-stack-demangled-test.sh run-readelf-zx.sh run-readelf-zp.sh \
+ run-stack-demangled-test.sh run-stack-live-test.sh \
+ run-readelf-zx.sh run-readelf-zp.sh \
run-readelf-arm-flags.sh \
run-readelf-addr.sh run-readelf-str.sh \
run-readelf-multi-noline.sh \
diff --git a/tests/run-stack-live-test.sh b/tests/run-stack-live-test.sh
new file mode 100755
index 00000000..808421bb
--- /dev/null
+++ b/tests/run-stack-live-test.sh
@@ -0,0 +1,64 @@
+#! /bin/sh
+# Copyright (C) 2025 Red Hat, Inc.
+# This file is part of elfutils.
+#
+# This file is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# elfutils 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, see <http://www.gnu.org/licenses/>.
+
+. $srcdir/test-subr.sh
+
+# Depending on whether we are running make check or make installcheck
+# the actual binary name under test might be different. It is used in
+# the error message, which we also try to match.
+if test "$elfutils_testrun" = "installed"; then
+STACKCMD=${bindir}/`program_transform stack`
+else
+STACKCMD=${abs_top_builddir}/src/stack
+fi
+
+# TODO(REVIEW): Can we make the data-scrubbing generic enough
+# (across multiple eu-stack/eu-stacktrace test cases) to move
+# to test_subr.sh?
+#
+# TODO(REVIEW): Better shell-isms for comparing file and regex?
+# \(\s\e\d\)\+\i\s\a\d\d\i\c\t\e\d\\t\o\b\a\ck\s\l\a\s\h\e\s
+testrun_compare_fuzzy()
+{
+ outfile="${1##*/}.out"
+ testrun_out $outfile "$@"
+ sed -i 's/\(PID\|TID\|#[0-9]\+\)\( \+\)\(\(0x\)\?[0-9a-f]\+\)/\1\2nn/g' $outfile
+ diff -u $outfile -
+}
+
+# TODO: Need to scrub more data (e.g. GLIBC_ bits),
+# and use a program whose inner content we control:
+sleep 10 &
+PID=$!
+testrun_compare_fuzzy ${abs_top_builddir}/src/stack -p $PID <<EOF
+PID nn - process
+TID nn:
+#0 nn clock_nanosleep@GLIBC_2.2.5
+#1 nn __nanosleep
+#2 nn main
+#3 nn __libc_start_call_main
+#4 nn __libc_start_main@@GLIBC_2.34
+#5 nn _start
+EOF
+# PID 169385 - process
+# TID 169385:
+# #0 0x00007f04a98adbd7 clock_nanosleep@GLIBC_2.2.5
+# #1 0x00007f04a98b9c47 __nanosleep
+# #2 0x0000561e7fdd9a9f main
+# #3 0x00007f04a97f4088 __libc_start_call_main
+# #4 0x00007f04a97f414b __libc_start_main@@GLIBC_2.34
+# #5 0x0000561e7fdd9c05 _start