Debug - Getting Traces
From ArchWiki
This article will try to give you an idea how to create Arch package. This provides debug and traces information for reporting software bugs (for example after use of Bug-Buddy).
Contents |
Discovering name of package(s)
A few facts of debug messages
When looking at debug message, such as (stripped):
... Backtrace was generated from '/usr/bin/epiphany' (no debugging symbols found) Using host libthread_db library "/lib/libthread_db.so.1". (no debugging symbols found) [Thread debugging using libthread_db enabled] [New Thread -1241265952 (LWP 12630)] (no debugging symbols found) 0xb7f25410 in __kernel_vsyscall () #0 0xb7f25410 in __kernel_vsyscall () #1 0xb741b45b in ?? () from /lib/libpthread.so.0 ...
you can see ?? at the place where debugging info is missing and also the name of library or executable which called the function. Similarly, when the line (no debugging symbols found) appears in a message, it means that you have to look for a file whose name is stated.
Finding package
Use Pacman to retrieve name of package:
# pacman -Qo /lib/libthread_db.so.1 /lib/libthread_db.so.1 is owned by glibc 2.5-8
We have found that package is called glibc in version 2.5-8. By repeating this step, we are able to create a list of packages which we have to compile ourselves to get full stack trace.
Obtaining PKGBUILD
In order to build a package from source, the PKGBUILD file is required. The location from which you can obtain PKGBUILDs is, in general:
Using AUR
Use AUR search page to find the package. If it is not present, the package is stored in one of the official repository trees of Arch Linux. If found, click on its name and download the Tarball. Store it in location of your choice. Use tar
to extract it and change directory:
$ tar xvzf name_of_tarball.tar.gz $ cd name_of_tarball
Using ABS
If the package is a part of official tree, install ABS and use the <copy>abs</copy> command to obtain a copy of the directory structure:
# abs
Use find
or slocate locate
commands to find the package name:
$ find /var/abs -name "glibc"
or
$ slocate glibc | grep ^/var/abs
In any case, you'll find that package foo is part of extra
and multimedia
(for example). Copy foo's PKGBUILD
file to /var/abs/local/foo
:
$ cp -r /var/abs/extra/multimedia/foo /var/abs/local/foo $ cd /var/abs/local/foo
Note that this example assumes that you have created /var/abs/local
to build your packages in and that this directory is writeable by your non-root user account. This is merely a convention that a lot of arch users prefer. For alternatives, See ABS#Create_a_Build_Directory.
Compilation settings
At this stage, you can modify the global configuration file of makepkg
if you will be using it only for debug purposes. In other cases, you should modify package's PKGBUILD file only for each package you would like to rebuild.
Global settings
Modify makepkg
's configuration file /etc/makepkg.conf
to contain following lines:
CFLAGS="-g -march=i686 -O2 -pipe" CXXFLAGS="-g -march=i686 -O2 -pipe"
and
OPTIONS=(!strip !docs libtool emptydirs)
These settings (in bold) will force compilation with debugging information and will disable stripping of executable.
One package settings only
Modify foo
's PKGBUILD file to contain the following lines:
options=(!strip)
Into the build()
function, add following lines at the very beginning:
export CFLAGS="$CFLAGS -g" export CXXFLAGS="$CXXFLAGS -g"
Building and installing the package
Build the package from source using makepkg
while in the PKGBUILD's directory. This could take some time:
# makepkg
Then install the built package:
# pacman -U glibc-2.5-8-i686.pkg.tar.gz
Conclusion
Use the completed stack trace to inform developers of the bug you have discovered before. This will be highly appreciated by them and will help to improve your favorite program.