2014-03-11 2 views
3

Я хотел бы отлаживать приложение Android NDK, точнее - я хочу проверить, какие аргументы ( r4 - r8 r1 - r4 регистры) передаются функции из общей библиотеки в apk.Android: debug shared library

То, что я пробовал:

  • Я запустить gdbserver: 1234 --attach на устройстве
  • Я запустить руку-Linux-androideabi-GDB из пакета NDK от Google на ПК
  • Я установил solib-пути поиска и письменного целевой пульт: 1234

до сих пор, так хорошо. Теперь я пытаюсь установить точку останова (break <function name>) (имя функции от objdump), но я получаю ответ: Cannot access memory at address <...>. info shared говорит, что библиотека загружена, означает ли это, что я не могу установить точку останова? Или я делаю что-то неправильно?

+1

Вы понимаете, что регистры r4-r8 являются аргументами _not_ функции в AAPCS? Регистры r0-r3 - это первые 4 аргумента, остальные - в стеке. Цитируйте: «Первые четыре регистра r0-r3 (a1-a4) используются для передачи значений аргументов в подпрограмму и для возврата значения результата из функции. Они также могут использоваться для хранения промежуточных значений в рамках процедуры (но, в общем, только между вызовами подпрограммы) ._ "и" _A подпрограмма должна сохранять содержимое регистров r4-r8, r10, r11 и SP (и r9 в вариантах PCS, которые обозначают r9 как v6) ._ " –

+0

Хорошо, спасибо для информации (я нашел информацию о регистрах r4-r8 где-то в сети), любые идеи о том, как установить функцию останова для работы? – Andy

ответ

2

Скриншот ndk-build делает гораздо больше, чем вы ожидали бы.
Одна из вещей, что копировать как gdbserver, файл с именем gbd.setup и генерируемый .so
в скрытой папке. obj/armei/
Там вам нужно будет добавить библиотеки, которые вы хотели бы отлаживать, потому что символы
ссылаются на них.
Библиотеки копируются с устройства на компьютер с помощью некоторых команд pull-команд adb.
я написал статью о теме по адресу:http://www.professional-android-development.com/articles/android-ndk-large-c-projects
При размещении библиотеки в нужную папку, вы можете установить точки останова.
Тем не менее, по некоторым внутренним причинам они могут потерпеть неудачу.
В этом случае запустите ndk-gdb -start (первая попытка также завершится с ошибкой), принудительно завершите приложение и перезапустите ndk-gdb -start (на этот раз не заставляя приложение закрываться).

+0

Однако могу ли я использовать это, если у меня нет источника? – Andy

+0

Да, если библиотеки, которые вы хотите отлаживать, строятся с помощью отладочных символов. Таким образом, это зависит от того, как была скомпилирована общая библиотека (опция -g).Если это библиотека из AOSP, вы можете попробовать ее самостоятельно, но для этого потребуется встроенный смартфон и установка библиотеки в нужном месте. Если это третья сторона - библиотека, к которой у вас нет доступа, вы можете обратиться за поддержкой, если доступна отладочная версия библиотеки. – Peter

0

«Невозможно получить доступ к памяти по адресу < ...>» обычно означает, что существует несоответствие между .so-файлом на вашем ПК и .so-файлом, который находится на Android. Вы перекомпилировали и переустановили?

К тому же, по какой причине вы не используете «ndk-gdb»? Это сценарий (часть NDK), который заботится обо всех деталях gory для вас.

+0

ndk-gdb требует источника, не так ли? – Andy

Смежные вопросы