51

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

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, ценится.

  • Error: User Rate Limit Exceededdebug-files-directoryError: User Rate Limit Exceeded.gdbinitError: User Rate Limit Exceeded

    от Gabriel Southern
  • Error: User Rate Limit ExceededdirectoryError: User Rate Limit ExceededdebuildError: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • 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
  • 16

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

    sudo apt-get install libc6-dbg
    

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

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

  • 65

    I think that the version of libc with debug symbols is in /usr/lib/deb

    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".