Удаленная отладка совместно используемых библиотек с помощью gdb / gdbserver
-
18-09-2019 - |
Вопрос
Мой вопрос касается удаленной отладки приложения на встроенном процессоре arm с использованием gdb / gdbserver.
Я могу отладить само приложение, но приложение динамически подключается к общей библиотеке, которая реализует собственный протокол связи.Я хочу иметь возможность устанавливать точки останова в функциях общей библиотеки, поэтому попробуйте разобраться с некоторыми проблемами обнаружения устройств.
Я убедился, что библиотека скомпилирована с отладочными символами и загружается gdb на стороне хоста, я могу перечислить функции в библиотеке и даже установить точки останова, но как только я пытаюсь запустить приложение, я получаю сообщение об ошибке следующего вида:
Cannot insert breakpoint X.
Error accessing memory address : Input/output error.
где X - номер точки останова в gdb и адрес, который слишком мал, чтобы быть действительным.
Я использую новую библиотеку как на целевом, так и на хост-компьютере, но через mount -o bind newlib oldlib
на целевом объекте с помощью монтирования nfs.
У кого-нибудь есть идея о том, что может быть не так?Заранее благодарю.
Решение
Дикое предположение:вы загрузили общую библиотеку в host GDB
по неправильному адресу.
Вместо явной загрузки его в GDB используйте "set stop-on-solib-event on"
, дождитесь загрузки библиотеки (info shared
сообщит вам текущий список загруженных библиотек), и тогда установите точки останова.
Другие советы
Я вижу, что этот вопрос относится к 2009 году, но текущие ответы устарели, так что вот обновление:
@Employed Russian предположил, что вы должны использовать stop-on-solib-event
.Это уже не так;NDK r8d поддерживает ожидающие точки останова в еще не загруженных файлах solibs.
@Брент Пидди говорит , что stop-on-solib-event
не работает с gdbserver.Это также больше не соответствует действительности, по крайней мере, с r8c.У моей компании есть продукт, который полагается на это поведение NDK от GDB, без него у нас были бы большие проблемы.
Используйте следующую команду, чтобы установить ожидающие точки останова, которые будут устранены после загрузки библиотеки общих объектов
set breakpoint pending on
К сожалению, вы не можете использовать "set stop-on-solib-event on" для удаленной отладки gdbserver, поскольку gdbserver не распознает / не отправляет события solib.Мне пришлось просто ввести команду set solib-search-path или set sysroot, чтобы заставить gdb загрузить все символы общей библиотеки после нажатия точки останова в main.
Подбежать к main
а потом set solib-search-path .
В противном случае, gdbserver
останавливается в динамическом загрузчике, перед загрузкой библиотек.В main
, они должны быть готовы к GDB.
Более подробная информация: Отладка совместно используемых библиотек с помощью gdbserver