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
>

Reply via email to