Подтвердить что ты не робот

Как заставить ndk-gdb работать на Android?

Я пытаюсь заставить отладчик NDK работать, но без успеха.

Чтобы убедиться, что мои отладочные символы присутствуют и действительны, я использую параметры компилятора -O0 и -g, а параметр ndk-build NDK_DEBUG = 1.

ndk-gdb script запускается без проблем и запускает GDB. Когда команда "sharedlibrary", я получаю следующее:

Symbols already loaded for /bla/bla/libMySharedLib.so

Однако, когда я пытаюсь нарушить выполнение или, например, добавив segfault для тестирования, я никогда не получаю никаких символов из этой библиотеки в стеке вызовов. Единственные символы, которые я получил, - это libc, если я нарушаю исполнение, пока он ждет мьютекса, например. Также попытался добавить точки останова без везения. GDB позволяет мне добавлять точки останова, и код работает нормально, но точки останова никогда не запускаются.

Я использую API-уровень 8, так как мне нужно поддерживать Android 2.2 (Froyo).

4b9b3361

Ответ 1

Вам не нужно использовать переключатели -O0 или -g. Вам нужно сделать следующее:

  • поместите android:debuggable="true" в тег <application> в AndroidManifest.xml файле
  • использовать NDK_DEBUG=1 после ndk-build
  • положить APP_OPTIM := debug в файл Application.mk

Выполнение любой из этих трех вещей будет автоматически использовать переключатели -O0 и -g.

Можете ли вы попробовать запустить gdb вручную, без gdb script? Он включает следующие шаги:

  • нажатие gdbserver файла на папку /data/local на устройстве
  • запустить ваше приложение и вызвать в adb shell следующую команду gdbserver :5055 --attach PID, где PID - это ваш идентификатор процесса приложения.
  • запуск adb forward tcp:5055 tcp:5055 на хосте
  • запуск arm-linux-androideabi-gdb.exe из папки вашего приложения
  • ввод следующих команд в gdb
  • set solib-search-path obj/local/armeabi
  • file obj/local/armeabi/libMySharedLib.so
  • target remote :5055

И посмотрим, сможете ли вы отлаживать его.

Если вы хотите видеть символы для других разделяемых библиотек, которые использует ваша библиотека, например libc.so, затем вытащите их из устройства (из /system/lib) в папку obj/local/armeabi.