With the help of a unique identifier that is stored in every binary executable matching the executable, a coredump and the corresponding debuginfo together becomes really easy. You don’t need to know the package name and the version-release string to download and install the correct debuginfo package. This is achieved by extending the linker, some additional tools and the package management itself.
The build id is a unique identifier stored in the .note.gnu.build-id note section of the executable file and loaded into the process image during run-time. Different means to compute the unique identifier are supported although the default setting is to use a 20 byte SHA1 hash of the unstripped executable (see ld linker documentation for further information about the –build-id option).
To be able to read the build id from a core dump the kernel must include the ELF header pages in file-backed private memory areas (see documentation on /proc/<pid>/coredump_filter). This is the default setting on recent openSUSE kernel versions.
Different tools can be used to print out the build-id. eu-readelf (from the elfutils package) prints the contents of the note sections given the -n option in a human readable fashion. pbuildid (from the ptools package) is prints the build-id from executables and from core files including the build-id of all loaded shared objects during the crash.
Now, zypper can be asked to install the debuginfo package that provides the debuginfo for the given build-id.
# zypper install -C "debuginfo(build-id)=b75bab63c9a25eb13264bb95f1fef190e157f865" Loading repository data... Reading installed packages... Resolving package dependencies... The following NEW package is going to be installed: bash-debuginfo Overall download size: 605.0 K. After the operation, additional 2.1 M will be used. Continue? [YES/no]: yes Retrieving package bash-debuginfo-3.2-148.2.x86_64 (1/1), 605.0 K (2.1 M unpacked) Retrieving: bash-debuginfo-3.2-148.2.x86_64.rpm [done] Installing: bash-debuginfo-3.2-148.2 [done] #
If you are really lazy you can call the following script to do the job for you:
#!/bin/bash # # Sample script how to install debuginfo packages by build-id # IDS='' for f in "$*"; do case "$(file -L $f)" in *ELF*) IDS+="$(pbuildid $f 2>/dev/null | awk '{print $NF}') " ;; *) ;; esac done echo "Install Debuginfo for following build-ids: $IDS" CMDLINE="" for i in $IDS; do CMDLINE+="debuginfo(build-id)=$i " done echo $CMDLINE | xargs zypper install -C
Both comments and pings are currently closed.