Вопрос по linux, gdb, ldd, libc – Как использовать отладочную версию libc

51

Short version of question: Как я могу заставить GDB использовать символы отладки для libc?

Longer version: Я отлаживаю программу с помощью 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, ценится.

Ваш Ответ

2   ответа
65

ug/lib. I tried setting my LD_LIBRARY_PATH variable to have this at the front of the path but that did not seem to make a difference.

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

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

Файлы в/usr/lib/debug родом изlibc6-dbg пакет, и GDB загрузит ихautomatically, пока они соответствуют вашей установленной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 ...

Обновить:

For instance I see
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".
Error: User Rate Limit Exceeded/usr/lib/debugError: User Rate Limit ExceededReading symbols from /lib/libc.so.6...(no debugging symbols found)...done.Error: User Rate Limit Exceeded Gabriel Southern
Error: User Rate Limit Exceeded
Error: User Rate Limit ExceededdirectoryError: User Rate Limit ExceededdebuildError: User Rate Limit Exceeded
Error: User Rate Limit Exceededdebug-files-directoryError: User Rate Limit Exceeded.gdbinitError: User Rate Limit Exceeded Gabriel Southern
16

sudo apt-get install libc6-dbg

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

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

Похожие вопросы