Как использовать отладочную версию libc

Короткий вариант вопроса: Как я могу получить gdb для использования отладочных символов для libc?

Более длинная версия: Я отлаживаю программу с gdb, и я хочу видеть информацию о futex, используемом libc. Однако в какой-то момент во время отладки я получаю вывод, например:

Catchpoint 2 (call to syscall futex), 0x00007ffff772b73e in ?? () from /lib/libc.so.6
(gdb) bt
#0  0x00007ffff772b73e in ?? () from /lib/libc.so.6
#1  0x00007ffff767fb90 in ?? () from /lib/libc.so.6
#2  0x00007ffff767a4c0 in vfprintf () from /lib/libc.so.6
#3  0x00007ffff768565a in printf () from /lib/libc.so.6
....

Когда я запускаю info sharedlibrary в gdb в точке останова, я вижу:

(gdb) info sharedlibrary
From                To                  Syms Read   Shared Object Library
0x00007ffff7dddaf0  0x00007ffff7df6704  Yes (*)     /lib64/ld-linux-x86-64.so.2
0x00007ffff7bc53e0  0x00007ffff7bd1388  Yes (*)     /lib/libpthread.so.0
0x00007ffff79ba190  0x00007ffff79bd7d8  Yes (*)     /lib/librt.so.1
0x00007ffff76538c0  0x00007ffff7766c60  Yes (*)     /lib/libc.so.6
0x00007ffff6c1fd80  0x00007ffff6c303c8  Yes (*)     /lib/libgcc_s.so.1
(*): Shared library is missing debugging information.

И когда я запускаю ldd, я вижу:

linux-vdso.so.1 =>  (0x00007ffff7fde000)
libpthread.so.0 => /lib/libpthread.so.0 (0x00007ffff7dbf000)
librt.so.1 => /lib/librt.so.1 (0x00007ffff7bb6000)
libc.so.6 => /lib/libc.so.6 (0x00007ffff7833000)
/lib64/ld-linux-x86-64.so.2 (0x00007ffff7fdf000)

Я использую Ubuntu 10.04, и я думаю, что версия libc с отладочными символами находится в /usr/lib/debug/lib. Я попытался установить мою переменную LD_LIBRARY_PATH, чтобы иметь это в начале пути, но это, похоже, не меняет.

Я не совсем понимаю, как программа выбирает, какие библиотеки загружать, независимо от того, установлена ​​ли она во время выполнения или время компиляции (я вроде предполагаю, что время выполнения, но теперь я не уверен). Так что информация о том, как получить gdb для использования отладочной версии libc, оценена.

Ответ 1

Я думаю, что версия libc с отладочными символами находится в /usr/lib/debug/lib. Я попытался установить свою переменную LD_LIBRARY_PATH, чтобы иметь это в начале пути, но это, похоже, не меняет.

Это не дроиды, которые вы ищете.

Библиотеки в /usr/lib/debug не являются настоящими библиотеками. Скорее, содержат только отладочную информацию, но не содержат разделы .text и .data реального libc.so.6. Вы можете прочитать об отдельных файлах debuginfo здесь.

Файлы в /usr/lib/debug поступают из пакета libc6-dbg, и GDB будет загружать их автоматически, если они соответствуют вашей установленной версии libc6. Если ваши libc6 и libc6-dbg не совпадают, вы должны получить предупреждение от GDB.

Вы можете наблюдать файлы, которые GDB пытается прочитать, установив set verbose on. Вот что вы должны видеть, когда libc6 и libc6-dbg соответствуют:

(gdb) set verbose on
(gdb) run
thread_db_load_search returning 0
Reading symbols from /lib64/ld-linux-x86-64.so.2...Reading symbols from /usr/lib/debug/lib/ld-2.11.1.so...done.
thread_db_load_search returning 0
done.
thread_db_load_search returning 0
Loaded symbols for /lib64/ld-linux-x86-64.so.2
Reading symbols from system-supplied DSO at 0x7ffff7ffb000...done.
WARNING: no debugging symbols found in system-supplied DSO at 0x7ffff7ffb000.
thread_db_load_search returning 0
Reading in symbols for dl-debug.c...done.
Reading in symbols for rtld.c...done.
Reading symbols from /lib/librt.so.1...Reading symbols from /usr/lib/debug/lib/librt-2.11.1.so...done.
thread_db_load_search returning 0
... etc ...

Update:

Например, я вижу Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done

Это означает, что ваш GDB не ищет /usr/lib/debug. Один из способов, который может произойти, - установить debug-file-directory в .gdbinit неправильно.

Вот настройка по умолчанию:

(gdb) show debug-file-directory
The directory where separate debug symbols are searched for is "/usr/lib/debug".

Ответ 2

Убедитесь, что вы установили символы отладки для libc:

sudo apt-get install libc6-dbg

И если вы используете x64-систему для отладки кода x86:

sudo apt-get install libc6:i386
sudo apt-get install libc6-dbg:i386