尽管安装了debuginfo,但GDB未显示行号信息

时间:2014-04-24 12:53:33

标签: linux gcc gdb opensuse gcov

我正在尝试调试gcov代码。我写了一个简单的C程序,它调用__gcov_flush()方法,它是gcc / gcov的一部分。

在确认没有使用调试符号构建libgcov.a库之后,我在我的机器上安装了gcc的debuginfo包(SLES 10)。

# gcc -v
Using built-in specs.
Target: x86_64-suse-linux
Configured with: ../configure --enable-threads=posix --prefix=/usr --with-local-prefix=/usr/local --infodir=/usr/share/info --mandir=/usr/share/man --libdir=/usr/lib64 --libexecdir=/usr/lib64 --enable-languages=c,c++,objc,fortran,obj-c++,java,ada --enable-checking=release --with-gxx-include-dir=/usr/include/c++/4.1.2 --enable-ssp --disable-libssp --disable-libgcj --with-slibdir=/lib64 --with-system-zlib --enable-shared --enable-__cxa_atexit --enable-libstdcxx-allocator=new --program-suffix= --enable-version-specific-runtime-libs --without-system-libunwind --with-cpu=generic --host=x86_64-suse-linux
Thread model: posix
gcc version 4.1.2 20070115 (SUSE Linux)


# rpm -qi gcc-debuginfo-4.1.2_20070115-0.29.6.x86_64
Name        : gcc-debuginfo                Relocations: (not relocatable)
Version     : 4.1.2_20070115                    Vendor: SUSE LINUX Products GmbH, Nuernberg, Germany
Release     : 0.29.6                        Build Date: Sat Sep  5 03:04:50 2009
Install Date: Thu Apr 24 05:25:32 2014      Build Host: bingen
Group       : Development/Debug             Source RPM: gcc-4.1.2_20070115-0.29.6.src.rpm
Size        : 251823743                        License: GPL v2 or later
Signature   : DSA/SHA1, Sat Sep  5 03:06:59 2009, Key ID a84edae89c800aca
Packager    : http://bugs.opensuse.org
URL         : http://gcc.gnu.org/
Summary     : Debug information for package gcc
Description :
This package provides debug information for package gcc.
Debug information is useful when developing applications that use this
package or when debugging this package.
Distribution: SUSE Linux Enterprise 10


/usr/lib/debug/usr/bin # ls -lrt gcov.debug
-rw-r--r-- 1 root root 94216 Sep  5  2009 gcov.debug

但是,即使安装了正确版本的debuginfo(gcov.debug)软件包,GDB仍然无法识别行号信息,它只是将控件传递给下一行而不报告行号(或插入函数)

(gdb)s
26            i++;
(gdb)s
27            __gcov_flush();
(gdb)s
28            printf("%d",i);
(gdb)
(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/lib/debug".

为什么GDB无法识别gcov的行号信息?如果我没有为gcc / gcov安装正确版本的debuginfo软件包,如何确认?

1 个答案:

答案 0 :(得分:1)

  

在确认没有使用调试符号构建libgcov.a库之后,我安装了debuginfo包

您似乎不了解debuginfo包的工作原理。他们不能将debuginfo神奇地添加到没有调试符号(或者被剥离的符号)构建的归档库中。

通常的构建流程是:

  • 使用-g
  • 构建所有内容
  • 为所有完全链接的二进制文件(可执行文件和共享库)准备单独的debuginfo包
  • strip 完全链接的二进制文件(但不是归档库)

这允许二进制文件和共享库很小,但在安装debuginfo包之后仍然可以调试。

显然,在SLES10上,"但不是归档库"没有被尊重,libgcov.a也被剥夺了。由于单独的debuginfo包不适用于归档库,因此您无法获取该信息。您唯一的选择是从源代码重建GCC。

P.S。他们为什么要剥离libgcov.a

这是一个权衡:最终用户链接的二进制文件会更小,但libgcov.a中的代码将无法调试。

由于大多数最终用户从不调试libgcov.a,我说这不是一种不合理的权衡。