GDB не показывает информацию о номере строки, хотя debuginfo установлен

Я пытаюсь отладить gcov код. Я написал простую программу на C, которая вызывает метод __gcov_flush(), который является частью gcc / gcov.

Убедившись, что библиотека libgcov.a не была построена с символами отладки, я установил пакеты debuginfo для gcc на свой компьютер (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? Если я не установил нужную версию пакетов debuginfo для gcc / gcov, как это подтвердить?


person ernesto    schedule 24.04.2014    source источник


Ответы (1)


Убедившись, что библиотека libgcov.a не была построена с отладочными символами, я установил пакеты debuginfo.

Похоже, вы не понимаете, как работают пакеты debuginfo. Они не могут волшебным образом добавить debuginfo в архивную библиотеку, которая была построена без символов отладки (или была удалена).

Обычный процесс сборки:

  • построить все с -g
  • подготовить отдельные пакеты debuginfo для всех полностью связанных двоичных файлов (исполняемых файлов и общих библиотек)
  • удалить полностью связанные двоичные файлы (но не архивные библиотеки)

Это позволяет бинарным файлам и разделяемым библиотекам быть небольшими, но при этом их можно отлаживать после установки пакета debuginfo.

Судя по всему, на SLES10 "но не архивные библиотеки" не соблюдались, и libgcov.a тоже были удалены. Поскольку отдельные пакеты debuginfo не работают для архивных библиотек, вы не можете получить эту информацию обратно. Ваш единственный вариант - перестроить GCC из исходников.

P.S. Зачем им раздевать libgcov.a?

Это компромисс: двоичные файлы, на которые ссылаются конечные пользователи, будут меньше, но код в libgcov.a не будет отлаживаемым.

Поскольку большинство конечных пользователей никогда не отлаживают libgcov.a, я бы сказал, что это не было необоснованным компромиссом.

person Employed Russian    schedule 24.04.2014
comment
Спасибо за информацию. Хотя это кажется очевидным, пожалуйста, проясните это: в случае статических библиотек символы отладки будут иметь значение на машине, на которой скомпонован исполняемый файл, а не на машине, на которой запущен exe, верно? Во время работы программы не имеет значения, есть ли на машине статическая библиотека с отладочными символами. - person ernesto; 28.04.2014
comment
@ernesto Это правильно: архивная библиотека копируется в двоичный файл, который связан с ней во время статической ссылки (сборки). Библиотека архива не используется во время выполнения вообще, и в ней нет необходимости. - person Employed Russian; 28.04.2014