Как использовать отладочную версию 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