From f1cdc73f78a2f9b6499b4a5462485a873d9620af Mon Sep 17 00:00:00 2001 From: Mark Wielaard Date: Thu, 12 Jun 2025 23:27:50 +0200 Subject: [PATCH] Add basic find-debuginfo script tests Covers basic find-debuginfo script functionality. Checks .debug files are generated by eu-strip, .gnu_debugdata is generated, .gdb_index is added by gdb-add-index, dwz multi file is created and all debugsources are found, also does parallel runs. Skips dwz testing if .debug_addr is generated (since dwz currently doesn't handle that). * configure.ac: Check whether -gdwarf-5 produced DWARF5 .debug_addr. * tests/atlocal.in: Add DWARF_5_DEBUGADDR. * tests/Makefile.am (TESTSUITE_AT): Add find-debuginfo.at. * tests/testsuite.at: m4_include find-debuginfo.at. * tests/find-debuginfo.at: New test file. Signed-off-by: Mark Wielaard --- configure.ac | 13 ++ tests/Makefile.am | 3 +- tests/atlocal.in | 1 + tests/find-debuginfo.at | 341 ++++++++++++++++++++++++++++++++++++++++ tests/testsuite.at | 1 + 5 files changed, 358 insertions(+), 1 deletion(-) create mode 100644 tests/find-debuginfo.at diff --git a/configure.ac b/configure.ac index ad4d70c63995..e48fa828c9db 100644 --- a/configure.ac +++ b/configure.ac @@ -125,6 +125,19 @@ CFLAGS="$save_CFLAGS" DWARF_5_DEBUGLINE=$ac_cv_dwarf_5_debugline AC_SUBST([DWARF_5_DEBUGLINE]) +AC_CACHE_CHECK([whether -gdwarf-5 produced DWARF5 .debug_addr], ac_cv_dwarf_5_debugaddr, [dnl +save_CFLAGS="$CFLAGS" +CFLAGS="-gdwarf-5" +AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int i=0;]],[[/* empty main */]])], + [if $READELF -S conftest.o 2>&1 | grep -F ".debug_addr" > /dev/null 2>&1; \ + then ac_cv_dwarf_5_debugaddr=yes; \ + else ac_cv_dwarf_5_debugaddr=no; fi], + ac_cv_dwarf_5_debugaddr=no) +CFLAGS="$save_CFLAGS" +]) +DWARF_5_DEBUGADDR=$ac_cv_dwarf_5_debugaddr +AC_SUBST([DWARF_5_DEBUGADDR]) + AC_CACHE_CHECK([whether gcc supports -gz=none], ac_cv_gz_none, [dnl save_CFLAGS="$CFLAGS" CFLAGS="-gz=none" diff --git a/tests/Makefile.am b/tests/Makefile.am index b1d39f4ac1fc..7fab084f31f2 100644 --- a/tests/Makefile.am +++ b/tests/Makefile.am @@ -32,7 +32,8 @@ $(srcdir)/package.m4: $(top_srcdir)/configure.ac # The tests TESTSUITE_AT = \ testsuite.at \ - debugedit.at + debugedit.at \ + find-debuginfo.at # Some source files that are needed by the tests EXTRA_DIST += data/SOURCES/foo.c \ diff --git a/tests/atlocal.in b/tests/atlocal.in --- a/tests/atlocal.in.orig 2025-06-20 12:58:03.601406269 +0200 +++ b/tests/atlocal.in 2025-06-20 12:58:26.398096509 +0200 @@ -14,3 +14,4 @@ GZ_NONE_FLAG=@GZ_NONE_FLAG@ GZ_ZLIB_FLAG=@GZ_ZLIB_FLAG@ DWARF_5_DEBUGLINE=@DWARF_5_DEBUGLINE@ +DWARF_5_DEBUGADDR=@DWARF_5_DEBUGADDR@ diff --git a/tests/find-debuginfo.at b/tests/find-debuginfo.at new file mode 100644 index 000000000000..d6f6ae9ee07a --- /dev/null +++ b/tests/find-debuginfo.at @@ -0,0 +1,341 @@ +# find-debuginfo.at: Tests for the find-debuginfo script +# +# Copyright (C) 2025 Red Hat Inc. +# Copyright (C) 2025 Mark J. Wielaard +# +# This program 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 2 of the License, or +# (at your option) any later version. +# +# 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, see see . + +# Tests for scripts/find-debuginfo.in +AT_BANNER([find-debuginfo]) + +# Show which find-debuginfo script we are testing +AT_TESTED([find-debuginfo]) + +# Helper to create some test binaries +m4_define([FIND_DEBUGINFO_PKG_BUILD_SETUP],[[ +mkdir subdir_build +cp "${abs_srcdir}"/data/SOURCES/foo.c subdir_build +cp "${abs_srcdir}"/data/SOURCES/bar.c subdir_build +cp "${abs_srcdir}"/data/SOURCES/foobar.h subdir_build +cp "${abs_srcdir}"/data/SOURCES/baz.c subdir_build +cd subdir_build +# Three almost identical binaries +# so dwz has something to put into the alt file +$CC $CFLAGS -g3 -I. -o foo foo.c bar.c baz.c +$CC $CFLAGS -g3 -I. -o bar bar.c baz.c foo.c +$CC $CFLAGS -g3 -I. -o baz baz.c foo.c bar.c +cd .. +]]) + +# Check find-debuginfo --help doesn't crash and burn +AT_SETUP([find-debuginfo help]) +AT_KEYWORDS([find-debuginfo] [help]) +AT_CHECK([find-debuginfo --help],[0],[ignore],[ignore]) +AT_CLEANUP + +# Run find-debuginfo on a small build without any fancy options +AT_SETUP([find-debuginfo sources]) +AT_KEYWORDS([find-debuginfo] [sources]) +FIND_DEBUGINFO_PKG_BUILD_SETUP +# Sanity check the binaries have debug sections +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [0], [ignore], []) +# We need to set some environment variables for running find-debuginfo +# normally set by rpmbuild. +# +# run debugedit and collect source files for binaries in subdir_build +AT_CHECK([env RPM_BUILD_DIR=${PWD} \ + RPM_BUILD_ROOT=${PWD} \ + RPM_PACKAGE_NAME=pkg \ + RPM_PACKAGE_VERSION=ver \ + RPM_PACKAGE_RELEASE=rel \ + RPM_ARCH=arch \ + find-debuginfo ${PWD}/subdir_build], + [0], [stdout], []) +# Make sure all three binaries are processed +AT_CHECK([grep "Extracting debug info from 3 files" stdout], [0], [ignore], []) +# debug sections should have been removed +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [1], [ignore], []) +# Now there are .debug files with those .debug_ sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep debug_], + [0], [ignore], []) +# Check all sources are listed in debugsources.list +AT_DATA([expout], +[subdir_build/ +subdir_build/bar.c +subdir_build/baz.c +subdir_build/foo.c +subdir_build/foobar.h +]) +AT_CHECK([cat subdir_build/debugsources.list | tr '\0' '\n' | sort -u], + [0], [expout], []) +AT_CLEANUP + +# Run find-debuginfo on a small build and check all parts ran +AT_SETUP([find-debuginfo sources debugdata gdb-index]) +AT_KEYWORDS([find-debuginfo] [sources] [debugdata] [gdb-index]) +FIND_DEBUGINFO_PKG_BUILD_SETUP +# Sanity check the binaries have debug sections +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [0], [ignore], []) +# We need to set some environment variables for running find-debuginfo +# normally set by rpmbuild. +# +# generate .gnu_debugdata (-m), .gdb_index (-i) for binaries in subdir_build. +AT_CHECK([env RPM_BUILD_DIR=${PWD} \ + RPM_BUILD_ROOT=${PWD} \ + RPM_PACKAGE_NAME=pkg \ + RPM_PACKAGE_VERSION=ver \ + RPM_PACKAGE_RELEASE=rel \ + RPM_ARCH=arch \ + find-debuginfo -m -i ${PWD}/subdir_build], + [0], [stdout], []) +# Make sure all three binaries are processed +AT_CHECK([grep "Extracting debug info from 3 files" stdout], [0], [ignore], []) +# debug sections should have been removed +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [1], [ignore], []) +# But they now have a .gnu_debugdata section +AT_CHECK([$READELF -S subdir_build/foo | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep gnu_debugdata], + [0], [ignore], []) +# There are .debug files with those .debug_ sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep debug_], + [0], [ignore], []) +# The .debug files should also have a .gdb_index sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep gdb_index], + [0], [ignore], []) +# Check all sources are listed in debugsources.list +AT_DATA([expout], +[subdir_build/ +subdir_build/bar.c +subdir_build/baz.c +subdir_build/foo.c +subdir_build/foobar.h +]) +AT_CHECK([cat subdir_build/debugsources.list | tr '\0' '\n' | sort -u], + [0], [expout], []) +AT_CLEANUP + +# Run find-debuginfo on a small build and check all parts ran +# Same as above but run in parallel (-j) +AT_SETUP([find-debuginfo sources debugdata gdb-index jobs]) +AT_KEYWORDS([find-debuginfo] [sources] [debugdata] [gdb-index] [jobs]) +FIND_DEBUGINFO_PKG_BUILD_SETUP +# Sanity check the binaries have debug sections +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [0], [ignore], []) +# We need to set some environment variables for running find-debuginfo +# normally set by rpmbuild. +# +# generate .gnu_debugdata (-m), .gdb_index (-i) for binaries in subdir_build. +AT_CHECK([env RPM_BUILD_DIR=${PWD} \ + RPM_BUILD_ROOT=${PWD} \ + RPM_PACKAGE_NAME=pkg \ + RPM_PACKAGE_VERSION=ver \ + RPM_PACKAGE_RELEASE=rel \ + RPM_ARCH=arch \ + find-debuginfo -m -i -j6 ${PWD}/subdir_build], + [0], [stdout], []) +# Make sure all three binaries are processed +AT_CHECK([grep "Extracting debug info from 3 files" stdout], [0], [ignore], []) +# debug sections should have been removed +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [1], [ignore], []) +# But they now have a .gnu_debugdata section +AT_CHECK([$READELF -S subdir_build/foo | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep gnu_debugdata], + [0], [ignore], []) +# There are .debug files with those .debug_ sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep debug_], + [0], [ignore], []) +# The .debug files should also have a .gdb_index sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep gdb_index], + [0], [ignore], []) +# Check all sources are listed in debugsources.list +AT_DATA([expout], +[subdir_build/ +subdir_build/bar.c +subdir_build/baz.c +subdir_build/foo.c +subdir_build/foobar.h +]) +AT_CHECK([cat subdir_build/debugsources.list | tr '\0' '\n' | sort -u], + [0], [expout], []) +AT_CLEANUP + +# Run find-debuginfo on a small build and check all parts ran +# Same as above, but now with dwz (but without -j) +AT_SETUP([find-debuginfo sources debugdata gdb-index dwz]) +AT_KEYWORDS([find-debuginfo] [sources] [debugdata] [gdb-index] [dwz]) +# At the moment dwz doesn't support .debug_addr +AT_SKIP_IF([test "$DWARF_5_DEBUGADDR" = "yes"]) +FIND_DEBUGINFO_PKG_BUILD_SETUP +# Sanity check the binaries have debug sections +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [0], [ignore], []) +# We need to set some environment variables for running find-debuginfo +# normally set by rpmbuild. +# +# generate .gnu_debugdata (-m), .gdb_index (-i) and run dwz (--run-dwz) +# for binaries in subdir_build. +AT_CHECK([env RPM_BUILD_DIR=${PWD} \ + RPM_BUILD_ROOT=${PWD} \ + RPM_PACKAGE_NAME=pkg \ + RPM_PACKAGE_VERSION=ver \ + RPM_PACKAGE_RELEASE=rel \ + RPM_ARCH=arch \ + find-debuginfo -m -i --run-dwz ${PWD}/subdir_build], + [0], [stdout], []) +# Make sure all three binaries are processed +AT_CHECK([grep "Extracting debug info from 3 files" stdout], [0], [ignore], []) +AT_CHECK([grep "DWARF-compressing 3 files" stdout], [0], [ignore], []) +# debug sections should have been removed +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [1], [ignore], []) +# But they now have a .gnu_debugdata section +AT_CHECK([$READELF -S subdir_build/foo | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep gnu_debugdata], + [0], [ignore], []) +# There are .debug files with those .debug_ sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep debug_], + [0], [ignore], []) +# The .debug files should also have a .gdb_index sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep gdb_index], + [0], [ignore], []) +# There should also be a dwz multi file now +AT_CHECK([test -f usr/lib/debug/.dwz/pkg-ver-rel.arch], [0], [], []) +# Check all sources are listed in debugsources.list +AT_DATA([expout], +[subdir_build/ +subdir_build/bar.c +subdir_build/baz.c +subdir_build/foo.c +subdir_build/foobar.h +]) +AT_CHECK([cat subdir_build/debugsources.list | tr '\0' '\n' | sort -u], + [0], [expout], []) +AT_CLEANUP + +# Run find-debuginfo on a small build and check all parts ran +# Same as above plus doing -j jobs +AT_SETUP([find-debuginfo sources debugdata gdb-index dwz jobs]) +AT_KEYWORDS([find-debuginfo] [sources] [debugdata] [gdb-index] [dwz] [jobs]) +# At the moment dwz doesn't support .debug_addr +AT_SKIP_IF([test "$DWARF_5_DEBUGADDR" = "yes"]) +FIND_DEBUGINFO_PKG_BUILD_SETUP +# Sanity check the binaries have debug sections +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [0], [ignore], []) +# We need to set some environment variables for running find-debuginfo +# normally set by rpmbuild. +# +# generate .gnu_debugdata (-m), .gdb_index (-i) and run dwz (--run-dwz) +# in parallel (-j6) for binaries in subdir_build. +AT_CHECK([env RPM_BUILD_DIR=${PWD} \ + RPM_BUILD_ROOT=${PWD} \ + RPM_PACKAGE_NAME=pkg \ + RPM_PACKAGE_VERSION=ver \ + RPM_PACKAGE_RELEASE=rel \ + RPM_ARCH=arch \ + find-debuginfo -m -i --run-dwz -j6 ${PWD}/subdir_build], + [0], [stdout], []) +# Make sure all three binaries are processed +AT_CHECK([grep "Extracting debug info from 3 files" stdout], [0], [ignore], []) +AT_CHECK([grep "DWARF-compressing 3 files" stdout], [0], [ignore], []) +# debug sections should have been removed +AT_CHECK([$READELF -S subdir_build/foo | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep debug_], [1], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep debug_], [1], [ignore], []) +# But they now have a .gnu_debugdata section +AT_CHECK([$READELF -S subdir_build/foo | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/bar | grep gnu_debugdata], + [0], [ignore], []) +AT_CHECK([$READELF -S subdir_build/baz | grep gnu_debugdata], + [0], [ignore], []) +# There are .debug files with those .debug_ sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep debug_], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep debug_], + [0], [ignore], []) +# The .debug files should also have a .gdb_index sections +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/foo.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/bar.debug | grep gdb_index], + [0], [ignore], []) +AT_CHECK([$READELF -S usr/lib/debug/subdir_build/baz.debug | grep gdb_index], + [0], [ignore], []) +# There should also be a dwz multi file now +AT_CHECK([test -f usr/lib/debug/.dwz/pkg-ver-rel.arch], [0], [], []) +# Check all sources are listed in debugsources.list +AT_DATA([expout], +[subdir_build/ +subdir_build/bar.c +subdir_build/baz.c +subdir_build/foo.c +subdir_build/foobar.h +]) +AT_CHECK([cat subdir_build/debugsources.list | tr '\0' '\n' | sort -u], + [0], [expout], []) +AT_CLEANUP diff --git a/tests/testsuite.at b/tests/testsuite.at index baf7ca2c81c6..d7027f0039d5 100644 --- a/tests/testsuite.at +++ b/tests/testsuite.at @@ -10,3 +10,4 @@ AT_INIT AT_TESTED([debugedit]) m4_include([debugedit.at]) +m4_include([find-debuginfo.at]) -- 2.49.0