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

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

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

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

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

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

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

Что я делаю не так?

Спасибо за ваше время.

Solutions Collecting From Web of "Как заставить ndk-gdb работать на Android?"

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

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

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

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

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

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

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