Удаленная отладка совместно используемых библиотек с помощью gdb / gdbserver

StackOverflow https://stackoverflow.com/questions/1689602

Вопрос

Мой вопрос касается удаленной отладки приложения на встроенном процессоре 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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top