Target с отладочной
Это простейший метод для работы, и он особенно полезен при разработке одной конкретной разделяемой библиотеки.
Первая копия тест исполняемый файл и разделяемые библиотеки к цели с отладочную информацию:
Тогда на цель:
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 это самая надежная вещь.
Целевая задача gdbserver
7.12-6, принимающая сторона arm-linux-gnueabihf-gdb
7.6.1 из Линаро.
Целевых библиотеки без отладочных символов
Распространено раздеться целевыми библиотеками перед развертыванием на встроенных целях, так как отладочная информация делает их пути больше.
Например, 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
поиск общих библиотек на целевом корне /
по умолчанию.
Посмотрите, если эта статья поможет: http://www.fayewilliams.com/2013/01/31/gdb-unable-to-find-dynamic-linker-breakpoint-function/ –