GDB and RPM binaries
Using GDB to examine processes or core files resulting from binaries installed from RPMs presents additional challenges because the binaries usually have the symbol information stripped out. In addition, it is useful to be able to capture core files from an operational system and examine them on another system.
Of course, many of the details of these processes will vary from system to system, but the overall structure of the process should as it is described here.
Debugging information for processes or core files
In most RPMs, the symbol table information has been stripped from the executables and libraries and saved in seperate debugging information files. The debugging information files have names like
sipauthproxy.debug
. When GDB is examining a process or core file, it automatically uses the debugging information file corresponding to the executable.
To install the debugging information files, install the
debug
or
debuginfo
RPMs. These have names like
sipxacd-debug-3.6.3-008212.i386.rpm
, and can be obtained from where you obtain the sipX RPMs.
The debugging information files are installed into directories below
/usr/lib/debug
corresponding to the install location of the binaries and libraries. E.g., the debugging information file for
/usr/bin/sipregistrar
is
/usr/lib/debug/usr/bin/sipregistrar.debug
.
To get GDB to use the debugging information files, you have to tell it the root of the debugging information files:
set debug-file-directory /usr/lib/debug
Capturing core files for later debugging
It is often desirable to save a core file from an operational system to be examined with GDB later on another system. This process works much better than rumor has it, but you have to set GDB up correctly.
To capture the core file, the corresponding binary, and the needed dynamic libraries, use
sipx-snapshot
:
sipx-snapshot --core <core-file-name>
The snapshot file will include the specified core file, its binary, and the dynamic libraries.
Unpack the snapshot file starting at a directory $ROOT. Then use commands like the following to examine the core file:
$ gdb GNU gdb Red Hat Linux (6.5-15.fc6rh) (gdb) set solib-absolute-prefix $ROOT (gdb) file $ROOT/usr/bin/sipregistrar (gdb) core $ROOT/var/log/sipxpbx/core.1234
However, this won't give GDB access to the debugging information that corresponds to the binary.
Debugging information for core files from other systems
In order to give GDB access to the debugging information to match a captured core file, the appropriate debugging information files need to be installed on the debugging system, which will run GDB.
One method is to install the
debug
or
debuginfo
RPMs on the debugging system. In that case, the root of the debugging files is
/usr/lib/debug
.
A second method is to install or unpack (using
rpm2cpio xxx.rpm | cpio -i --make-directories
) the RPMs into some directory, in which case, the root of the debugging files is
usr/lib/debug
relative to the root of the install or unpack.
In either of these cases, remember that the RPMs need to be the ones corresponding to what is installed on the operational system, not RPMs for the debugging system.
A third method, if the debugging files are already installed on the operational system, is to add
--file /usr/lib/debug
to the invocation of
sipx-snapshot
:
sipx-snapshot --core <core-file-name> --file /usr/lib/debug
That option includes all the contents of
/usr/lib/debug
into the snapshot file, and once it is unpacked, the root of the debugging files is
$ROOT/usr/lib/debug
.
Once the debugging files have been installed, symbolic links need to be added to the unpacked snapshot tree to allow GDB to find the debugging information files. Calling the root of the debugging files $DEBUG, execute:
ln -s $DEBUG/usr/bin $ROOT/usr/bin/.debug ln -s $DEBUG/usr/lib $ROOT/usr/lib/.debug
With these links installed, GDB does not need a
set debug-file-directory
command to locate the debugging information files, but rather uses the links.