Hi Serhei, On Mon, Apr 13, 2026 at 5:31 PM Serhei Makarov <[email protected]> wrote: > > Together with the stackprof tool we add some test cases to exercise > it, and the underlying libdwfl_stacktrace functionality as well. > > * tests/run-stackprof-system.sh: New file. > * tests/run-stackprof-system-gprof.sh: New file. > * tests/run-stackprof-user.sh: New file. > * tests/run-sysckprof-user-gprof.sh: New file.
Should be stackprof instead of sysckprof. > * tests/Makefile.am (TESTS): add the new testcases. > > Co-authored-by: <[email protected]> > Signed-off-by: <[email protected]> > --- > tests/Makefile.am | 14 ++++- > tests/run-stackprof-system-gprof.sh | 80 +++++++++++++++++++++++++++++ > tests/run-stackprof-system.sh | 44 ++++++++++++++++ > tests/run-stackprof-user-gprof.sh | 71 +++++++++++++++++++++++++ > tests/run-stackprof-user.sh | 61 ++++++++++++++++++++++ > 5 files changed, 268 insertions(+), 2 deletions(-) > create mode 100755 tests/run-stackprof-system-gprof.sh > create mode 100755 tests/run-stackprof-system.sh > create mode 100755 tests/run-stackprof-user-gprof.sh > create mode 100755 tests/run-stackprof-user.sh > > diff --git a/tests/Makefile.am b/tests/Makefile.am > index 9a005416..e0f9397e 100644 > --- a/tests/Makefile.am > +++ b/tests/Makefile.am > @@ -1,6 +1,6 @@ > ## Process this file with automake to create Makefile.in > ## > -## Copyright (C) 1996-2019 Red Hat, Inc. > +## Copyright (C) 1996-2026 Red Hat, Inc. > ## This file is part of elfutils. > ## > ## This file is free software; you can redistribute it and/or modify > @@ -313,7 +313,7 @@ TESTS += run-debuginfod-ima-verification.sh > endif > endif > > -if HAVE_CXX11 > +if HAVE_CXX20 > check_PROGRAMS += funcretval_test++11 > funcretval_test__11_SOURCES = funcretval_test++11.cxx > TESTS += run-funcretval++11.sh > @@ -323,6 +323,14 @@ check_PROGRAMS += funcretval_test_struct > funcretval_test_struct_SOURCES = funcretval_test_struct.c > TESTS += run-funcretval-struct-native.sh > > +if ENABLE_STACKPROF > +TESTS += run-stackprof-user.sh run-stackprof-user-gprof.sh > +TESTS += run-stackprof-system.sh run-stackprof-system-gprof.sh > +endif > +if HAVE_LIBPFM > +export HAVE_LIBPFM = 1 > +endif > + > EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ > run-ar-N.sh \ > run-show-die-info.sh run-get-files.sh run-get-lines.sh \ > @@ -717,6 +725,8 @@ EXTRA_DIST = run-arextract.sh run-arsymtest.sh run-ar.sh \ > testfile-sysroot.tar.bz2 run-sysroot.sh \ > run-test-manyfuncs.sh manyfuncs.c \ > run-debuginfod-seekable.sh thread-safety-subr.sh \ > + run-stackprof-user.sh run-stackprof-user-gprof.sh \ > + run-stackprof-system.sh run-stackprof-system-gprof.sh \ > run-eu-search-cfi.sh run-eu-search-macros.sh \ > run-eu-search-lines.sh run-eu-search-die.sh > > diff --git a/tests/run-stackprof-system-gprof.sh > b/tests/run-stackprof-system-gprof.sh > new file mode 100755 > index 00000000..e2765324 > --- /dev/null > +++ b/tests/run-stackprof-system-gprof.sh > @@ -0,0 +1,80 @@ > +#!/usr/bin/env bash > +# > +# Copyright (C) 2026 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/>. > + > +set -x > + > +. $srcdir/test-subr.sh > + > +# prerequisites > +type timeout 2>/dev/null || (echo "no timeout installed"; exit 77) > +expr `whoami` = "root" || (echo "run as root"; exit 77) > + > +# run systemwide scan > +tempfiles test.out > +# produce gprof data > +testrun timeout -p -sINT 10 ${abs_top_builddir}/src/stackprof -v -v 2>&1 | > tee test.out > + > +grep "^perf_event_attr configuration" test.out > +grep "Starting stack profile collection systemwide" test.out > +grep -E "^[0-9]+ " test.out > + > +# run it again, producing gprof data > +testrun timeout -p -sINT 10 ${abs_top_builddir}/src/stackprof -v -v -g 2>&1 > | tee test.out > +tempfiles test.out > +tempfiles gmon.* > +grep "^perf_event_attr configuration type=1 config=0 sample_freq=" test.out > +grep "Starting stack profile collection systemwide" test.out > +grep -E "^buildid [0-9a-f]+" test.out > + > +export DEBUGINFOD_URLS=https://debuginfod.elfutils.org/ > + > +for f in gmon.*.out > +do > + exe="`basename "$f" .out`.exe" > + if [ ! -f "$exe" ]; > + then > + echo "NOTE: finding $f executable by buildid" > + buildid=`echo "$f" | cut -f2 -d.` > + if testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v > executable $buildid; then > + ln -s "`${abs_top_builddir}/debuginfod/debuginfod-find > executable $buildid`" "$exe" I had to run debuginfod-find under testrun here too, otherwise the system libdebuginfod.so gets linked instead of the builddir libdebuginfod.so. testrun had to be added to debuginfod-find elsewhere in this patch too. I see that debuginfod-find actually queries https://debuginfod.elfutils.org/ here and in run-stackprof-user-gprof.sh. That makes these tests dependent on network access and speed which isn't ideal. Can these tests instead use binaries that are all available locally? I also recommend using `export DEBUGINFOD_CACHE_PATH=${PWD}/.client_cache` to avoid writing test files to $HOME/.cache/debuginfod_client. > + else > + echo "SKIPPING: executable not found" > + continue > + fi > + fi > + tempfiles "$exe" > + echo "NOTE: analyzing $exe `readlink $exe`" > + tempfiles gprof_output.txt > + # Try a plain gprof attempt on the executable > + if gprof "$exe" "$f" > gprof_output.txt 2>&1; then > + # Success, use the output > + cat gprof_output.txt > + else > + # Fall back to debuginfod if necessary (e.g., if debug info is > missing) > + echo "NOTE: stripped binary found, attempting to find debuginfo" > + if testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v > debuginfo $exe; then > + debuginfo="`${abs_top_builddir}/debuginfod/debuginfod-find > debuginfo $exe`" > + gprof "$debuginfo" "$f" > + else > + echo "SKIPPING: debuginfo not found" > + continue > + fi > + fi > +done > + > +exit 0 > diff --git a/tests/run-stackprof-system.sh b/tests/run-stackprof-system.sh > new file mode 100755 > index 00000000..e9d3e4df > --- /dev/null > +++ b/tests/run-stackprof-system.sh > @@ -0,0 +1,44 @@ > +#!/usr/bin/env bash > +# > +# Copyright (C) 2026 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/>. > + > +set -x > + > +. $srcdir/test-subr.sh > + > +# prerequisites > +type timeout 2>/dev/null || (echo "no timeout installed"; exit 77) > +expr `whoami` = "root" || (echo "run as root"; exit 77) > + > +# run systemwide scan > +tempfiles test.out > +testrun timeout -p -sINT 10 ${abs_top_builddir}/src/stackprof -v -v 2>&1 | > tee test.out > + > +grep "^perf_event_attr configuration" test.out > +grep "Starting stack profile collection systemwide" test.out > +grep -E "^[0-9]+ " test.out > + > +# run it again, producing gprof data > +testrun timeout -p -sINT 10 ${abs_top_builddir}/src/stackprof -v -v -g 2>&1 > | tee test.out > + > +tempfiles gmon.* > +grep "^perf_event_attr configuration type=1 config=0 sample_freq=" test.out > +grep "Starting stack profile collection systemwide" test.out > +grep -E "^buildid [0-9a-f]+" test.out > + > + > +exit 0 > diff --git a/tests/run-stackprof-user-gprof.sh > b/tests/run-stackprof-user-gprof.sh > new file mode 100755 > index 00000000..c3cb2121 > --- /dev/null > +++ b/tests/run-stackprof-user-gprof.sh > @@ -0,0 +1,71 @@ > +#!/usr/bin/env bash > +# > +# Copyright (C) 2026 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/>. > + > +set -x > + > +. $srcdir/test-subr.sh > + > +# prerequisites > +type timeout 2>/dev/null || (echo "no timeout installed"; exit 77) > +type gprof 2>/dev/null || (echo "no gprof installed"; exit 77) > + > +# produce gprof data > +testrun ${abs_top_builddir}/src/stackprof -v -v -g -- timeout 2 /bin/sh -c > "while true; do true; done" 2>&1 | tee test.out > +tempfiles test.out > +tempfiles gmon.* > +grep "^perf_event_attr configuration" test.out > +grep "Starting stack profile collection pid" test.out > +grep -E "^buildid [0-9a-f]+" test.out > + > +export DEBUGINFOD_URLS=https://debuginfod.elfutils.org/ > + > +for f in gmon.*.out > +do > + exe="`basename "$f" .out`.exe" > + if [ ! -f "$exe" ]; > + then > + echo "NOTE: finding $f executable by buildid" > + buildid=`echo "$f" | cut -f2 -d.` > + if testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v > executable $buildid; then > + ln -s "`${abs_top_builddir}/debuginfod/debuginfod-find > executable $buildid`" "$exe" > + else > + echo "SKIPPING: executable not found" > + continue > + fi > + fi > + tempfiles "$exe" > + echo "NOTE: analyzing $exe `readlink $exe`" > + tempfiles gprof_output.txt > + # Try a plain gprof attempt on the executable > + if gprof "$exe" "$f" > gprof_output.txt 2>&1; then > + # Success, use the output > + cat gprof_output.txt > + else > + # Fall back to debuginfod if necessary (e.g., if debug info is > missing) > + echo "NOTE: stripped binary found, attempting to find debuginfo" > + if testrun ${abs_top_builddir}/debuginfod/debuginfod-find -v > debuginfo $exe; then > + debuginfo="`${abs_top_builddir}/debuginfod/debuginfod-find > debuginfo $exe`" > + gprof "$debuginfo" "$f" > + else > + echo "SKIPPING: debuginfo not found" > + continue > + fi > + fi > +done > + > +exit 0 > diff --git a/tests/run-stackprof-user.sh b/tests/run-stackprof-user.sh > new file mode 100755 > index 00000000..775a95ff > --- /dev/null > +++ b/tests/run-stackprof-user.sh > @@ -0,0 +1,61 @@ > +#!/usr/bin/env bash > +# > +# Copyright (C) 2026 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/>. > + > +set -x > + > +. $srcdir/test-subr.sh > + > +# prerequisites > +type timeout 2>/dev/null || (echo "no timeout installed"; exit 77) > + > +# run a cpu-hungry shell script fragment, analyze verbose stats > +tempfiles test.out > +testrun ${abs_top_builddir}/src/stackprof -v -v -- timeout 2 /bin/sh -c > "while true; do true; done" 2>&1 | tee test.out > + > +grep "^perf_event_attr configuration" test.out > +grep "Starting stack profile collection pid" test.out > +grep -E "^[0-9]+ sh --" test.out > + > + > +# run it again, producing gprof data > +testrun ${abs_top_builddir}/src/stackprof -v -v -g -- timeout 2 /bin/sh -c > "while true; do true; done" 2>&1 | tee test.out > + > +tempfiles gmon.* > +grep "^perf_event_attr configuration type=1 config=0 sample_freq=" test.out > +grep "Starting stack profile collection pid" test.out > +grep -E "^buildid [0-9a-f]+" test.out > +rm gmon.* > + > + > +if [ "x$HAVE_LIBPFM" = "x1" ]; then > + # test libpfm event listing > + testrun ${abs_top_builddir}/src/stackprof --event-list 2>&1 | tee > test.out > + wc -l < test.out > + grep "^perf::BRANCHES" test.out > + > + # test libpfm event listing > + testrun ${abs_top_builddir}/src/stackprof -v -v -e > perf::BRANCHES:freq=4000 -v -v -g -- timeout 2 /bin/sh -c "while true; do > true; done" 2>&1 | tee test.out > + > + tempfiles gmon.* > + grep "^perf_event_attr configuration type=0 config=4 sample_freq=4000" > test.out > + grep "Starting stack profile collection pid" test.out > + grep -E "^buildid [0-9a-f]+" test.out > +fi > + > + > +exit 0 > -- > 2.53.0 >
