尽管安装了 debuginfo,但 GDB 不显示行号信息
Posted
技术标签:
【中文标题】尽管安装了 debuginfo,但 GDB 不显示行号信息【英文标题】:GDB is not showing line number information although debuginfo is installed 【发布时间】:2014-04-24 12:53:33 【问题描述】:我正在尝试调试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】:确认 libgcov.a 库没有使用调试符号构建后,我已经安装了 debuginfo 包
您似乎不了解 debuginfo 包的工作原理。他们不能神奇地将 debuginfo 添加到没有调试符号(或被剥离的符号)构建的存档库中。
通常的构建流程是:
用-g
构建一切
为所有完全链接二进制文件(可执行文件和共享库)准备单独的调试信息包
去除完全链接二进制文件(但不包括存档库)
这允许二进制文件和共享库变小,但在安装 debuginfo 包后仍可调试。
显然,在 SLES10 上,“但不是存档库”没有得到尊重,libgcov.a
也被剥夺了。由于单独的 debuginfo 包不适用于存档库,因此您无法取回该信息。您唯一的选择是从源代码重建 GCC。
附:他们为什么要剥离libgcov.a
?
这是一种权衡:最终用户链接的二进制文件会更小,但libgcov.a
中的代码将无法调试。
由于大多数最终用户从不调试 libgcov.a
,我认为这不是不合理的权衡。
【讨论】:
感谢您的信息。虽然看起来很明显,但请澄清这一点:对于静态库,调试符号在链接可执行文件的机器上很重要,而不是在运行 exe 的机器上,对吗?程序运行时机器是否有带调试符号的静态库都没有关系。 @ernesto 这是正确的:存档库被复制到在静态链接(构建)时链接到它的二进制文件中。归档库在运行时根本不使用,并且不需要存在。以上是关于尽管安装了 debuginfo,但 GDB 不显示行号信息的主要内容,如果未能解决你的问题,请参考以下文章
gdb 调试报Missing separate debuginfos 问题解决
gdb调试报错:Missing separate debuginfos
gdb调试报错:Missing separate debuginfos
gdb调试时的问题Missing separate debuginfos use debuginfo-install
gdb调试时的问题Missing separate debuginfos, use: debuginfo-install glibc-XXX