Как выполнить удаленный сеанс GDB на ПК для ARM GDBserver с интерфейсом GDB GUI? - PullRequest
0 голосов
/ 10 октября 2018

Я использую Ubuntu 16.04 на рабочей станции x86_64, и я кросс-компилирую небольшую демонстрационную программу на C ++ и внедряю ее во встроенную цель Linux с архитектурой ARM (environment-setup-cortexa9hf-neon-poky-linux-gnueabi, arm-poky-linux-gnueabi-g++).

Я могу успешно сделать это, что дает мне сеанс отладки в командной строке:

Цель:

rpm -ivh gdbserver-7.10.1-r0.cortexa9hf_neon.rpm
gdbserver :9091 ${APPNAME}

Хост:

sudo apt-get install gdb-multiarch

gdb-multiarch $APPNAME

target remote 192.168.0.212:9091

...Теперь я могу использовать gdb-multiarch в командной строке!

Однако отсюда ... Я действительно хочу иметь возможность использовать один из многих gdb инструментов внешнего интерфейса, чтобы предоставить графический интерфейс для установки точек останова и выполнения шаговкод (сродни gdbgui или с использованием vscode и настройкой для отладчика).Существуют ли какие-либо gdb инструменты внешнего интерфейса, которые специально поддерживают gdb-multiarch?

Любой инструмент, который я пробую, я считаю, что независимо от того, что он использует исполняемый файл base gdb и выдает эту ошибку из-за несоответствующей архитектуры:

    target remote 192.168.0.212:9091
Remote debugging using 192.168.0.212:9091
warning: Architecture rejected target-supplied description
Remote 'g' packet reply is too long: 0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070fdff7e00000000c0fafc76100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000

ОБНОВЛЕНИЕ 1 -

Я могу вроде как заставить это работать, используя инструмент ddd:

ddd --eval-command="target remote $MY_TARGET_IP:9091" --debugger gdb-multiarch

Однако!Это древний и глючный код, и я не могу установить точки останова в загруженных .so прямо сейчас с этим.

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

https://github.com/cs01/gdbgui/issues/237

1 Ответ

0 голосов
/ 12 октября 2018

Я нашел способ, используя gdbgui, но мне потребовалось пересобрать GDB из исходного кода в соответствии с моей конкретной архитектурой удаленного назначения.Детали того, как я заставил это работать, здесь:

https://github.com/cs01/gdbgui/issues/237

Важные биты в случае разрыва вышеупомянутой ссылки: TLDR Решение:

Я пытался положиться напредварительно собранный gdb-multiarch из репозиториев Ubuntu apt, который не работал.Когда я решил скачать gdb и пересобрать из исходного кода при настройке целевой арки arm-linux-gnuabi.

Метод сборки:

скачал последний исходный код gdb

распаковать его,перейдите в папку и создайте ее следующим образом:

./configure  --host=x86_64-pc-linux-gnu --build=x86_64-pc-linux-gnu --target=arm-linux-gnuabi && make -j8 && sudo make install

Важно отметить, что для моего конкретного удаленного сервера GDB он работает на ARM, поэтому мне пришлось сказать target=arm-linux-gnuabi в конфигурации.GDB строит для моего ПК x86 arch, но при отладке он знает, что распознает цель как ARM!

Теперь arm-linux-gnuabi-gdb по умолчанию установлен в /usr/local/bin ... но вы можете вместо этого предоставить prefix=<path> туда, куда вы хотите установить его в сценарии ./configure, указанном выше.

Используя это, я смог создать вторичную копию gdb с именем arm-linux-gnuabi-gdb, которую я мог бы передать gdbgui следующим образом:

gdbgui -g arm-linux-gnuabi-gdb

Оттуда я могу дать команды GDB для подключения к моему удаленному GDB-серверу.Я должен заранее установить контрольные точки.Мои gdb команды похожи на эти, чтобы установить несколько точек останова:

set breakpoint pending on
break my_object.cpp:<line number for breakpoint>
b example_function_name
target remote <remote arm machine IP>:<gdbserver port>
c

Отлично работает!Это намного лучше, чем запуск gdb в командной строке на моей удаленной цели.

...