Краткая версия вопроса: Как заставить gdb использовать символы отладки для libc?
Более длинная версия: Я отлаживаю программу с помощью gdb и хочу увидеть информацию о фьютексе, используемом 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.