Отладка общих библиотек с помощью gdbserver - PullRequest
6 голосов
/ 23 декабря 2011

Я использую gdbserver для цели и IDS CodeSourcery.Мое оборудование - gumstix с omap3530.

Я могу пройти по коду в моем основном приложении, но если я пытаюсь войти в функцию в общей библиотеке, я получаю адрес памяти, и отладчик завершает работу.

Это моя библиотека, которая скомпилирована и скопирована в папку / lib на целевой системе (в ней есть символы отладки). Я попытался использовать файл .gbdinit для установки solib-absolute-prefix / lib

Вот предупреждения из трассировки GDB:

903,056 13-gdb-set sysroot-on-target /lib
903,065 13^done
903,065 (gdb) 
903,065 14-target-select remote 192.168.1.101:2345
903,114 =thread-group-started,id="i1",pid="42000"
903,114 =thread-created,id="1",group-id="i1"
903,115 15-list-thread-groups --available
903,120 16-list-thread-groups
903,128 &"warning: Unable to find dynamic linker breakpoint function.\nGDB will be unable to debug shared library initializers\nand track explicitly loaded dynamic code."
903,128 &"\n"

Что приводит к

903,395 &"Error while mapping shared library sections:\n"
903,397 &"/lib/libCoreLib.so: Invalid argument.\n"
903,399 =library-loaded,id="/lib/libCoreLib.so",target-name="/lib/libCoreLib.so",hostname="/lib/libCoreLib.so",low-address="0x0",high-address="0x0",symbols-loaded="0",thread-group="i1"

Ответы [ 4 ]

4 голосов
/ 23 декабря 2011

Вы можете выполнять отладку с помощью библиотеки, установленной на вашем хосте, при условии, что машина отладки также является машиной разработки.В этом случае вы используете set sysroot вместо set sysroot-on-target.Например:

set sysroot /home/username/.../rootfs/

, где /home/username/.../rootfs/ содержит копию вашей целевой файловой системы

Я думаю, вам также следует указать / вместо /lib

1 голос

Цель с символами отладки

Это самый простой способ начать работу, и он особенно полезен при разработке одной конкретной общей библиотеки.

Сначала скопируйте исполняемый файл теста и совместно используемую библиотеку в целевую с отладочной информацией:

Затем на цель:

gdbserver --multi :1234 ./executable_name

Ведущий:

arm-linux-gnueabihf-gdb -q -nh \
  -ex "target extended-remote target-hostname-or-ip:1234" \
  -ex "file ./executable_name" \
  -ex 'tb main' \
  -ex 'c' \
  -ex 'set solib-search-path .'

sharedlibrary libmylib.so тоже работает.

Проблема, с которой я столкнулся, заключалась в том, что gdbserver останавливается в динамическом загрузчике до main, и динамические библиотеки еще не загружены в этот момент, и поэтому GDB еще не знает, куда символы попадут в память.

GDB, похоже, имеет некоторые механизмы для автоматической загрузки символов совместно используемой библиотеки, и если я компилирую для хоста и запускаю gdbserver локально, запуск до main не требуется. Но для цели ARM это самое надежное.

Target gdbserver 7.12-6, хост arm-linux-gnueabihf-gdb 7.6.1 от Linaro.

Целевые библиотеки без символов отладки

Распространение целевых библиотек перед развертыванием на встроенных целях является обычным явлением, поскольку отладочная информация делает их способными больше.

Например, Buildroot делает это по умолчанию, но вы можете отключить его с помощью BR2_STRIP_none=y.

Вы можете определить этот сценарий, выполнив:

info shared

Который показывает что-то вроде:

From                To                  Syms Read   Shared Object Library
0x00007ffff7df7f90  0x00007ffff7dfcdd7  Yes (*)     target:/lib/ld64-uClibc.so.0
0x00007ffff7b3a9b0  0x00007ffff7bbe05d  Yes (*)     target:/lib/libc.so.0
(*): Shared library is missing debugging information.

поэтому для обеих библиотек есть звездочки (*), в которых говорится, что отладочная информация отсутствует.

Если это так, то вы должны указать GDB использовать совместно используемые библиотеки на хосте до того, как они будут удалены.

Например, Buildroot упрощает нам задачу, поскольку он поддерживает каталог staging, в котором находятся общие библиотеки до их удаления, и по тем же относительным путям, что и в целевой папке:

set sysroot buildroot/output/staging/

Когда эта опция установлена, gdb сразу ищет библиотеки в хосте вместо цели и находит /lib/libc.so.0 по пути buildroot/output/staging/ + /lib/libc.so.0:

Reading symbols from buildroot/output/staging/lib/ld64-uClibc.so.0...done.
Reading symbols from buildroot/output/staging/lib/libc.so.0...done.

TODO: Я не думаю, что вы можете установить более одного sysroot, поэтому все ваши общие библиотеки должны быть размещены в правильных относительных путях, как на целевом изображении.

Если вы проверите sysroot по умолчанию, вы увидите:

show sysroot

дать:

target:

, что означает, что gdb ищет общие библиотеки в целевом корне / по умолчанию.

0 голосов
/ 05 ноября 2016

Добрый день,

Если переменная 'debug-file-directory' в GDB установлена ​​неправильно, тогда сообщаемые сообщения об ошибках содержат: предупреждение: невозможно найти функцию точки останова динамического компоновщика.

Корневая файловая система цели находится на моем хост-компьютере по адресу / Opt / рука-Linux-gnueabihf-корневой файловой системы

Следующие две команды помогли мне запустить удаленную отладку через gdbserver с использованием GDB (v7.11.1):

set debug-file-directory /opt/arm-linux-gnueabihf-rootfs/usr/lib/debug
set sysroot /opt/arm-linux-gnueabihf-rootfs

Я заметил, что если у 'sysroot' есть косая черта в пути, тогда GDB не сможет его использовать. Вы увидите это (неверный вывод) после подключения к удаленной цели:

Reading /lib/ld-linux-armhf.so.3 from remote target...

или

Reading symbols from /opt/arm-linux-gnueabihf-rootfs/lib/ld-linux-
armhf.so.3...(no debugging symbols found)...done

вместо правильного вывода:

Reading symbols from /opt/arm-linux-gnueabihf-rootfs/lib/ld-linux-
armhf.so.3...
Reading symbols from /opt/arm-linux-gnueabihf-rootfs/usr/lib/debug/
lib/arm-linux-gnueabihf/ld-2.23.so...done.

С уважением, Фрикки Тирион

0 голосов
/ 09 июля 2014

Подобная проблема возникла при отладке. Отладка зависала. Конфигурация выглядит следующим образом

Хост : Ubuntu 12.04LTS

IDE : Eclipse Kepler

Цель : Beaglebone Black / ARM A8

ОС : Ангстрем

Решение

Обновление библиотек и включает в себя

Выберите свойства для проекта в Eclipse

  • C / C ++ Общие> Пути и символы> (включая вкладку) GNU C> Добавить> Файлы системы> /> usr Изменение из / usr / lib / gcc / i686-linux-gnu / 4/6 / include в / usr / arm-linux-gnueabi / include

  • C / C ++ Общие> Пути и символы> (включая TAB) GNU C ++> Добавить>
    Файловые системы> /> usr /usr/arm-linux-gnueabi/include/c++/4.6.3/arm-linux-gnueabi

  • C / C ++ Общие> Пути и символы> (вкладка "Пути к библиотекам")> Добавить> Файлы системы> /> usr / usr / arm-linux-gnueabi / lib

...