2009-11-06 4 views
3

Мой вопрос заключается в удаленной отладке приложения на встроенном процессоре с использованием gdb/gdbserver.Отладка разделяемых библиотек удаленно с помощью gdb/gdbserver

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

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

Cannot insert breakpoint X.
Error accessing memory address : Input/output error.

где Х точки останова номер в GDB и адрес далеко мал, чтобы быть действительным.
Я использую новую библиотеку как для цели, так и для главной машины, но через mount -o bind newlib oldlib на цель с монтирования nfs.
Есть ли у кого-нибудь представление о том, что может быть неправильным? Спасибо заранее.

+0

Возможный дубликат [Debugging разделяемых библиотек с gdbserver] (https://stackoverflow.com/questions/8611194/debugging-shared-libraries-with-gdbserver) –

ответ

0

Дикая догадка: вы загрузили разделяемую библиотеку на хост GDB по неправильному адресу.

Вместо того, чтобы явно загрузить его в GDB, используйте "set stop-on-solib-event on", ждать библиотеку загружался (info shared покажет Вам текущий список загруженных библиотек), а затем установить точки останова.

0

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

set breakpoint pending on 

К сожалению, вы не можете использовать «установить стоп-на-solib-события на» для gdbserver удаленной отладки поскольку gdbserver не распознает/не отправляет события solib. Мне пришлось просто выдать набор solib-search-path или установить команду sysroot, чтобы получить gdb для загрузки всех символов общей библиотеки после нажатия на точку останова на главном.

6

Я вижу этот вопрос с 2009 года, но в настоящее время ответы устарелый, так вот обновление:

@Employed России предположил, что вы должны использовать stop-on-solib-event. Это уже не так; NDK r8d поддерживает ожидающие точки останова в еще не загружаемых solib.

@Brent Piddy говорит, что stop-on-solib-event не работает с gdbserver. Это также перестает быть истинным, так как по крайней мере r8c. У моей компании есть продукт, который полагается на это поведение NDK от GDB, и без него у нас были бы большие проблемы.

0

Запуск до main и затем set solib-search-path .

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

Подробнее: Debugging shared libraries with gdbserver